[ 
https://issues.apache.org/jira/browse/PDFBOX-2617?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14742060#comment-14742060
 ] 

Ilya Sazonov commented on PDFBOX-2617:
--------------------------------------

Here's how I used to collect possible values for a group of checkboxes before 
1.8.9 . To continue using this code I have to check if checkbox has kids and if 
it does - convert it to PDRadioButton

public List<String> getValuesWithWorkaround(PDField group) {
    try {
        List<String> fieldValues = new ArrayList<String>();

        List<COSObjectable> kids = group.getKids();

        for (int i = 0;kids != null && i < kids.size(); i++) {
            COSObjectable kid = kids.get(i);

            if (kid instanceof PDCheckbox) {
                if (!fieldValues.contains(((PDCheckbox) kid).getOnValue())) {
                    fieldValues.add(((PDCheckbox) kid).getOnValue());
                }
            }
        }
        return fieldValues;
    }
    catch(IOException e) {
        throw new RuntimeException("trouble getting values");
    }
}

And here's how I have to do it now 

private static final COSName KEY = COSName.getPDFName("AS");
private static final COSName OFF_VALUE = COSName.getPDFName("Off");

public List<String> getValues(PDCheckbox checbox) {
    try {
        List<String> fieldValues = new ArrayList<String>();

        List<COSObjectable> kids = checbox.getKids();

        List<PDAnnotationWidget> widgets = new ArrayList<PDAnnotationWidget>();

        for (int i = 0;kids != null && i < kids.size(); i++) {
            COSObjectable kid = kids.get(i);

            if (kid instanceof PDAnnotationWidget) {
                widgets.add((PDAnnotationWidget) kid);
            }
        }


        for (PDAnnotationWidget widget : widgets)
        {
            COSDictionary ap = (COSDictionary) 
widget.getDictionary().getDictionaryObject(COSName.getPDFName("AP"));
            widget.getDictionary().setItem(KEY, COSName.getPDFName("Yes"));
            COSBase n = ap.getDictionaryObject(COSName.getPDFName("N"));

            //N can be a COSDictionary or a COSStream
            if( n instanceof COSDictionary )
            {
                for( COSName key :((COSDictionary)n).keySet() )
                {
                    if( !key.equals( OFF_VALUE) )
                    {
                        String onValue = key.getName();
                        if (!fieldValues.contains(onValue))
                            fieldValues.add(onValue);
                    }
                }
            }
        }

        return fieldValues;

    }
    catch(IOException e) {
        throw new RuntimeException("trouble getting values");
    }
}

Please note, that KEY and OFF_VALUE are originally static private fields for 
checkbox and I think this code should be a part of of PDCheckbox class. And 
PDCheckbox doesn't have such methods even in 2.0. It look like 2.0 treats 
checkbox as a single entity with single value, which is wrong.

I have made a demo project with a class which has 2 methods and unit test.


> Group of Button fields treated as a Radio Button group
> ------------------------------------------------------
>
>                 Key: PDFBOX-2617
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-2617
>             Project: PDFBox
>          Issue Type: Bug
>          Components: AcroForm
>    Affects Versions: 1.8.8, 2.0.0
>         Environment: Windows 7, Eclipse, JRE 1.8.0_25
>            Reporter: Gilad Denneboom
>            Assignee: Maruan Sahyoun
>            Priority: Minor
>             Fix For: 1.8.9, 2.0.0
>
>         Attachments: test.pdf
>
>
> When creating a group of identical button fields PDFBox reads them as a group 
> of radio-button fields, with each widget as a check-box, which is incorrect.
> The main field has the class PDRadioCollection and each kid is a PDCheckbox.
> Run the following code on the attached file:
> PDDocument doc = PDDocument.load( new File("test.pdf") );
> PDAcroForm form = doc.getDocumentCatalog().getAcroForm();
> List<PDField> fields = form.getFields();
> for (PDField f: fields) {
>       System.out.println("Name:" + f.getFullyQualifiedName());
>       System.out.println("Type:" + f.getFieldType());
>       System.out.println("Class:" + f.getClass());
>       List<COSObjectable> kids = f.getKids();
>       if (kids!=null) {
>               for (COSObjectable c : kids) {
>                       System.out.println("Kid Class: " + c.getClass());       
>                                         
>               }
>                       
>       }
> }
> The results are:
> Name:Test
> Type:Btn
> Class:class org.apache.pdfbox.pdmodel.interactive.form.PDRadioCollection
> Kid Class: class org.apache.pdfbox.pdmodel.interactive.form.PDCheckbox
> Kid Class: class org.apache.pdfbox.pdmodel.interactive.form.PDCheckbox



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org
For additional commands, e-mail: dev-h...@pdfbox.apache.org

Reply via email to