PyPDFForm 1.4.36__py3-none-any.whl → 1.5.0__py3-none-any.whl
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/__init__.py +1 -1
- PyPDFForm/constants.py +1 -0
- PyPDFForm/middleware/base.py +20 -2
- PyPDFForm/middleware/checkbox.py +1 -1
- PyPDFForm/middleware/dropdown.py +6 -1
- PyPDFForm/middleware/radio.py +5 -1
- PyPDFForm/middleware/text.py +18 -1
- PyPDFForm/patterns.py +3 -1
- PyPDFForm/template.py +38 -26
- PyPDFForm/wrapper.py +52 -23
- {PyPDFForm-1.4.36.dist-info → PyPDFForm-1.5.0.dist-info}/METADATA +2 -1
- PyPDFForm-1.5.0.dist-info/RECORD +30 -0
- {PyPDFForm-1.4.36.dist-info → PyPDFForm-1.5.0.dist-info}/WHEEL +1 -1
- PyPDFForm-1.4.36.dist-info/RECORD +0 -30
- {PyPDFForm-1.4.36.dist-info → PyPDFForm-1.5.0.dist-info}/LICENSE +0 -0
- {PyPDFForm-1.4.36.dist-info → PyPDFForm-1.5.0.dist-info}/top_level.txt +0 -0
PyPDFForm/__init__.py
CHANGED
PyPDFForm/constants.py
CHANGED
PyPDFForm/middleware/base.py
CHANGED
|
@@ -16,7 +16,8 @@ class Widget:
|
|
|
16
16
|
|
|
17
17
|
super().__init__()
|
|
18
18
|
self._name = name
|
|
19
|
-
self.
|
|
19
|
+
self._value = value
|
|
20
|
+
self.desc = None
|
|
20
21
|
|
|
21
22
|
@property
|
|
22
23
|
def name(self) -> str:
|
|
@@ -24,11 +25,28 @@ class Widget:
|
|
|
24
25
|
|
|
25
26
|
return self._name
|
|
26
27
|
|
|
28
|
+
@property
|
|
29
|
+
def value(self) -> Any:
|
|
30
|
+
"""Value to fill for the widget."""
|
|
31
|
+
|
|
32
|
+
return self._value
|
|
33
|
+
|
|
34
|
+
@value.setter
|
|
35
|
+
def value(self, value: Any) -> None:
|
|
36
|
+
"""Sets value to fill for the widget."""
|
|
37
|
+
|
|
38
|
+
self._value = value
|
|
39
|
+
|
|
27
40
|
@property
|
|
28
41
|
def schema_definition(self) -> dict:
|
|
29
42
|
"""Json schema definition of the widget."""
|
|
30
43
|
|
|
31
|
-
|
|
44
|
+
result = {}
|
|
45
|
+
|
|
46
|
+
if self.desc is not None:
|
|
47
|
+
result["description"] = self.desc
|
|
48
|
+
|
|
49
|
+
return result
|
|
32
50
|
|
|
33
51
|
@property
|
|
34
52
|
def sample_value(self) -> Any:
|
PyPDFForm/middleware/checkbox.py
CHANGED
|
@@ -31,7 +31,7 @@ class Checkbox(Widget):
|
|
|
31
31
|
def schema_definition(self) -> dict:
|
|
32
32
|
"""Json schema definition of the checkbox."""
|
|
33
33
|
|
|
34
|
-
return {"type": "boolean"}
|
|
34
|
+
return {"type": "boolean", **super().schema_definition}
|
|
35
35
|
|
|
36
36
|
@property
|
|
37
37
|
def sample_value(self) -> Union[bool, int]:
|
PyPDFForm/middleware/dropdown.py
CHANGED
|
@@ -17,12 +17,17 @@ class Dropdown(Widget):
|
|
|
17
17
|
super().__init__(name, value)
|
|
18
18
|
|
|
19
19
|
self.choices = []
|
|
20
|
+
self.desc = None
|
|
20
21
|
|
|
21
22
|
@property
|
|
22
23
|
def schema_definition(self) -> dict:
|
|
23
24
|
"""Json schema definition of the dropdown."""
|
|
24
25
|
|
|
25
|
-
return {
|
|
26
|
+
return {
|
|
27
|
+
"type": "integer",
|
|
28
|
+
"maximum": len(self.choices) - 1,
|
|
29
|
+
**super().schema_definition,
|
|
30
|
+
}
|
|
26
31
|
|
|
27
32
|
@property
|
|
28
33
|
def sample_value(self) -> int:
|
PyPDFForm/middleware/radio.py
CHANGED
|
@@ -22,7 +22,11 @@ class Radio(Checkbox):
|
|
|
22
22
|
def schema_definition(self) -> dict:
|
|
23
23
|
"""Json schema definition of the radiobutton."""
|
|
24
24
|
|
|
25
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
"maximum": self.number_of_options - 1,
|
|
27
|
+
**super().schema_definition,
|
|
28
|
+
"type": "integer",
|
|
29
|
+
}
|
|
26
30
|
|
|
27
31
|
@property
|
|
28
32
|
def sample_value(self) -> int:
|
PyPDFForm/middleware/text.py
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
"""Contains text middleware."""
|
|
3
3
|
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
4
6
|
from .base import Widget
|
|
5
7
|
|
|
6
8
|
|
|
@@ -27,6 +29,21 @@ class Text(Widget):
|
|
|
27
29
|
self.text_line_x_coordinates = None
|
|
28
30
|
self.preview = False
|
|
29
31
|
|
|
32
|
+
@property
|
|
33
|
+
def value(self) -> Any:
|
|
34
|
+
"""Value to fill for the text field."""
|
|
35
|
+
|
|
36
|
+
if isinstance(self._value, (int, float)):
|
|
37
|
+
return str(self._value)
|
|
38
|
+
|
|
39
|
+
return self._value
|
|
40
|
+
|
|
41
|
+
@value.setter
|
|
42
|
+
def value(self, value: str) -> None:
|
|
43
|
+
"""Sets value to fill for the text field."""
|
|
44
|
+
|
|
45
|
+
self._value = value
|
|
46
|
+
|
|
30
47
|
@property
|
|
31
48
|
def schema_definition(self) -> dict:
|
|
32
49
|
"""Json schema definition of the text field."""
|
|
@@ -36,7 +53,7 @@ class Text(Widget):
|
|
|
36
53
|
if self.max_length is not None:
|
|
37
54
|
result["maxLength"] = self.max_length
|
|
38
55
|
|
|
39
|
-
return result
|
|
56
|
+
return {**result, **super().schema_definition}
|
|
40
57
|
|
|
41
58
|
@property
|
|
42
59
|
def sample_value(self) -> str:
|
PyPDFForm/patterns.py
CHANGED
|
@@ -5,7 +5,7 @@ from pypdf.generic import (DictionaryObject, NameObject, NumberObject,
|
|
|
5
5
|
TextStringObject)
|
|
6
6
|
|
|
7
7
|
from .constants import (AP, AS, CA, DA, DV, FT, IMAGE_FIELD_IDENTIFIER, JS, MK,
|
|
8
|
-
MULTILINE, READ_ONLY, A, Btn, Ch, Ff, N, Off, Opt,
|
|
8
|
+
MULTILINE, READ_ONLY, TU, A, Btn, Ch, Ff, N, Off, Opt,
|
|
9
9
|
Parent, Q, Sig, T, Tx, V, Yes)
|
|
10
10
|
from .middleware.checkbox import Checkbox
|
|
11
11
|
from .middleware.dropdown import Dropdown
|
|
@@ -68,6 +68,8 @@ WIDGET_KEY_PATTERNS = [
|
|
|
68
68
|
{Parent: {T: True}},
|
|
69
69
|
]
|
|
70
70
|
|
|
71
|
+
WIDGET_DESCRIPTION_PATTERNS = [{TU: True}, {Parent: {TU: True}}]
|
|
72
|
+
|
|
71
73
|
DROPDOWN_CHOICE_PATTERNS = [
|
|
72
74
|
{Opt: True},
|
|
73
75
|
{Parent: {Opt: True}},
|
PyPDFForm/template.py
CHANGED
|
@@ -21,8 +21,8 @@ from .middleware.radio import Radio
|
|
|
21
21
|
from .middleware.text import Text
|
|
22
22
|
from .patterns import (BUTTON_STYLE_PATTERNS, DROPDOWN_CHOICE_PATTERNS,
|
|
23
23
|
TEXT_FIELD_FLAG_PATTERNS, WIDGET_ALIGNMENT_PATTERNS,
|
|
24
|
-
|
|
25
|
-
update_annotation_name)
|
|
24
|
+
WIDGET_DESCRIPTION_PATTERNS, WIDGET_KEY_PATTERNS,
|
|
25
|
+
WIDGET_TYPE_PATTERNS, update_annotation_name)
|
|
26
26
|
from .utils import find_pattern_match, stream_to_io, traverse_pattern
|
|
27
27
|
from .watermark import create_watermarks_and_draw
|
|
28
28
|
|
|
@@ -51,10 +51,9 @@ def build_widgets(pdf_stream: bytes) -> Dict[str, WIDGET_TYPES]:
|
|
|
51
51
|
for widgets in get_widgets_by_page(pdf_stream).values():
|
|
52
52
|
for widget in widgets:
|
|
53
53
|
key = get_widget_key(widget)
|
|
54
|
-
|
|
55
54
|
_widget = construct_widget(widget, key)
|
|
56
|
-
|
|
57
55
|
if _widget is not None:
|
|
56
|
+
_widget.desc = get_widget_description(widget)
|
|
58
57
|
if isinstance(_widget, Text):
|
|
59
58
|
_widget.max_length = get_text_field_max_length(widget)
|
|
60
59
|
if _widget.max_length is not None and is_text_field_comb(widget):
|
|
@@ -74,7 +73,6 @@ def build_widgets(pdf_stream: bytes) -> Dict[str, WIDGET_TYPES]:
|
|
|
74
73
|
continue
|
|
75
74
|
|
|
76
75
|
results[key] = _widget
|
|
77
|
-
|
|
78
76
|
return results
|
|
79
77
|
|
|
80
78
|
|
|
@@ -225,6 +223,18 @@ def get_text_field_max_length(widget: dict) -> Union[int, None]:
|
|
|
225
223
|
return int(widget[MaxLen]) or None if MaxLen in widget else None
|
|
226
224
|
|
|
227
225
|
|
|
226
|
+
def get_widget_description(widget: dict) -> Union[str, None]:
|
|
227
|
+
"""Returns the description of the widget if presented or None."""
|
|
228
|
+
|
|
229
|
+
result = None
|
|
230
|
+
for pattern in WIDGET_DESCRIPTION_PATTERNS:
|
|
231
|
+
value = traverse_pattern(pattern, widget)
|
|
232
|
+
if value:
|
|
233
|
+
result = str(value)
|
|
234
|
+
break
|
|
235
|
+
return result
|
|
236
|
+
|
|
237
|
+
|
|
228
238
|
def check_field_flag_bit(widget: dict, bit: int) -> bool:
|
|
229
239
|
"""Checks if a bit is set in a widget's field flag."""
|
|
230
240
|
|
|
@@ -408,39 +418,41 @@ def get_paragraph_auto_wrap_length(widget_middleware: Text) -> int:
|
|
|
408
418
|
return result
|
|
409
419
|
|
|
410
420
|
|
|
411
|
-
def
|
|
421
|
+
def update_widget_keys(
|
|
412
422
|
template: bytes,
|
|
413
423
|
widgets: Dict[str, WIDGET_TYPES],
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
424
|
+
old_keys: List[str],
|
|
425
|
+
new_keys: List[str],
|
|
426
|
+
indices: List[int],
|
|
417
427
|
) -> bytes:
|
|
418
|
-
"""Updates
|
|
428
|
+
"""Updates a list of keys of widgets."""
|
|
419
429
|
# pylint: disable=R0801
|
|
420
430
|
|
|
421
431
|
pdf = PdfReader(stream_to_io(template))
|
|
422
432
|
out = PdfWriter()
|
|
423
433
|
out.append(pdf)
|
|
424
434
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
+
for i, old_key in enumerate(old_keys):
|
|
436
|
+
index = indices[i]
|
|
437
|
+
new_key = new_keys[i]
|
|
438
|
+
tracker = -1
|
|
439
|
+
for page in out.pages:
|
|
440
|
+
for annot in page.get(Annots, []): # noqa
|
|
441
|
+
annot = cast(DictionaryObject, annot.get_object())
|
|
442
|
+
key = get_widget_key(annot.get_object())
|
|
443
|
+
|
|
444
|
+
widget = widgets.get(key)
|
|
445
|
+
if widget is None:
|
|
446
|
+
continue
|
|
435
447
|
|
|
436
|
-
|
|
437
|
-
|
|
448
|
+
if old_key != key:
|
|
449
|
+
continue
|
|
438
450
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
451
|
+
tracker += 1
|
|
452
|
+
if not isinstance(widget, Radio) and tracker != index:
|
|
453
|
+
continue
|
|
442
454
|
|
|
443
|
-
|
|
455
|
+
update_annotation_name(annot, new_key)
|
|
444
456
|
|
|
445
457
|
with BytesIO() as f:
|
|
446
458
|
out.write(f)
|
PyPDFForm/wrapper.py
CHANGED
|
@@ -18,7 +18,7 @@ from .middleware.dropdown import Dropdown
|
|
|
18
18
|
from .middleware.text import Text
|
|
19
19
|
from .template import (build_widgets, dropdown_to_text,
|
|
20
20
|
set_character_x_paddings, update_text_field_attributes,
|
|
21
|
-
|
|
21
|
+
update_widget_keys, widget_rect_watermarks)
|
|
22
22
|
from .utils import (get_page_streams, merge_two_pdfs, preview_widget_to_draw,
|
|
23
23
|
remove_all_widgets)
|
|
24
24
|
from .watermark import create_watermarks_and_draw, merge_watermarks_with_pdf
|
|
@@ -79,17 +79,35 @@ class PdfWrapper(FormWrapper):
|
|
|
79
79
|
"""Constructs all attributes for the object."""
|
|
80
80
|
|
|
81
81
|
super().__init__(template)
|
|
82
|
-
self.widgets =
|
|
82
|
+
self.widgets = {}
|
|
83
|
+
self._keys_to_update = []
|
|
83
84
|
|
|
84
85
|
self.global_font = kwargs.get("global_font")
|
|
85
86
|
self.global_font_size = kwargs.get("global_font_size")
|
|
86
87
|
self.global_font_color = kwargs.get("global_font_color")
|
|
87
88
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
self._init_helper()
|
|
90
|
+
|
|
91
|
+
def _init_helper(self, key_to_refresh: str = None) -> None:
|
|
92
|
+
"""Updates all attributes when the state of the PDF stream changes."""
|
|
93
|
+
|
|
94
|
+
refresh_not_needed = {}
|
|
95
|
+
new_widgets = build_widgets(self.read()) if self.read() else {}
|
|
96
|
+
for k, v in self.widgets.items():
|
|
97
|
+
if k in new_widgets:
|
|
98
|
+
new_widgets[k] = v
|
|
99
|
+
refresh_not_needed[k] = True
|
|
100
|
+
self.widgets = new_widgets
|
|
101
|
+
|
|
102
|
+
for key, value in self.widgets.items():
|
|
103
|
+
if (key_to_refresh and key == key_to_refresh) or (
|
|
104
|
+
key_to_refresh is None
|
|
105
|
+
and isinstance(value, Text)
|
|
106
|
+
and not refresh_not_needed.get(key)
|
|
107
|
+
):
|
|
108
|
+
value.font = self.global_font
|
|
109
|
+
value.font_size = self.global_font_size
|
|
110
|
+
value.font_color = self.global_font_color
|
|
93
111
|
|
|
94
112
|
@property
|
|
95
113
|
def sample_data(self) -> dict:
|
|
@@ -223,31 +241,42 @@ class PdfWrapper(FormWrapper):
|
|
|
223
241
|
self.stream, name, obj.non_acro_form_params
|
|
224
242
|
)
|
|
225
243
|
|
|
226
|
-
|
|
227
|
-
for k, v in self.widgets.items():
|
|
228
|
-
if k in new_widgets:
|
|
229
|
-
new_widgets[k] = v
|
|
230
|
-
self.widgets = new_widgets
|
|
244
|
+
key_to_refresh = ""
|
|
231
245
|
if widget_type in ("text", "dropdown"):
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
246
|
+
key_to_refresh = name
|
|
247
|
+
|
|
248
|
+
self._init_helper(key_to_refresh)
|
|
235
249
|
|
|
236
250
|
return self
|
|
237
251
|
|
|
238
252
|
def update_widget_key(
|
|
239
|
-
self, old_key: str, new_key: str, index: int = 0
|
|
253
|
+
self, old_key: str, new_key: str, index: int = 0, defer: bool = False
|
|
240
254
|
) -> PdfWrapper:
|
|
241
255
|
"""Updates the key of an existed widget on a PDF form."""
|
|
242
256
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
257
|
+
if defer:
|
|
258
|
+
self._keys_to_update.append((old_key, new_key, index))
|
|
259
|
+
return self
|
|
260
|
+
|
|
261
|
+
self.stream = update_widget_keys(
|
|
262
|
+
self.read(), self.widgets, [old_key], [new_key], [index]
|
|
263
|
+
)
|
|
264
|
+
self._init_helper()
|
|
265
|
+
|
|
266
|
+
return self
|
|
267
|
+
|
|
268
|
+
def commit_widget_key_updates(self) -> PdfWrapper:
|
|
269
|
+
"""Commits all deferred widget key updates on a PDF form."""
|
|
270
|
+
|
|
271
|
+
old_keys = [each[0] for each in self._keys_to_update]
|
|
272
|
+
new_keys = [each[1] for each in self._keys_to_update]
|
|
273
|
+
indices = [each[2] for each in self._keys_to_update]
|
|
274
|
+
|
|
275
|
+
self.stream = update_widget_keys(
|
|
276
|
+
self.read(), self.widgets, old_keys, new_keys, indices
|
|
250
277
|
)
|
|
278
|
+
self._init_helper()
|
|
279
|
+
self._keys_to_update = []
|
|
251
280
|
|
|
252
281
|
return self
|
|
253
282
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: PyPDFForm
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5.0
|
|
4
4
|
Summary: The Python library for PDF forms.
|
|
5
5
|
Home-page: https://github.com/chinapandaman/PyPDFForm
|
|
6
6
|
Author: Jinge Li
|
|
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3.9
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.10
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
17
|
Classifier: License :: OSI Approved :: MIT License
|
|
17
18
|
Classifier: Operating System :: OS Independent
|
|
18
19
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
PyPDFForm/__init__.py,sha256=-JU9Sz_lN3p7mSfsgeNlTUs4CS28fueCscA5_Bhv3sg,178
|
|
2
|
+
PyPDFForm/adapter.py,sha256=WFP-r8FLeKa-D9mFO9AphOcuXgyeAI1Ak0d-YsqxsK4,861
|
|
3
|
+
PyPDFForm/constants.py,sha256=48mxgyY3UgiVO2UIZuDe_B8KOE5bedyujnOjk6MtzHQ,1749
|
|
4
|
+
PyPDFForm/coordinate.py,sha256=V_ZZQ1pXtVPAyfMJCX7fKoEimK7XwX6bU3VQ0nKOhQA,7314
|
|
5
|
+
PyPDFForm/filler.py,sha256=ztYU-Rk_LKfCw-BhmdIDnK7ez-5jSPoi2Ho3xvbO4Io,7487
|
|
6
|
+
PyPDFForm/font.py,sha256=TbFLY4G72d7cQ3VG2g4HaYKROzQPQUmh6-8ynN6hzXY,5713
|
|
7
|
+
PyPDFForm/image.py,sha256=sjXPg9fjenNFj12a321xHX6JvuJs6PJRGLzpSNw5mVU,1180
|
|
8
|
+
PyPDFForm/patterns.py,sha256=Z548TjpQpaVepctvlRYe0-2i7Aws96fo-ncG82CUX14,5423
|
|
9
|
+
PyPDFForm/template.py,sha256=6cyuFieAyQM6S-x6Sasp7dLIb8aKwtlhlOgutjoX0ks,14839
|
|
10
|
+
PyPDFForm/utils.py,sha256=9omR-oT3OdZqioxpiGqA9_P0GSFC6mg4Y1xrLvWOzkk,4309
|
|
11
|
+
PyPDFForm/watermark.py,sha256=L4LfzjjyJ6TDq9ad2dbtQYheBOic1_oZ7smhFFekNog,4725
|
|
12
|
+
PyPDFForm/wrapper.py,sha256=n3qJVI3JRn-WKxq_CwC1tJw7AiI2Ltj8mvLDexK8U8s,11084
|
|
13
|
+
PyPDFForm/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
+
PyPDFForm/middleware/base.py,sha256=xMg6X6-hJgvV-e_2rRJHBRO7gGICcBsnvUzxtF2XtVs,1120
|
|
15
|
+
PyPDFForm/middleware/checkbox.py,sha256=0EWFECXYdz9SNxgGe1QCcRrdxLVUIJpzRYwKfGRA9e4,1346
|
|
16
|
+
PyPDFForm/middleware/dropdown.py,sha256=_RXs9o3vWH_a402zhTOYE_mcWbtFfVU7bReYcEFAIyk,793
|
|
17
|
+
PyPDFForm/middleware/image.py,sha256=xjPxRiGBWFEU3EQGGqJXY1iMX1kmr0jO8O9iVUC5rcc,177
|
|
18
|
+
PyPDFForm/middleware/radio.py,sha256=uffpK15U1gUn7mkyOcMwZByZo-I2cMWWsW3sBb1WeYk,801
|
|
19
|
+
PyPDFForm/middleware/signature.py,sha256=m7tNvGZ7fQ0yuVKzSlLbNQ2IILo1GDnjzMDzMnYCKVM,1104
|
|
20
|
+
PyPDFForm/middleware/text.py,sha256=7HFHy_lfBFfYbSUzgVKovSoShbNP6L7tiILIw-9_kpo,1549
|
|
21
|
+
PyPDFForm/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
+
PyPDFForm/widgets/base.py,sha256=nb6HEfRdWSjZc_Th1XI62PIlgREn_JiApGC-epb6jAg,3348
|
|
23
|
+
PyPDFForm/widgets/checkbox.py,sha256=MGB6NGI-XMBz4j2erykgYOCd1pswvthuQ6UFowQOd4o,503
|
|
24
|
+
PyPDFForm/widgets/dropdown.py,sha256=2_R5xcLUWAL0G4raVgWWtE7TJdiWJITay-Gtl8YI2QI,705
|
|
25
|
+
PyPDFForm/widgets/text.py,sha256=sCB8CQAjh30QOGr8FTIDSk3X6dXSHJztOz6YkKEBDss,691
|
|
26
|
+
PyPDFForm-1.5.0.dist-info/LICENSE,sha256=43awmYkI6opyTpg19me731iO1WfXZwViqb67oWtCsFY,1065
|
|
27
|
+
PyPDFForm-1.5.0.dist-info/METADATA,sha256=OzbNc9l4HTogbGqi45TaQzEGQaLr3sQStxf-84dI49Y,4201
|
|
28
|
+
PyPDFForm-1.5.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
29
|
+
PyPDFForm-1.5.0.dist-info/top_level.txt,sha256=GQQKuWqPUjT9YZqwK95NlAQzxjwoQrsxQ8ureM8lWOY,10
|
|
30
|
+
PyPDFForm-1.5.0.dist-info/RECORD,,
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
PyPDFForm/__init__.py,sha256=piytcpUIHLfdyWTQOM9ZDn1CgeF0GlRVciqihHGpihQ,179
|
|
2
|
-
PyPDFForm/adapter.py,sha256=WFP-r8FLeKa-D9mFO9AphOcuXgyeAI1Ak0d-YsqxsK4,861
|
|
3
|
-
PyPDFForm/constants.py,sha256=FMsdOvnYpchEfki3gf_Y2Wj1SThUxMzsPbOx12_S1GA,1738
|
|
4
|
-
PyPDFForm/coordinate.py,sha256=V_ZZQ1pXtVPAyfMJCX7fKoEimK7XwX6bU3VQ0nKOhQA,7314
|
|
5
|
-
PyPDFForm/filler.py,sha256=ztYU-Rk_LKfCw-BhmdIDnK7ez-5jSPoi2Ho3xvbO4Io,7487
|
|
6
|
-
PyPDFForm/font.py,sha256=TbFLY4G72d7cQ3VG2g4HaYKROzQPQUmh6-8ynN6hzXY,5713
|
|
7
|
-
PyPDFForm/image.py,sha256=sjXPg9fjenNFj12a321xHX6JvuJs6PJRGLzpSNw5mVU,1180
|
|
8
|
-
PyPDFForm/patterns.py,sha256=NluZyGSiKTV8ijqvBYSV8q389TuijI4wbv6fooHD6hk,5353
|
|
9
|
-
PyPDFForm/template.py,sha256=AaJ9qHw2Fw-51CRSfOy4POeEvFlKJ5h-WdqlFsGBuY4,14230
|
|
10
|
-
PyPDFForm/utils.py,sha256=9omR-oT3OdZqioxpiGqA9_P0GSFC6mg4Y1xrLvWOzkk,4309
|
|
11
|
-
PyPDFForm/watermark.py,sha256=L4LfzjjyJ6TDq9ad2dbtQYheBOic1_oZ7smhFFekNog,4725
|
|
12
|
-
PyPDFForm/wrapper.py,sha256=PRtiLJAtO3Sbpvr3qDy1ElitSRcNghpbkwSSiCMQ-7E,10231
|
|
13
|
-
PyPDFForm/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
-
PyPDFForm/middleware/base.py,sha256=p-3XsZJ6d7ai2JFLF7LisMWi9yzM3pN7CsFECxtEoI0,751
|
|
15
|
-
PyPDFForm/middleware/checkbox.py,sha256=3-9CMhhtyO9U6lLXDciW-59ng8uS4m6_clPB02mzV9c,1317
|
|
16
|
-
PyPDFForm/middleware/dropdown.py,sha256=7_DuacMQCRvp2pYxDvzEjUNKDUsTfU0aGTRMBtYWTIA,692
|
|
17
|
-
PyPDFForm/middleware/image.py,sha256=xjPxRiGBWFEU3EQGGqJXY1iMX1kmr0jO8O9iVUC5rcc,177
|
|
18
|
-
PyPDFForm/middleware/radio.py,sha256=ZDrRRF0Tu_3VBQ69x0G-IaZVf8FSOVz8xVpQsyiKhBc,725
|
|
19
|
-
PyPDFForm/middleware/signature.py,sha256=m7tNvGZ7fQ0yuVKzSlLbNQ2IILo1GDnjzMDzMnYCKVM,1104
|
|
20
|
-
PyPDFForm/middleware/text.py,sha256=BvdfmHu3GIWPMALahhHOz39mJPuMBx0c9ubYwi2kSZk,1144
|
|
21
|
-
PyPDFForm/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
-
PyPDFForm/widgets/base.py,sha256=nb6HEfRdWSjZc_Th1XI62PIlgREn_JiApGC-epb6jAg,3348
|
|
23
|
-
PyPDFForm/widgets/checkbox.py,sha256=MGB6NGI-XMBz4j2erykgYOCd1pswvthuQ6UFowQOd4o,503
|
|
24
|
-
PyPDFForm/widgets/dropdown.py,sha256=2_R5xcLUWAL0G4raVgWWtE7TJdiWJITay-Gtl8YI2QI,705
|
|
25
|
-
PyPDFForm/widgets/text.py,sha256=sCB8CQAjh30QOGr8FTIDSk3X6dXSHJztOz6YkKEBDss,691
|
|
26
|
-
PyPDFForm-1.4.36.dist-info/LICENSE,sha256=43awmYkI6opyTpg19me731iO1WfXZwViqb67oWtCsFY,1065
|
|
27
|
-
PyPDFForm-1.4.36.dist-info/METADATA,sha256=bDAjb3toOHXX-5hMPJQSWEzzcMDRoHCOkYgDWoxh4hM,4151
|
|
28
|
-
PyPDFForm-1.4.36.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
29
|
-
PyPDFForm-1.4.36.dist-info/top_level.txt,sha256=GQQKuWqPUjT9YZqwK95NlAQzxjwoQrsxQ8ureM8lWOY,10
|
|
30
|
-
PyPDFForm-1.4.36.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|