From a14520587942185c9cc70f8e3b7038f361a5ef24 Mon Sep 17 00:00:00 2001 From: chinapandaman Date: Mon, 13 Nov 2023 16:25:12 -0600 Subject: [PATCH 1/6] PPF-403: removed font_size.py --- PyPDFForm/core/filler.py | 4 ++-- PyPDFForm/core/font.py | 39 +++++++++++++++++++++++++++++++- PyPDFForm/core/font_size.py | 44 ------------------------------------- PyPDFForm/core/utils.py | 3 +-- 4 files changed, 41 insertions(+), 49 deletions(-) delete mode 100644 PyPDFForm/core/font_size.py diff --git a/PyPDFForm/core/filler.py b/PyPDFForm/core/filler.py index ab55754f..d594fffa 100644 --- a/PyPDFForm/core/filler.py +++ b/PyPDFForm/core/filler.py @@ -8,7 +8,7 @@ from ..middleware.checkbox import Checkbox from ..middleware.constants import ELEMENT_TYPES from ..middleware.radio import Radio -from . import font_size as font_size_core +from .font import checkbox_radio_font_size from . import template, utils from . import watermark as watermark_core @@ -34,7 +34,7 @@ def fill( needs_to_be_drawn = False if isinstance(elements[key], (Checkbox, Radio)): - font_size = font_size_core.checkbox_radio_font_size(_element) + font_size = checkbox_radio_font_size(_element) _to_draw = utils.checkbox_radio_to_draw(elements[key], font_size) x, y = template.get_draw_checkbox_radio_coordinates(_element, _to_draw) if isinstance(elements[key], Checkbox) and elements[key].value: diff --git a/PyPDFForm/core/font.py b/PyPDFForm/core/font.py index ca8549c6..03702176 100644 --- a/PyPDFForm/core/font.py +++ b/PyPDFForm/core/font.py @@ -3,6 +3,8 @@ import re from io import BytesIO +from typing import Union +from math import sqrt import pdfrw from reportlab.pdfbase import pdfmetrics @@ -10,7 +12,8 @@ from . import constants from .patterns import TEXT_FIELD_APPEARANCE_PATTERNS -from .template import traverse_pattern +from .template import traverse_pattern, is_text_multiline +from .constants import DEFAULT_FONT_SIZE def register_font(font_name: str, ttf_stream: bytes) -> bool: @@ -63,3 +66,37 @@ def auto_detect_font(element: pdfrw.PdfDict) -> str: return font return result + + +def text_field_font_size(element: pdfrw.PdfDict) -> Union[float, int]: + """ + Calculates the font size it should be drawn with + given a text field element. + """ + + if is_text_multiline(element): + return DEFAULT_FONT_SIZE + + height = abs( + float(element[constants.ANNOTATION_RECTANGLE_KEY][1]) + - float(element[constants.ANNOTATION_RECTANGLE_KEY][3]) + ) + + return height * 2 / 3 + + +def checkbox_radio_font_size(element: pdfrw.PdfDict) -> Union[float, int]: + """ + Calculates the font size it should be drawn with + given a checkbox/radio button element. + """ + + area = abs( + float(element[constants.ANNOTATION_RECTANGLE_KEY][0]) + - float(element[constants.ANNOTATION_RECTANGLE_KEY][2]) + ) * abs( + float(element[constants.ANNOTATION_RECTANGLE_KEY][1]) + - float(element[constants.ANNOTATION_RECTANGLE_KEY][3]) + ) + + return sqrt(area) * 72 / 96 diff --git a/PyPDFForm/core/font_size.py b/PyPDFForm/core/font_size.py deleted file mode 100644 index 7b015d3a..00000000 --- a/PyPDFForm/core/font_size.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -"""Contains helpers for calculating font sizes.""" - -from math import sqrt -from typing import Union - -import pdfrw - -from . import constants, template -from .constants import DEFAULT_FONT_SIZE - - -def text_field_font_size(element: pdfrw.PdfDict) -> Union[float, int]: - """ - Calculates the font size it should be drawn with - given a text field element. - """ - - if template.is_text_multiline(element): - return DEFAULT_FONT_SIZE - - height = abs( - float(element[constants.ANNOTATION_RECTANGLE_KEY][1]) - - float(element[constants.ANNOTATION_RECTANGLE_KEY][3]) - ) - - return height * 2 / 3 - - -def checkbox_radio_font_size(element: pdfrw.PdfDict) -> Union[float, int]: - """ - Calculates the font size it should be drawn with - given a checkbox/radio button element. - """ - - area = abs( - float(element[constants.ANNOTATION_RECTANGLE_KEY][0]) - - float(element[constants.ANNOTATION_RECTANGLE_KEY][2]) - ) * abs( - float(element[constants.ANNOTATION_RECTANGLE_KEY][1]) - - float(element[constants.ANNOTATION_RECTANGLE_KEY][3]) - ) - - return sqrt(area) * 72 / 96 diff --git a/PyPDFForm/core/utils.py b/PyPDFForm/core/utils.py index ffb4c240..3e000650 100644 --- a/PyPDFForm/core/utils.py +++ b/PyPDFForm/core/utils.py @@ -13,7 +13,6 @@ from ..middleware.text import Text from . import constants from . import font as font_core -from . import font_size as font_size_core from . import template @@ -49,7 +48,7 @@ def update_text_field_attributes( if elements[key].font_size is None: elements[key].font_size = template.get_text_field_font_size( _element - ) or font_size_core.text_field_font_size(_element) + ) or font_core.text_field_font_size(_element) if elements[key].font_color is None: elements[key].font_color = template.get_text_field_font_color( _element From 464c232121bdf706e59291f574b6d42d8815a0d2 Mon Sep 17 00:00:00 2001 From: chinapandaman Date: Mon, 13 Nov 2023 16:33:17 -0600 Subject: [PATCH 2/6] PPF-403: fix coverage --- PyPDFForm/core/font.py | 2 -- PyPDFForm/core/utils.py | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/PyPDFForm/core/font.py b/PyPDFForm/core/font.py index 03702176..964a3452 100644 --- a/PyPDFForm/core/font.py +++ b/PyPDFForm/core/font.py @@ -65,8 +65,6 @@ def auto_detect_font(element: pdfrw.PdfDict) -> str: if found: return font - return result - def text_field_font_size(element: pdfrw.PdfDict) -> Union[float, int]: """ diff --git a/PyPDFForm/core/utils.py b/PyPDFForm/core/utils.py index 3e000650..c75eaee2 100644 --- a/PyPDFForm/core/utils.py +++ b/PyPDFForm/core/utils.py @@ -12,7 +12,7 @@ from ..middleware.radio import Radio from ..middleware.text import Text from . import constants -from . import font as font_core +from .font import auto_detect_font, text_field_font_size from . import template @@ -44,11 +44,11 @@ def update_text_field_attributes( if isinstance(elements[key], Text): if elements[key].font is None: - elements[key].font = font_core.auto_detect_font(_element) + elements[key].font = auto_detect_font(_element) if elements[key].font_size is None: elements[key].font_size = template.get_text_field_font_size( _element - ) or font_core.text_field_font_size(_element) + ) or text_field_font_size(_element) if elements[key].font_color is None: elements[key].font_color = template.get_text_field_font_color( _element From a2f35ea833cd854c0d32169dfbced220f05ea155 Mon Sep 17 00:00:00 2001 From: chinapandaman Date: Mon, 13 Nov 2023 16:40:03 -0600 Subject: [PATCH 3/6] PPF-403: fix logic --- PyPDFForm/core/font.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/PyPDFForm/core/font.py b/PyPDFForm/core/font.py index 964a3452..ab8b34be 100644 --- a/PyPDFForm/core/font.py +++ b/PyPDFForm/core/font.py @@ -41,15 +41,16 @@ def auto_detect_font(element: pdfrw.PdfDict) -> str: for pattern in TEXT_FIELD_APPEARANCE_PATTERNS: text_appearance = traverse_pattern(pattern, element) - if not text_appearance: - return result + if text_appearance: + break - text_appearance = text_appearance.replace("(", "").replace(")", "").split(" ") + if not text_appearance: + return result - for each in text_appearance: - if not each.startswith("/"): - return result + text_appearance = text_appearance.replace("(", "").replace(")", "").split(" ") + for each in text_appearance: + if each.startswith("/"): text_segments = re.findall("[A-Z][^A-Z]*", each.replace("/", "")) for font in pdfmetrics.standardFonts: @@ -65,6 +66,8 @@ def auto_detect_font(element: pdfrw.PdfDict) -> str: if found: return font + return result + def text_field_font_size(element: pdfrw.PdfDict) -> Union[float, int]: """ From 8eec85228b261ad615ebf16c342e362e81c9ff74 Mon Sep 17 00:00:00 2001 From: chinapandaman Date: Mon, 13 Nov 2023 16:48:04 -0600 Subject: [PATCH 4/6] PPF-403: more refactor --- PyPDFForm/core/template.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PyPDFForm/core/template.py b/PyPDFForm/core/template.py index 16167a7a..f56e043d 100644 --- a/PyPDFForm/core/template.py +++ b/PyPDFForm/core/template.py @@ -234,6 +234,7 @@ def get_dropdown_choices(element: pdfrw.PdfDict) -> Union[Tuple[str], None]: .replace(")", "") for each in choices ) + break return result From d0047d4b2649ae669da29964d8174f2986431438 Mon Sep 17 00:00:00 2001 From: chinapandaman Date: Mon, 13 Nov 2023 16:56:38 -0600 Subject: [PATCH 5/6] PPF-403: re-run coverage From 3dfccc17e68bb6eccb916ba2f2e0cfc8345ee446 Mon Sep 17 00:00:00 2001 From: chinapandaman Date: Mon, 13 Nov 2023 17:00:47 -0600 Subject: [PATCH 6/6] PPF-403: re-trigger build --- PyPDFForm/core/template.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PyPDFForm/core/template.py b/PyPDFForm/core/template.py index f56e043d..a1b5dc6e 100644 --- a/PyPDFForm/core/template.py +++ b/PyPDFForm/core/template.py @@ -199,7 +199,7 @@ def is_text_field_comb(element: pdfrw.PdfDict) -> bool: try: return "{0:b}".format(int(element[constants.FIELD_FLAG_KEY]))[::-1][24] == "1" - except (TypeError, IndexError): + except (IndexError, TypeError): return False @@ -217,7 +217,7 @@ def is_text_multiline(element: pdfrw.PdfDict) -> bool: try: return "{0:b}".format(int(field_flag))[::-1][12] == "1" - except (TypeError, IndexError): + except (IndexError, TypeError): return False