PyPDFForm 2.3.1__tar.gz → 2.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of PyPDFForm might be problematic. Click here for more details.
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PKG-INFO +1 -1
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/__init__.py +1 -1
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/filler.py +6 -11
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/middleware/base.py +0 -1
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/template.py +18 -19
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/watermark.py +3 -5
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/widgets/base.py +4 -5
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/widgets/signature.py +3 -5
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm.egg-info/PKG-INFO +1 -1
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_use_full_widget_name.py +4 -6
- {pypdfform-2.3.1 → pypdfform-2.3.3}/LICENSE +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/adapter.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/constants.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/coordinate.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/font.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/image.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/middleware/__init__.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/middleware/checkbox.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/middleware/dropdown.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/middleware/image.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/middleware/radio.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/middleware/signature.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/middleware/text.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/patterns.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/utils.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/widgets/__init__.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/widgets/bedrock.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/widgets/checkbox.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/widgets/dropdown.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/widgets/image.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/widgets/radio.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/widgets/text.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm/wrapper.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm.egg-info/SOURCES.txt +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm.egg-info/dependency_links.txt +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm.egg-info/requires.txt +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/PyPDFForm.egg-info/top_level.txt +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/README.md +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/pyproject.toml +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/setup.cfg +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_adobe_mode.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_create_widget.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_dropdown.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_dropdown_simple.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_fill_max_length_text_field.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_fill_max_length_text_field_simple.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_fill_method.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_functional.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_functional_simple.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_paragraph.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_paragraph_simple.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_preview.py +0 -0
- {pypdfform-2.3.1 → pypdfform-2.3.3}/tests/test_signature.py +0 -0
|
@@ -34,13 +34,12 @@ from .middleware.image import Image
|
|
|
34
34
|
from .middleware.radio import Radio
|
|
35
35
|
from .middleware.signature import Signature
|
|
36
36
|
from .middleware.text import Text
|
|
37
|
-
from .patterns import (
|
|
38
|
-
|
|
37
|
+
from .patterns import (simple_flatten_generic, simple_flatten_radio,
|
|
38
|
+
simple_update_checkbox_value,
|
|
39
39
|
simple_update_dropdown_value, simple_update_radio_value,
|
|
40
40
|
simple_update_text_value)
|
|
41
|
-
from .template import
|
|
42
|
-
from .utils import
|
|
43
|
-
stream_to_io)
|
|
41
|
+
from .template import get_widget_key, get_widgets_by_page
|
|
42
|
+
from .utils import checkbox_radio_to_draw, stream_to_io
|
|
44
43
|
from .watermark import create_watermarks_and_draw, merge_watermarks_with_pdf
|
|
45
44
|
|
|
46
45
|
|
|
@@ -254,9 +253,7 @@ def fill(
|
|
|
254
253
|
ellipse_borders_to_draw[page] = []
|
|
255
254
|
line_borders_to_draw[page] = []
|
|
256
255
|
for widget_dict in widget_dicts:
|
|
257
|
-
key =
|
|
258
|
-
if use_full_widget_name:
|
|
259
|
-
key = get_widget_full_key(widget_dict)
|
|
256
|
+
key = get_widget_key(widget_dict, use_full_widget_name)
|
|
260
257
|
text_needs_to_be_drawn = False
|
|
261
258
|
to_draw = x = y = None
|
|
262
259
|
|
|
@@ -370,9 +367,7 @@ def simple_fill(
|
|
|
370
367
|
for page in out.pages:
|
|
371
368
|
for annot in page.get(Annots, []):
|
|
372
369
|
annot = cast(DictionaryObject, annot.get_object())
|
|
373
|
-
key =
|
|
374
|
-
annot.get_object(), WIDGET_KEY_PATTERNS, None, str
|
|
375
|
-
)
|
|
370
|
+
key = get_widget_key(annot.get_object(), False)
|
|
376
371
|
|
|
377
372
|
widget = widgets.get(key)
|
|
378
373
|
if widget is None or widget.value is None:
|
|
@@ -60,9 +60,7 @@ def set_character_x_paddings(
|
|
|
60
60
|
|
|
61
61
|
for _widgets in get_widgets_by_page(pdf_stream).values():
|
|
62
62
|
for widget in _widgets:
|
|
63
|
-
key =
|
|
64
|
-
if use_full_widget_name:
|
|
65
|
-
key = get_widget_full_key(widget)
|
|
63
|
+
key = get_widget_key(widget, use_full_widget_name)
|
|
66
64
|
_widget = widgets[key]
|
|
67
65
|
|
|
68
66
|
if isinstance(_widget, Text) and _widget.comb is True:
|
|
@@ -91,11 +89,9 @@ def build_widgets(
|
|
|
91
89
|
|
|
92
90
|
for widgets in get_widgets_by_page(pdf_stream).values():
|
|
93
91
|
for widget in widgets:
|
|
94
|
-
key =
|
|
92
|
+
key = get_widget_key(widget, use_full_widget_name)
|
|
95
93
|
_widget = construct_widget(widget, key)
|
|
96
94
|
if _widget is not None:
|
|
97
|
-
if use_full_widget_name:
|
|
98
|
-
_widget.full_name = get_widget_full_key(widget)
|
|
99
95
|
|
|
100
96
|
_widget.render_widget = render_widgets
|
|
101
97
|
_widget.desc = extract_widget_property(
|
|
@@ -141,8 +137,7 @@ def build_widgets(
|
|
|
141
137
|
continue
|
|
142
138
|
|
|
143
139
|
results[key] = _widget
|
|
144
|
-
|
|
145
|
-
results[_widget.full_name] = results[key]
|
|
140
|
+
|
|
146
141
|
return results
|
|
147
142
|
|
|
148
143
|
|
|
@@ -201,9 +196,7 @@ def update_text_field_attributes(
|
|
|
201
196
|
|
|
202
197
|
for _widgets in get_widgets_by_page(template_stream).values():
|
|
203
198
|
for _widget in _widgets:
|
|
204
|
-
key =
|
|
205
|
-
if use_full_widget_name:
|
|
206
|
-
key = get_widget_full_key(_widget)
|
|
199
|
+
key = get_widget_key(_widget, use_full_widget_name)
|
|
207
200
|
|
|
208
201
|
if isinstance(widgets[key], Text):
|
|
209
202
|
should_adjust_font_size = False
|
|
@@ -267,24 +260,32 @@ def get_widgets_by_page(pdf: bytes) -> Dict[int, List[dict]]:
|
|
|
267
260
|
return result
|
|
268
261
|
|
|
269
262
|
|
|
270
|
-
def
|
|
271
|
-
"""Constructs a widget's
|
|
263
|
+
def get_widget_key(widget: dict, use_full_widget_name: bool) -> str:
|
|
264
|
+
"""Constructs a widget's key, optionally including parent names based on `use_full_widget_name`.
|
|
265
|
+
|
|
266
|
+
This function recursively builds the full key by appending parent names if `use_full_widget_name` is True.
|
|
267
|
+
If `use_full_widget_name` is False, it returns the widget's key directly.
|
|
272
268
|
|
|
273
269
|
Args:
|
|
274
|
-
widget: PDF widget dictionary
|
|
270
|
+
widget (dict): PDF widget dictionary.
|
|
271
|
+
use_full_widget_name (bool): Whether to include parent widget names in the key.
|
|
275
272
|
|
|
276
273
|
Returns:
|
|
277
|
-
str: Full key in format "parent.child" if parent exists, otherwise the widget's key
|
|
274
|
+
str: Full key in format "parent.child" if parent exists and `use_full_widget_name` is True, otherwise the widget's key.
|
|
278
275
|
"""
|
|
279
276
|
|
|
280
277
|
key = extract_widget_property(widget, WIDGET_KEY_PATTERNS, None, str)
|
|
278
|
+
if not use_full_widget_name:
|
|
279
|
+
return key
|
|
281
280
|
|
|
282
281
|
if (
|
|
283
282
|
Parent in widget
|
|
284
283
|
and T in widget[Parent].get_object()
|
|
285
284
|
and widget[Parent].get_object()[T] != key
|
|
286
285
|
):
|
|
287
|
-
key =
|
|
286
|
+
key = (
|
|
287
|
+
f"{get_widget_key(widget[Parent].get_object(), use_full_widget_name)}.{key}"
|
|
288
|
+
)
|
|
288
289
|
|
|
289
290
|
return key
|
|
290
291
|
|
|
@@ -592,9 +593,7 @@ def update_widget_keys(
|
|
|
592
593
|
for page in out.pages:
|
|
593
594
|
for annot in page.get(Annots, []):
|
|
594
595
|
annot = cast(DictionaryObject, annot.get_object())
|
|
595
|
-
key =
|
|
596
|
-
annot.get_object(), WIDGET_KEY_PATTERNS, None, str
|
|
597
|
-
)
|
|
596
|
+
key = get_widget_key(annot.get_object(), False)
|
|
598
597
|
|
|
599
598
|
widget = widgets.get(key)
|
|
600
599
|
if widget is None:
|
|
@@ -18,8 +18,8 @@ from reportlab.lib.utils import ImageReader
|
|
|
18
18
|
from reportlab.pdfgen.canvas import Canvas
|
|
19
19
|
|
|
20
20
|
from .constants import Annots
|
|
21
|
-
from .
|
|
22
|
-
from .utils import
|
|
21
|
+
from .template import get_widget_key
|
|
22
|
+
from .utils import stream_to_io
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def draw_text(canvas: Canvas, **kwargs) -> None:
|
|
@@ -381,9 +381,7 @@ def copy_watermark_widgets(
|
|
|
381
381
|
for j, page in enumerate(watermark_file.pages):
|
|
382
382
|
widgets_to_copy_pdf[j] = []
|
|
383
383
|
for annot in page.get(Annots, []):
|
|
384
|
-
key =
|
|
385
|
-
annot.get_object(), WIDGET_KEY_PATTERNS, None, str
|
|
386
|
-
)
|
|
384
|
+
key = get_widget_key(annot.get_object(), False)
|
|
387
385
|
if (keys is None or key in keys) and (
|
|
388
386
|
page_num is None or page_num == j
|
|
389
387
|
):
|
|
@@ -16,8 +16,9 @@ from reportlab.lib.colors import Color
|
|
|
16
16
|
from reportlab.pdfgen.canvas import Canvas
|
|
17
17
|
|
|
18
18
|
from ..constants import Annots
|
|
19
|
-
from ..patterns import NON_ACRO_FORM_PARAM_TO_FUNC
|
|
20
|
-
from ..
|
|
19
|
+
from ..patterns import NON_ACRO_FORM_PARAM_TO_FUNC
|
|
20
|
+
from ..template import get_widget_key
|
|
21
|
+
from ..utils import stream_to_io
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
class Widget:
|
|
@@ -156,9 +157,7 @@ def handle_non_acro_form_params(pdf: bytes, key: str, params: list) -> bytes:
|
|
|
156
157
|
for page in out.pages:
|
|
157
158
|
for annot in page.get(Annots, []):
|
|
158
159
|
annot = cast(DictionaryObject, annot.get_object())
|
|
159
|
-
_key =
|
|
160
|
-
annot.get_object(), WIDGET_KEY_PATTERNS, None, str
|
|
161
|
-
)
|
|
160
|
+
_key = get_widget_key(annot.get_object(), False)
|
|
162
161
|
|
|
163
162
|
if _key == key:
|
|
164
163
|
for param in params:
|
|
@@ -14,8 +14,8 @@ from pypdf.generic import (ArrayObject, FloatObject, NameObject,
|
|
|
14
14
|
TextStringObject)
|
|
15
15
|
|
|
16
16
|
from ..constants import Annots, Rect, T
|
|
17
|
-
from ..
|
|
18
|
-
from ..utils import
|
|
17
|
+
from ..template import get_widget_key
|
|
18
|
+
from ..utils import stream_to_io
|
|
19
19
|
from .bedrock import BEDROCK_PDF
|
|
20
20
|
|
|
21
21
|
|
|
@@ -107,9 +107,7 @@ class SignatureWidget:
|
|
|
107
107
|
|
|
108
108
|
for page in out.pages:
|
|
109
109
|
for annot in page.get(Annots, []):
|
|
110
|
-
key =
|
|
111
|
-
annot.get_object(), WIDGET_KEY_PATTERNS, None, str
|
|
112
|
-
)
|
|
110
|
+
key = get_widget_key(annot.get_object(), False)
|
|
113
111
|
|
|
114
112
|
if key != self.BEDROCK_WIDGET_TO_COPY:
|
|
115
113
|
continue
|
|
@@ -8,18 +8,18 @@ from PyPDFForm import PdfWrapper
|
|
|
8
8
|
def test_init(sample_template_with_full_key):
|
|
9
9
|
obj = PdfWrapper(sample_template_with_full_key, use_full_widget_name=True)
|
|
10
10
|
assert "Gain de 2 classes.0" in obj.widgets
|
|
11
|
-
assert
|
|
11
|
+
assert "0" not in obj.widgets
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
def test_sample_data(sample_template_with_full_key):
|
|
15
15
|
obj = PdfWrapper(sample_template_with_full_key, use_full_widget_name=True)
|
|
16
16
|
assert "Gain de 2 classes.0" in obj.sample_data
|
|
17
|
-
assert
|
|
17
|
+
assert "0" not in obj.sample_data
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def test_fill(sample_template_with_full_key):
|
|
21
21
|
obj_1 = PdfWrapper(sample_template_with_full_key, use_full_widget_name=True)
|
|
22
|
-
obj_2 = PdfWrapper(sample_template_with_full_key
|
|
22
|
+
obj_2 = PdfWrapper(sample_template_with_full_key)
|
|
23
23
|
|
|
24
24
|
assert (
|
|
25
25
|
obj_1.fill({"Gain de 2 classes.0": True}).read()
|
|
@@ -44,6 +44,4 @@ def test_commit_widget_key_updates(sample_template_with_full_key):
|
|
|
44
44
|
def test_schema(sample_template_with_full_key):
|
|
45
45
|
obj = PdfWrapper(sample_template_with_full_key, use_full_widget_name=True)
|
|
46
46
|
assert "Gain de 2 classes.0" in obj.schema["properties"]
|
|
47
|
-
assert
|
|
48
|
-
obj.schema["properties"]["Gain de 2 classes.0"] == obj.schema["properties"]["0"]
|
|
49
|
-
)
|
|
47
|
+
assert "0" not in obj.schema
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|