python-pdffiller 1.0.0__py3-none-any.whl → 1.1.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.
- pdffiller/_version.py +1 -1
- pdffiller/cli/commands/fill_form.py +3 -3
- pdffiller/pdf.py +42 -198
- pdffiller/widgets/base.py +28 -1
- pdffiller/widgets/checkbox.py +3 -1
- pdffiller/widgets/text.py +3 -1
- {python_pdffiller-1.0.0.dist-info → python_pdffiller-1.1.0.dist-info}/METADATA +1 -1
- {python_pdffiller-1.0.0.dist-info → python_pdffiller-1.1.0.dist-info}/RECORD +13 -13
- {python_pdffiller-1.0.0.dist-info → python_pdffiller-1.1.0.dist-info}/WHEEL +0 -0
- {python_pdffiller-1.0.0.dist-info → python_pdffiller-1.1.0.dist-info}/entry_points.txt +0 -0
- {python_pdffiller-1.0.0.dist-info → python_pdffiller-1.1.0.dist-info}/licenses/AUTHORS.rst +0 -0
- {python_pdffiller-1.0.0.dist-info → python_pdffiller-1.1.0.dist-info}/licenses/COPYING +0 -0
- {python_pdffiller-1.0.0.dist-info → python_pdffiller-1.1.0.dist-info}/top_level.txt +0 -0
pdffiller/_version.py
CHANGED
|
@@ -17,7 +17,7 @@ from pdffiller.exceptions import (
|
|
|
17
17
|
)
|
|
18
18
|
from pdffiller.io.output import PdfFillerOutput
|
|
19
19
|
from pdffiller.pdf import Pdf
|
|
20
|
-
from pdffiller.typing import Any, Dict
|
|
20
|
+
from pdffiller.typing import Any, Dict
|
|
21
21
|
|
|
22
22
|
from ..exit_codes import ERROR_ENCOUNTERED
|
|
23
23
|
|
|
@@ -94,7 +94,7 @@ def fill_form(parser: PdfFillerArgumentParser, *args: Any) -> Any:
|
|
|
94
94
|
if not opts.data and not opts.input_data:
|
|
95
95
|
raise CommandLineError("no data file path given")
|
|
96
96
|
|
|
97
|
-
input_data: Dict[str,
|
|
97
|
+
input_data: Dict[str, str] = {}
|
|
98
98
|
if opts.input_data:
|
|
99
99
|
try:
|
|
100
100
|
input_data = json.loads(opts.input_data)
|
|
@@ -132,7 +132,7 @@ def fill_form(parser: PdfFillerArgumentParser, *args: Any) -> Any:
|
|
|
132
132
|
input_data = input_dict
|
|
133
133
|
|
|
134
134
|
try:
|
|
135
|
-
pdf = Pdf(
|
|
135
|
+
pdf = Pdf()
|
|
136
136
|
pdf.fill(opts.file, opts.output, input_data, opts.flatten)
|
|
137
137
|
except PdfFillerException as exp:
|
|
138
138
|
output.error(str(exp))
|
pdffiller/pdf.py
CHANGED
|
@@ -14,25 +14,19 @@ from collections import OrderedDict
|
|
|
14
14
|
|
|
15
15
|
from pypdf import PdfReader, PdfWriter
|
|
16
16
|
from pypdf.errors import PyPdfError
|
|
17
|
-
from pypdf.generic import
|
|
18
|
-
ArrayObject,
|
|
19
|
-
DictionaryObject,
|
|
20
|
-
NameObject,
|
|
21
|
-
NumberObject,
|
|
22
|
-
TextStringObject,
|
|
23
|
-
)
|
|
17
|
+
from pypdf.generic import ArrayObject, DictionaryObject, NameObject
|
|
24
18
|
|
|
25
19
|
from pdffiller.io.output import PdfFillerOutput
|
|
26
20
|
|
|
27
21
|
from .typing import (
|
|
28
22
|
Any,
|
|
29
|
-
Callable,
|
|
30
23
|
cast,
|
|
31
24
|
Dict,
|
|
32
25
|
List,
|
|
33
26
|
Optional,
|
|
34
27
|
PathLike,
|
|
35
28
|
StrByteType,
|
|
29
|
+
Tuple,
|
|
36
30
|
Type,
|
|
37
31
|
Union,
|
|
38
32
|
)
|
|
@@ -179,7 +173,9 @@ class Pdf:
|
|
|
179
173
|
elif widget_type in ["list", "combo"] and value:
|
|
180
174
|
choices = [each[1:] for each in widget[PdfAttributes.Opt]]
|
|
181
175
|
if key not in loaded_widgets:
|
|
182
|
-
new_widget = self.TYPE_TO_OBJECT[widget_type](
|
|
176
|
+
new_widget = self.TYPE_TO_OBJECT[widget_type](
|
|
177
|
+
key, i, value, self.is_readonly(widget_type, widget.get_object())
|
|
178
|
+
)
|
|
183
179
|
if choices and isinstance(new_widget, CheckBoxWidget):
|
|
184
180
|
new_widget.choices = choices
|
|
185
181
|
elif isinstance(new_widget, TextWidget):
|
|
@@ -224,7 +220,7 @@ class Pdf:
|
|
|
224
220
|
self,
|
|
225
221
|
input_file: StrByteType,
|
|
226
222
|
output_file: PathLike,
|
|
227
|
-
data: Dict[str,
|
|
223
|
+
data: Dict[str, str],
|
|
228
224
|
flatten: bool = True,
|
|
229
225
|
) -> "Pdf":
|
|
230
226
|
"""
|
|
@@ -244,68 +240,23 @@ class Pdf:
|
|
|
244
240
|
Returns:
|
|
245
241
|
Pdf: The `Pdf` object, allowing for method chaining.
|
|
246
242
|
"""
|
|
247
|
-
for key, value in data.items():
|
|
248
|
-
if key in self.widgets:
|
|
249
|
-
self.widgets[key].value = value
|
|
250
|
-
|
|
251
243
|
reader = PdfReader(input_file)
|
|
252
|
-
if self.adobe_mode:
|
|
253
|
-
if (
|
|
254
|
-
PdfAttributes.AcroForm in cast(Any, reader.trailer[PdfAttributes.Root])
|
|
255
|
-
and PdfAttributes.XFA
|
|
256
|
-
in cast(Any, reader.trailer[PdfAttributes.Root])[PdfAttributes.AcroForm]
|
|
257
|
-
):
|
|
258
|
-
del cast(Any, reader.trailer[PdfAttributes.Root])[PdfAttributes.AcroForm][
|
|
259
|
-
PdfAttributes.XFA
|
|
260
|
-
]
|
|
261
|
-
|
|
262
|
-
writer = PdfWriter(reader)
|
|
263
|
-
if self.adobe_mode:
|
|
264
|
-
writer.set_need_appearances_writer()
|
|
265
244
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
"text": self._fill_text,
|
|
269
|
-
"radio": self._fill_radio,
|
|
270
|
-
}
|
|
245
|
+
self._init_helper(input_file)
|
|
246
|
+
fields: Dict[str, Union[str, List[str], Tuple[str, str, float]]] = {}
|
|
271
247
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
if
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
if (
|
|
279
|
-
PdfAttributes.Subtype not in widget
|
|
280
|
-
or widget[PdfAttributes.Subtype] != PdfAttributes.Widget
|
|
281
|
-
):
|
|
282
|
-
continue
|
|
248
|
+
for name, value in data.items():
|
|
249
|
+
widget = self.widgets.get(name)
|
|
250
|
+
fields[name] = value
|
|
251
|
+
if isinstance(widget, CheckBoxWidget):
|
|
252
|
+
if value and value[0] != "/":
|
|
253
|
+
fields[name] = "/" + value
|
|
283
254
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
continue
|
|
290
|
-
|
|
291
|
-
widget_type: Optional[str] = self._get_field_type(widget)
|
|
292
|
-
if not widget_type:
|
|
293
|
-
continue
|
|
294
|
-
|
|
295
|
-
if widget_type != "radio":
|
|
296
|
-
self.flatten_generic(annotation, flatten)
|
|
297
|
-
else:
|
|
298
|
-
self.flatten_radio(annotation, flatten)
|
|
299
|
-
|
|
300
|
-
if widget_key not in data or widget_type not in fillers:
|
|
301
|
-
continue
|
|
302
|
-
|
|
303
|
-
current_widget = self.widgets[widget_key]
|
|
304
|
-
if current_widget.value is None:
|
|
305
|
-
continue
|
|
306
|
-
|
|
307
|
-
output.debug(f"Filling {current_widget.name} with {current_widget.value}")
|
|
308
|
-
fillers[widget_type](annotation, current_widget)
|
|
255
|
+
writer = PdfWriter(reader)
|
|
256
|
+
writer.update_page_form_field_values(None, fields, auto_regenerate=False, flatten=flatten)
|
|
257
|
+
if flatten:
|
|
258
|
+
writer.remove_annotations(None)
|
|
259
|
+
writer.compress_identical_objects(remove_identicals=True, remove_orphans=True)
|
|
309
260
|
|
|
310
261
|
with open(output_file, "wb") as f:
|
|
311
262
|
writer.write(f)
|
|
@@ -346,143 +297,36 @@ class Pdf:
|
|
|
346
297
|
return None
|
|
347
298
|
|
|
348
299
|
@staticmethod
|
|
349
|
-
def
|
|
350
|
-
"""
|
|
351
|
-
Updates the value of a text annotation, setting the text content.
|
|
352
|
-
|
|
353
|
-
This function modifies the value (V) and appearance (AP) of the text
|
|
354
|
-
annotation to reflect the new text content.
|
|
355
|
-
|
|
356
|
-
Args:
|
|
357
|
-
annotation (DictionaryObject): The text annotation dictionary.
|
|
358
|
-
widget (TextWidget): The Text widget object containing the text value.
|
|
359
|
-
"""
|
|
360
|
-
if PdfAttributes.Parent in annotation and PdfAttributes.T not in annotation:
|
|
361
|
-
annotation[NameObject(PdfAttributes.Parent)] = TextStringObject(widget.value)
|
|
362
|
-
annotation[NameObject(PdfAttributes.AP)] = TextStringObject(widget.value)
|
|
363
|
-
else:
|
|
364
|
-
annotation[NameObject(PdfAttributes.V)] = TextStringObject(widget.value)
|
|
365
|
-
annotation[NameObject(PdfAttributes.AP)] = TextStringObject(widget.value)
|
|
366
|
-
|
|
367
|
-
@staticmethod
|
|
368
|
-
def _fill_checkbox(annotation: DictionaryObject, widget: CheckBoxWidget) -> None:
|
|
369
|
-
value: Union[bool, str, None] = widget.value
|
|
370
|
-
if value is None:
|
|
371
|
-
value = False
|
|
372
|
-
if not isinstance(value, bool):
|
|
373
|
-
annotation[NameObject(PdfAttributes.AS)] = NameObject("/" + widget.value)
|
|
374
|
-
annotation[NameObject(PdfAttributes.V)] = NameObject("/" + widget.value)
|
|
375
|
-
return
|
|
376
|
-
|
|
377
|
-
for each in cast(Any, annotation[PdfAttributes.AP])[PdfAttributes.N]:
|
|
378
|
-
if (value and str(each) != PdfAttributes.Off) or (
|
|
379
|
-
not value and str(each) == PdfAttributes.Off
|
|
380
|
-
):
|
|
381
|
-
annotation[NameObject(PdfAttributes.AS)] = NameObject(each)
|
|
382
|
-
annotation[NameObject(PdfAttributes.V)] = NameObject(each)
|
|
383
|
-
return
|
|
384
|
-
|
|
385
|
-
if PdfAttributes.V in annotation:
|
|
386
|
-
del annotation[PdfAttributes.V]
|
|
387
|
-
if PdfAttributes.AS in annotation:
|
|
388
|
-
del annotation[PdfAttributes.AS]
|
|
389
|
-
|
|
390
|
-
@staticmethod
|
|
391
|
-
def _fill_radio(annotation: DictionaryObject, widget: RadioWidget) -> None:
|
|
392
|
-
|
|
393
|
-
for each in (
|
|
394
|
-
cast(Any, annotation[PdfAttributes.Kids])
|
|
395
|
-
if PdfAttributes.T in annotation
|
|
396
|
-
else cast(Any, annotation[PdfAttributes.Parent])[PdfAttributes.Kids]
|
|
397
|
-
):
|
|
398
|
-
# determine the export value of each kid
|
|
399
|
-
keys = each[PdfAttributes.AP][PdfAttributes.N].keys()
|
|
400
|
-
if PdfAttributes.Off in keys:
|
|
401
|
-
keys.remove(PdfAttributes.Off)
|
|
402
|
-
export = list(keys)[0] or None
|
|
403
|
-
|
|
404
|
-
if f"/{widget.value}" == export:
|
|
405
|
-
annotation[NameObject(PdfAttributes.AS)] = NameObject(export)
|
|
406
|
-
cast(Any, annotation[NameObject(PdfAttributes.Parent)])[
|
|
407
|
-
NameObject(PdfAttributes.V)
|
|
408
|
-
] = NameObject(export)
|
|
409
|
-
else:
|
|
410
|
-
annotation[NameObject(PdfAttributes.AS)] = NameObject(PdfAttributes.Off)
|
|
411
|
-
|
|
412
|
-
@staticmethod
|
|
413
|
-
def flatten_radio(annot: DictionaryObject, val: bool) -> None:
|
|
300
|
+
def is_readonly(widget_type: str, annot: DictionaryObject) -> bool:
|
|
414
301
|
"""
|
|
415
|
-
|
|
416
|
-
making it non-editable or editable based on the `val` parameter.
|
|
302
|
+
Determines whether readonly flag is set or not.
|
|
417
303
|
|
|
418
|
-
This function
|
|
419
|
-
|
|
420
|
-
unset the ReadOnly flag, preventing or allowing the user from changing the
|
|
421
|
-
selected option.
|
|
304
|
+
This function evaluates if readonly is activating by checking Ff (flags) entry
|
|
305
|
+
in the annotation dictionary.
|
|
422
306
|
|
|
423
307
|
Args:
|
|
424
|
-
|
|
425
|
-
|
|
308
|
+
widget_type (str): The widget type
|
|
309
|
+
annot (DictionaryObject): The annotation dictionary.
|
|
310
|
+
Returns:
|
|
311
|
+
True if read-only is set, else False
|
|
426
312
|
"""
|
|
427
|
-
if
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
(
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
NameObject(PdfAttributes.Ff), 0
|
|
434
|
-
)
|
|
313
|
+
if widget_type == "radio":
|
|
314
|
+
if PdfAttributes.Parent in annot:
|
|
315
|
+
return (
|
|
316
|
+
int(
|
|
317
|
+
cast(Any, annot[NameObject(PdfAttributes.Parent)]).get(
|
|
318
|
+
NameObject(PdfAttributes.Ff), 0
|
|
435
319
|
)
|
|
436
|
-
| PdfAttributes.READ_ONLY
|
|
437
|
-
if val
|
|
438
|
-
else int(
|
|
439
|
-
cast(Any, annot[NameObject(PdfAttributes.Parent)]).get(
|
|
440
|
-
NameObject(PdfAttributes.Ff), 0
|
|
441
|
-
)
|
|
442
|
-
)
|
|
443
|
-
& ~PdfAttributes.READ_ONLY
|
|
444
320
|
)
|
|
321
|
+
& PdfAttributes.READ_ONLY
|
|
322
|
+
== PdfAttributes.READ_ONLY
|
|
445
323
|
)
|
|
324
|
+
return (
|
|
325
|
+
int(annot.get(NameObject(PdfAttributes.Ff), 0)) & PdfAttributes.READ_ONLY
|
|
326
|
+
== PdfAttributes.READ_ONLY
|
|
446
327
|
)
|
|
447
|
-
else:
|
|
448
|
-
annot[NameObject(PdfAttributes.Ff)] = NumberObject(
|
|
449
|
-
(
|
|
450
|
-
int(annot.get(NameObject(PdfAttributes.Ff), 0)) | PdfAttributes.READ_ONLY
|
|
451
|
-
if val
|
|
452
|
-
else int(annot.get(NameObject(PdfAttributes.Ff), 0)) & ~PdfAttributes.READ_ONLY
|
|
453
|
-
)
|
|
454
|
-
)
|
|
455
|
-
|
|
456
|
-
@staticmethod
|
|
457
|
-
def flatten_generic(annot: DictionaryObject, val: bool) -> None:
|
|
458
|
-
"""
|
|
459
|
-
Flattens a generic annotation by setting or unsetting the ReadOnly flag,
|
|
460
|
-
making it non-editable or editable based on the `val` parameter.
|
|
461
328
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
Args:
|
|
467
|
-
annot (DictionaryObject): The annotation dictionary.
|
|
468
|
-
val (bool): True to flatten (make read-only), False to unflatten (make editable).
|
|
469
|
-
"""
|
|
470
|
-
if PdfAttributes.Parent in annot and PdfAttributes.Ff not in annot:
|
|
471
|
-
cast(Any, annot[NameObject(PdfAttributes.Parent)])[NameObject(PdfAttributes.Ff)] = (
|
|
472
|
-
NumberObject(
|
|
473
|
-
(
|
|
474
|
-
int(annot.get(NameObject(PdfAttributes.Ff), 0)) | PdfAttributes.READ_ONLY
|
|
475
|
-
if val
|
|
476
|
-
else int(annot.get(NameObject(PdfAttributes.Ff), 0))
|
|
477
|
-
& ~PdfAttributes.READ_ONLY
|
|
478
|
-
)
|
|
479
|
-
)
|
|
480
|
-
)
|
|
481
|
-
else:
|
|
482
|
-
annot[NameObject(PdfAttributes.Ff)] = NumberObject(
|
|
483
|
-
(
|
|
484
|
-
int(annot.get(NameObject(PdfAttributes.Ff), 0)) | PdfAttributes.READ_ONLY
|
|
485
|
-
if val
|
|
486
|
-
else int(annot.get(NameObject(PdfAttributes.Ff), 0)) & ~PdfAttributes.READ_ONLY
|
|
487
|
-
)
|
|
488
|
-
)
|
|
329
|
+
return (
|
|
330
|
+
int(annot.get(NameObject(PdfAttributes.Ff), 0)) & PdfAttributes.READ_ONLY
|
|
331
|
+
== PdfAttributes.READ_ONLY
|
|
332
|
+
)
|
pdffiller/widgets/base.py
CHANGED
|
@@ -20,7 +20,9 @@ class Widget:
|
|
|
20
20
|
as name, value, and schema definition.
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
-
def __init__(
|
|
23
|
+
def __init__(
|
|
24
|
+
self, name: str, page_number: int, value: Optional[Any] = None, readonly: bool = False
|
|
25
|
+
) -> None:
|
|
24
26
|
"""
|
|
25
27
|
Initialize a new widget.
|
|
26
28
|
|
|
@@ -28,11 +30,13 @@ class Widget:
|
|
|
28
30
|
name (str): The name of the widget.
|
|
29
31
|
page_number (int): The associated page index
|
|
30
32
|
value (Any): The initial value of the widget. Defaults to None.
|
|
33
|
+
readonly (bool): True if readonly is set, else False.
|
|
31
34
|
"""
|
|
32
35
|
super().__init__()
|
|
33
36
|
self._name: str = name
|
|
34
37
|
self.page_number: int = page_number
|
|
35
38
|
self._value: Optional[Any] = value
|
|
39
|
+
self._readonly: bool = readonly
|
|
36
40
|
self._description: Optional[str] = None
|
|
37
41
|
|
|
38
42
|
@property
|
|
@@ -65,6 +69,26 @@ class Widget:
|
|
|
65
69
|
"""
|
|
66
70
|
self._value = value
|
|
67
71
|
|
|
72
|
+
@property
|
|
73
|
+
def readonly(self) -> bool:
|
|
74
|
+
"""
|
|
75
|
+
Determine whether readonly mode is set or not.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
bool: True if readonly mode is set, else False.
|
|
79
|
+
"""
|
|
80
|
+
return self._readonly
|
|
81
|
+
|
|
82
|
+
@readonly.setter
|
|
83
|
+
def readonly(self, readonly: bool) -> None:
|
|
84
|
+
"""
|
|
85
|
+
Specify if the readonly mode is set
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
readonly (bool): True if readonly mode is set, else False.
|
|
89
|
+
"""
|
|
90
|
+
self._readonly = readonly
|
|
91
|
+
|
|
68
92
|
@property
|
|
69
93
|
def description(self) -> Optional[str]:
|
|
70
94
|
"""
|
|
@@ -101,6 +125,9 @@ class Widget:
|
|
|
101
125
|
if self._value:
|
|
102
126
|
result["FieldValue"] = self._value
|
|
103
127
|
|
|
128
|
+
if self._readonly:
|
|
129
|
+
result["Readonly"] = self._readonly
|
|
130
|
+
|
|
104
131
|
if self._description is not None:
|
|
105
132
|
result["Description"] = self._description
|
|
106
133
|
|
pdffiller/widgets/checkbox.py
CHANGED
|
@@ -24,6 +24,7 @@ class CheckBoxWidget(Widget):
|
|
|
24
24
|
name: str,
|
|
25
25
|
page_number: int,
|
|
26
26
|
value: Optional[str] = None,
|
|
27
|
+
readonly: bool = False,
|
|
27
28
|
choices: Optional[List[str]] = None,
|
|
28
29
|
) -> None:
|
|
29
30
|
"""
|
|
@@ -33,9 +34,10 @@ class CheckBoxWidget(Widget):
|
|
|
33
34
|
name (str): The name of the checkbox.
|
|
34
35
|
page_number (int): The associated page index
|
|
35
36
|
value (str): The initial value of the checkbox. Defaults to None.
|
|
37
|
+
readonly (bool): True if readonly is set, else False.
|
|
36
38
|
choices: The list of available choices. Defaults to None.
|
|
37
39
|
"""
|
|
38
|
-
super().__init__(name, page_number, value)
|
|
40
|
+
super().__init__(name, page_number, value, readonly)
|
|
39
41
|
self.choices: Optional[List[str]] = choices
|
|
40
42
|
|
|
41
43
|
@property
|
pdffiller/widgets/text.py
CHANGED
|
@@ -25,6 +25,7 @@ class TextWidget(Widget):
|
|
|
25
25
|
name: str,
|
|
26
26
|
page_number: int,
|
|
27
27
|
value: Optional[str] = None,
|
|
28
|
+
readonly: bool = False,
|
|
28
29
|
max_length: Optional[int] = None,
|
|
29
30
|
) -> None:
|
|
30
31
|
"""
|
|
@@ -34,9 +35,10 @@ class TextWidget(Widget):
|
|
|
34
35
|
name (str): The name of the checkbox.
|
|
35
36
|
page_number (int): The associated page index
|
|
36
37
|
value (str): The initial value of the checkbox. Defaults to None.
|
|
38
|
+
readonly (bool): True if readonly is set, else False.
|
|
37
39
|
max_length (int): The maximum length of the text field. Defaults to None.
|
|
38
40
|
"""
|
|
39
|
-
super().__init__(name, page_number, value)
|
|
41
|
+
super().__init__(name, page_number, value, readonly)
|
|
40
42
|
self.max_length: Optional[int] = max_length
|
|
41
43
|
|
|
42
44
|
@property
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
pdffiller/__init__.py,sha256=0HtgXhEV1fKTKAcOXGcq4UsCFflDIPCDQvckshZf-1k,195
|
|
2
2
|
pdffiller/__main__.py,sha256=7NPQgZVx6VSZS7OrmyJQ_O1vL4wiSqhiILi-outwUqM,107
|
|
3
|
-
pdffiller/_version.py,sha256=
|
|
3
|
+
pdffiller/_version.py,sha256=jkVj4mFxUGMPJpsXS5J_l0Rayrz_hST2H3Fewc4-x-A,172
|
|
4
4
|
pdffiller/const.py,sha256=if_j5I8ftczpjrzZjA7idv-XpvIj1-XBF4oe6VtQvF0,434
|
|
5
5
|
pdffiller/exceptions.py,sha256=CdN93bZ0mBBS5vLxg14FYZUy4xkYqoD3_SzqtSkZr4g,1624
|
|
6
|
-
pdffiller/pdf.py,sha256=
|
|
6
|
+
pdffiller/pdf.py,sha256=kfi1tvUHI3zQJPBe5uSapwFfjI9cnNOGyLaoXQE0QXc,11723
|
|
7
7
|
pdffiller/py.typed.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
pdffiller/typing.py,sha256=suxFXOGIF07R8UhrEf-ro_vNA2pXJGfe8CX64dStXTs,954
|
|
9
9
|
pdffiller/utils.py,sha256=pmGf3QwkhKwosk_eFCauzHM-XHp_WGVQAtZlxa7taYY,827
|
|
@@ -18,19 +18,19 @@ pdffiller/cli/once_argument.py,sha256=olQvNhObObS0iXVL1YCa-_lH76SV0I4FvnlgR9roqo
|
|
|
18
18
|
pdffiller/cli/smart_formatter.py,sha256=59hwF07nKbp-P9IfbqKgMFsfbvjIw5SACCZpUF4nnuE,318
|
|
19
19
|
pdffiller/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
20
|
pdffiller/cli/commands/dump_data_fields.py,sha256=YR8aENCGkCRro0jTuuvMg2HCEos9aF81aL4SxP--_2E,2262
|
|
21
|
-
pdffiller/cli/commands/fill_form.py,sha256=
|
|
21
|
+
pdffiller/cli/commands/fill_form.py,sha256=R1xF8iHswn_FeYvE7oQOTDwpRf6BjqQ7y2pAHg6yRb4,4627
|
|
22
22
|
pdffiller/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
23
|
pdffiller/io/colors.py,sha256=QCBEWksTVNurOJQYO0zh1X_xxIOXxXmYSJhbCqnNjI8,1710
|
|
24
24
|
pdffiller/io/output.py,sha256=NWV1SabnR_kXmR8tfUKQQoQ_3RV9wqiSnHqzinQDgB0,11217
|
|
25
25
|
pdffiller/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
-
pdffiller/widgets/base.py,sha256=
|
|
27
|
-
pdffiller/widgets/checkbox.py,sha256=
|
|
26
|
+
pdffiller/widgets/base.py,sha256=omGVQsQgMa-ALESnUd3_94oVIYScAMl0SPhHC_DG8Lg,3613
|
|
27
|
+
pdffiller/widgets/checkbox.py,sha256=iijStLAsY1G4cljW3a9NxVS_8qxJewFEw-B8jU2aKXk,1711
|
|
28
28
|
pdffiller/widgets/radio.py,sha256=Db9Oc3Q8ge8qqTVPLoz3I1_SJBGyJ8KfA33ixZMr78c,1070
|
|
29
|
-
pdffiller/widgets/text.py,sha256=
|
|
30
|
-
python_pdffiller-1.
|
|
31
|
-
python_pdffiller-1.
|
|
32
|
-
python_pdffiller-1.
|
|
33
|
-
python_pdffiller-1.
|
|
34
|
-
python_pdffiller-1.
|
|
35
|
-
python_pdffiller-1.
|
|
36
|
-
python_pdffiller-1.
|
|
29
|
+
pdffiller/widgets/text.py,sha256=SiuyBvZPZ6idCmtZ_05zE26iN6Rz67OfOj1fUm98YQI,2397
|
|
30
|
+
python_pdffiller-1.1.0.dist-info/licenses/AUTHORS.rst,sha256=1_hVzMKgmoXvGgrcZC7sIbU_6PvvkB6vwqevAqzrIkQ,205
|
|
31
|
+
python_pdffiller-1.1.0.dist-info/licenses/COPYING,sha256=ADPe-bH2wYq8nFf6EPJyovzTJyl3jSPnm09mGI8FSTo,1074
|
|
32
|
+
python_pdffiller-1.1.0.dist-info/METADATA,sha256=yWwklFn1pQVt_lQ9EvY58kAXvQd8aeN-K4Aaju0nERU,4319
|
|
33
|
+
python_pdffiller-1.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
34
|
+
python_pdffiller-1.1.0.dist-info/entry_points.txt,sha256=RESKKpPPdWl0wDET96ntuFoUydALx9j0mxtbt-MEBjU,49
|
|
35
|
+
python_pdffiller-1.1.0.dist-info/top_level.txt,sha256=5MGWCBFYlu_Ax-I5PgQkV9Xw7O48maPe9z8Qj_yVPL4,10
|
|
36
|
+
python_pdffiller-1.1.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|