[
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: [email protected]
For additional commands, e-mail: [email protected]