Hi Maruan,

the document is free to use. Acrobat Preflight found no syntax errors. Which 
tool are you using to check it?

I'll find out which program was used to create the document and let you know if 
I find out.

Kind regards
Markus


> -----Ursprüngliche Nachricht-----
> Von: [email protected] <[email protected]>
> Gesendet: Dienstag, 28. April 2026 12:45
> An: [email protected]
> Cc: Markus Mensinger <[email protected]>
> Betreff: Re: Setting checkbox value fails when field has empty /Opt array
> 
> Hello Markus,
> 
> we can look at making PDFBox handling this. OTOH the file itself is not spec
> compliant. Do you know what tool has generated this PDF?.
> 
> "... Each entry shall be a text string representing the on state of the 
> corresponding
> widget annotation.". We can look at handling that gracefully.
> 
> When creating a ticket can we add the file to the ticket?
> 
> BTW: the workaround you documented looks fine for now
> 
> BR
> Maruan
> 
> 
> Am Dienstag, dem 28.04.2026 um 10:12 +0000 schrieb Markus Mensinger via
> users:
> >
> >
> >
> > Hi PdfBox Team,
> >
> > we have a problem with a customer document.
> > Download:
> > pdf-Symbol form_with_checkbox.pdf
> > Link valid until 08.05.
> >
> > Here is a bug report generated with Claude Sonnet.
> >
> >
> > Component: PDFBox - Interactive Forms (AcroForm) Affects Version:
> > 3.0.7
> > Type: Bug
> >
> >
> > SUMMARY
> >
> > When a checkbox field in an AcroForm PDF contains an empty /Opt array
> > (/Opt []) in its field dictionary, calling PDCheckBox.setValue("Yes")
> > throws an IllegalArgumentException, even though "Yes" is a perfectly
> > valid export value defined by the field's appearance states.
> >
> > The same field can be checked and unchecked without any error using
> > Adobe Acrobat products (Acrobat Reader, Acrobat Pro), which treat the
> > empty /Opt array as if it were absent. This confirms that the PDF is
> > valid and the issue is specific to PDFBox's validation logic.
> >
> >
> > ERROR MESSAGE
> >
> > java.lang.IllegalArgumentException: value 'Yes' is not a valid option
> > for the field Check_Info_Post_andere, valid values are: [] and Off
> >
> >
> > ROOT CAUSE
> >
> > The validation in PDCheckBox.setValue() checks the /Opt array when it
> > is present.
> > If the array exists but is empty, all non-"Off" values are rejected -
> > including the export value "Yes" that is defined in the field's
> > appearance dictionary (/AP).
> > The empty /Opt array should either be ignored or treated as absent -
> > which is exactly what Adobe Acrobat does.
> >
> >
> > STEPS TO REPRODUCE
> >
> > import org.apache.pdfbox.Loader;
> > import org.apache.pdfbox.cos.COSArray; import
> > org.apache.pdfbox.cos.COSName; import
> > org.apache.pdfbox.pdmodel.PDDocument;
> > import org.apache.pdfbox.pdmodel.interactive.form.PDCheckBox;
> > import org.apache.pdfbox.pdmodel.interactive.form.PDField;
> >
> > import java.io.File;
> >
> > public class CheckBoxBugDemo {
> >
> >     public static void main(String[] args) {
> >         try (PDDocument doc = Loader.loadPDF(new
> > File("form_with_checkbox.pdf"))) {
> >
> >             PDField field = doc.getDocumentCatalog()
> >                                .getAcroForm()
> >                                .getField("Check_Info_Post_andere");
> >
> >             System.out.println("Field type : " +
> > field.getFieldType());
> >             System.out.println("/Opt entry : " +
> >                 field.getCOSObject().getItem(COSName.OPT));  //
> > prints: COSArray{}
> >
> >             // Workaround: manually remove the empty /Opt array before
> > setting value
> >             COSArray opt = (COSArray)
> > field.getCOSObject().getDictionaryObject(COSName.OPT);
> >             if (opt != null && opt.size() == 0) {
> >                 field.getCOSObject().removeItem(COSName.OPT);
> >                 System.out.println("/Opt removed (was empty)");
> >             }
> >
> >             // Without the workaround above, this line throws
> > IllegalArgumentException:
> >             // "value 'Yes' is not a valid option ... valid values
> > are: [] and Off"
> >             ((PDCheckBox) field).setValue("Yes");
> >
> >             System.out.println("Value set successfully: " +
> > ((PDCheckBox) field).getValue());
> >
> >         } catch (Exception e) {
> >             e.printStackTrace();
> >         }
> >     }
> > }
> >
> >
> > EXPECTED BEHAVIOR
> >
> > An empty /Opt array should be treated the same as a missing /Opt
> > entry. The value "Yes" (or any export value present in the field's
> > appearance states) should be accepted. This is consistent with how
> > Adobe Acrobat Reader and Acrobat Pro handle this case.
> >
> >
> > ACTUAL BEHAVIOR
> >
> > PDCheckBox.setValue("Yes") throws IllegalArgumentException because the
> > empty /Opt array causes the valid-options check to return an empty
> > list, which excludes "Yes".
> >
> >
> > WORKAROUND
> >
> > Remove the empty /Opt entry from the field dictionary before calling
> > setValue():
> >
> >     COSArray opt = (COSArray)
> > field.getCOSObject().getDictionaryObject(COSName.OPT);
> >     if (opt != null && opt.size() == 0) {
> >         field.getCOSObject().removeItem(COSName.OPT);
> >     }
> >     ((PDCheckBox) field).setValue("Yes");
> >
> >
> > SUGGESTED FIX
> >
> > In the PDFBox source, the method that validates allowed values for a
> > checkbox should skip or ignore the /Opt array when it is present but
> > empty (size() == 0), bringing the behavior in line with Adobe Acrobat.
> >
> >
> > Kind regards
> > Markus
> >

Reply via email to