Skip to content

Commit 4bdca16

Browse files
authored
ENH: Allow to update fields on many pages (#2571)
1 parent 4d3d797 commit 4bdca16

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

pypdf/_writer.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,7 @@ def _update_field_annotation(
896896

897897
def update_page_form_field_values(
898898
self,
899-
page: PageObject,
899+
page: Union[PageObject, List[PageObject], None],
900900
fields: Dict[str, Any],
901901
flags: FieldFlag = OPTIONAL_READ_WRITE_FIELD,
902902
auto_regenerate: Optional[bool] = True,
@@ -908,8 +908,10 @@ def update_page_form_field_values(
908908
If the field links to a parent object, add the information to the parent.
909909
910910
Args:
911-
page: Page reference from PDF writer where the
911+
page: `PageObject` - references **PDF writer's page** where the
912912
annotations and field data will be updated.
913+
`List[Pageobject]` - provides list of page to be processsed.
914+
`None` - all pages.
913915
fields: a Python dictionary of field names (/T) and text
914916
values (/V).
915917
flags: An integer (0 to 7). The first bit sets ReadOnly, the
@@ -925,6 +927,14 @@ def update_page_form_field_values(
925927
raise PyPdfError("No /Fields dictionary in Pdf in PdfWriter Object")
926928
if isinstance(auto_regenerate, bool):
927929
self.set_need_appearances_writer(auto_regenerate)
930+
# Iterate through pages, update field values
931+
if page is None:
932+
page = list(self.pages)
933+
if isinstance(page, list):
934+
for p in page:
935+
if PG.ANNOTS in p: # just to prevent warnings
936+
self.update_page_form_field_values(p, fields, flags, None)
937+
return None
928938
if PG.ANNOTS not in page:
929939
logger_warning("No fields to update on this page", __name__)
930940
return

tests/test_writer.py

+11-6
Original file line numberDiff line numberDiff line change
@@ -1504,14 +1504,20 @@ def test_update_form_fields(tmp_path):
15041504
page_number=0,
15051505
annotation=Link(target_page_index=1, rect=RectangleObject([0, 0, 100, 100])),
15061506
)
1507+
writer.insert_blank_page(100, 100, 0)
15071508
del writer.root_object["/AcroForm"]["/Fields"][1].get_object()["/DA"]
15081509
del writer.root_object["/AcroForm"]["/Fields"][1].get_object()["/DR"]["/Font"]
15091510
writer.update_page_form_field_values(
1510-
writer.pages[0],
1511+
[writer.pages[0], writer.pages[1]],
1512+
{"Text1": "my Text1", "Text2": "ligne1\nligne2\nligne3"},
1513+
auto_regenerate=False,
1514+
)
1515+
assert b"/Helv " in writer.pages[1]["/Annots"][1]["/AP"]["/N"].get_data()
1516+
writer.update_page_form_field_values(
1517+
None,
15111518
{"Text1": "my Text1", "Text2": "ligne1\nligne2\nligne3"},
15121519
auto_regenerate=False,
15131520
)
1514-
assert b"/Helv " in writer.pages[0]["/Annots"][1]["/AP"]["/N"].get_data()
15151521

15161522
Path(write_data_here).unlink()
15171523

@@ -1568,10 +1574,9 @@ def test_update_form_fields2():
15681574
reader.add_form_topname(file)
15691575
writer = PdfWriter(clone_from=reader)
15701576

1571-
for page in writer.pages:
1572-
writer.update_page_form_field_values(
1573-
page, myFiles[file]["usage"]["fields"], auto_regenerate=True
1574-
)
1577+
writer.update_page_form_field_values(
1578+
None, myFiles[file]["usage"]["fields"], auto_regenerate=True
1579+
)
15751580
merger.append(writer)
15761581
assert merger.get_form_text_fields(True) == {
15771582
"test1.First Name": "Reed",

0 commit comments

Comments
 (0)