Skip to content

Commit

Permalink
add color when using json
Browse files Browse the repository at this point in the history
  • Loading branch information
charlesneimog committed Jul 30, 2023
1 parent 658984e commit f2dc37f
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 3 deletions.
14 changes: 12 additions & 2 deletions pdfannots/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import pdfminer.settings
import pdfminer.utils

from .types import Page, Outline, AnnotationType, Annotation, Document
from .types import Page, Outline, AnnotationType, Annotation, Document, RGB
from .utils import cleanup_text, decode_datetime

pdfminer.settings.STRICT = False
Expand Down Expand Up @@ -71,6 +71,16 @@ def _mkannotation(
# decode as string, normalise line endings, replace special characters
contents = cleanup_text(pdfminer.utils.decode_text(contents))

color = pa.get('C')


if not (isinstance(color, list) and len(color) == 3 and all(isinstance(e, float) for e in color)):
rgb = RGB(*color)
else:
logger.warning("Invalid color %s in annotation on %s", color, page)
rgb = None


# Rect defines the location of the annotation on the page
rect = pdftypes.resolve1(pa.get('Rect'))

Expand All @@ -94,7 +104,7 @@ def _mkannotation(
created = decode_datetime(createds)

return Annotation(page, annot_type, quadpoints, rect,
contents, author=author, created=created)
contents, author=author, created=created, color=rgb)


def _get_outlines(doc: PDFDocument) -> typ.Iterator[Outline]:
Expand Down
6 changes: 6 additions & 0 deletions pdfannots/printer/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ def annot_to_dict(
if annot.created:
result['created'] = annot.created.strftime('%Y-%m-%dT%H:%M:%S')

if annot.color:
try:
result['color'] = annot.color.ashex()
except:
pass

return result


Expand Down
16 changes: 15 additions & 1 deletion pdfannots/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,8 @@ def __init__(
rect: typ.Optional[BoxCoords] = None,
contents: typ.Optional[str] = None,
author: typ.Optional[str] = None,
created: typ.Optional[datetime.datetime] = None):
created: typ.Optional[datetime.datetime] = None,
color: typ.Optional[RGB] = None): # RGB color expressed as a 3-tuple of floats in [0, 1]

# Construct boxes from quadpoints
boxes = []
Expand All @@ -324,6 +325,7 @@ def __init__(
self.author = author
self.created = created
self.text = []
self.color = color
self.pre_context = None
self.post_context = None
self.boxes = boxes
Expand Down Expand Up @@ -479,3 +481,15 @@ def nearest_outline(
return page.outlines[idx - 1]

return None


class RGB(typ.NamedTuple):
red: float
green: float
blue: float

def ashex(self) -> str:
red_hex = format(int(self.red * 255), '02x')
green_hex = format(int(self.green * 255), '02x')
blue_hex = format(int(self.blue * 255), '02x')
return f"#{str(red_hex)}{str(green_hex)}{(blue_hex)}"

0 comments on commit f2dc37f

Please sign in to comment.