Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pypdf/_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -1027,7 +1027,7 @@ def update_page_form_field_values(
appearance_stream_obj = normal_ap.get(v)
# Other cases will be updated through the for loop
annotation[NameObject(AA.AS)] = v
annotation[NameObject(FA.V)] = v
parent_annotation[NameObject(FA.V)] = v
elif (
parent_annotation.get(FA.FT) == "/Tx"
or parent_annotation.get(FA.FT) == "/Ch"
Expand Down
44 changes: 44 additions & 0 deletions tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import pytest

from pypdf import PdfReader, PdfWriter
from pypdf.generic import NameObject
from tests import get_data_from_url


Expand All @@ -24,3 +25,46 @@ def test_form_button__v_value_should_be_name_object():

# Wrong: `/V (/On)`.
assert b"\n/V /On\n" in stream.getvalue()


@pytest.mark.enable_socket
def test_radio_button_handling():
url = "https://github.com/user-attachments/files/23957527/TemplateReproBug.pdf"
name = "issue3549.pdf"
writer = PdfWriter(clone_from=BytesIO(get_data_from_url(url, name=name)))
writer.update_page_form_field_values(
writer.pages[0],
{"Radio Button 3": "/1"},
)

radio_button3 = writer.get_fields()["Radio Button 3"]
assert radio_button3 == {
"/T": "Radio Button 3",
"/FT": "/Btn",
"/TU": "Reason for Enrollment",
"/Ff": 49152,
"/V": "/1",
"/Kids": [writer.get_object(17).indirect_reference, writer.get_object(52).indirect_reference],
"/Opt": ["New", "Add Dependant"],
"/_States_": ["/0", "/1"]
}
assert isinstance(radio_button3["/V"], NameObject), type(radio_button3["/V"])

writer.update_page_form_field_values(
writer.pages[0],
{"Radio Button 3": "/0"},
)
radio_button3 = writer.get_fields()["Radio Button 3"]
assert radio_button3 == {
"/T": "Radio Button 3",
"/FT": "/Btn",
"/TU": "Reason for Enrollment",
"/Ff": 49152,
# TODO: Should be `/0`. Issue: https://github.com/py-pdf/pypdf/issues/3549
# Then we might want to use a parametrized function instead of repeating everything.
"/V": "/Off",
"/Kids": [writer.get_object(17).indirect_reference, writer.get_object(52).indirect_reference],
"/Opt": ["New", "Add Dependant"],
"/_States_": ["/0", "/1"]
}
assert isinstance(radio_button3["/V"], NameObject), type(radio_button3["/V"])
Loading