diff --git a/pypdf/_doc_common.py b/pypdf/_doc_common.py index 9d92ebb0ea..fa3ca31300 100644 --- a/pypdf/_doc_common.py +++ b/pypdf/_doc_common.py @@ -599,7 +599,7 @@ def _build_field( fileobj.write("\n") retval[key] = Field(field) obj = retval[key].indirect_reference.get_object() # to get the full object - if obj.get(FA.FT, "") == "/Ch": + if obj.get(FA.FT, "") == "/Ch" and obj.get(NameObject(FA.Opt)): retval[key][NameObject("/_States_")] = obj[NameObject(FA.Opt)] if obj.get(FA.FT, "") == "/Btn" and "/AP" in obj: # Checkbox diff --git a/tests/test_reader.py b/tests/test_reader.py index f7ac48499d..53527cad71 100644 --- a/tests/test_reader.py +++ b/tests/test_reader.py @@ -418,7 +418,7 @@ def test_get_page_of_encrypted_file(pdffile, password, should_fail): "crazyones.pdf", {}, None, - ), + ) ], ) def test_get_form(src, expected, expected_get_fields, txt_file_path): @@ -448,6 +448,21 @@ def test_get_form(src, expected, expected_get_fields, txt_file_path): ] +@pytest.mark.enable_socket +def test_reading_choice_field_without_opt_key(): + """Tests reading a choice field in a PDF without an /Opt key.""" + url = "https://github.com/user-attachments/files/23853677/Musterservicevertrag-HNRAGB_Okt2022-Blanko.pdf" + reader = PdfReader(BytesIO(get_data_from_url(url, name="Musterservicevertrag-HNRAGB_Okt2022-Blanko.pdf"))) + fields = reader.get_fields() + + tn_anrede = fields.get("TN_Anrede") + assert tn_anrede is not None + + # Ensure that parsing of a choice field without /Opt key worked + tn_anrede_opt = tn_anrede.get("/Opt") + assert tn_anrede_opt is None + + @pytest.mark.parametrize( ("src", "page_number"), [