Hi

Thanks for the quick reply. This is exactly the approach I wanted to take
for my next option.

On Sun, Jun 28, 2015 at 8:54 PM, Tilman Hausherr <[email protected]>
wrote:

> Here's some code I have from working on
> https://issues.apache.org/jira/browse/PDFBOX-2249 with the file
> JMACTest.pdf that is in that issue. While that issue was about listbox
> controls, the PDF file JMACTest.pdf does also have some radio and checkbox
> elements. Of the attached code, I tested changing "Check Box1" and "Group1"
> and it worked as expected. What I can see is that PDCheckbox uses a
> different approach than yours, so it may be worth a try. The other ones use
> all the same approach, i.e. setValue().
>
> What I would also suggest:
> Take one of the things that don't work. Then open the "old" and the "new"
> PDF with an editor like NOTEPAD++, search for the field name and look what
> the differences are. (And have you verified that the template PDF does
> really have the same field names, or the same type?)
>
> You could of course, while waiting for our expert, try the 2.0 version
> (see https://pdfbox.apache.org/2.0/getting-started.html ) and create a
> 2nd project and try to see whether it gets better.
>
> Tilman
>
>
> package testpdfbox18;
>
>
> import java.io.File;
> import java.io.IOException;
> import java.util.HashMap;
> import java.util.Iterator;
> import java.util.List;
> import java.util.Map;
>
> import org.apache.pdfbox.pdmodel.PDDocument;
> import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
> import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
> import org.apache.pdfbox.pdmodel.interactive.form.PDCheckbox;
> import org.apache.pdfbox.pdmodel.interactive.form.PDChoiceField;
> import org.apache.pdfbox.pdmodel.interactive.form.PDField;
> import org.apache.pdfbox.pdmodel.interactive.form.PDRadioCollection;
> import org.apache.pdfbox.pdmodel.interactive.form.PDTextbox;
>
> public class AcroFormTest
> {
>
>     public static void fillPDFForm(String inputFile, String outputFile,
>             Map<String, String> fieldValues, boolean
> ignoreUnknownFieldTypes) throws Exception
>     {
>         File myFile = new File(inputFile);
>         PDDocument pdDoc;
>         String fieldName = null;
>         String fieldType;
>         try
>         {
>             pdDoc = PDDocument.loadNonSeq(myFile, null);
>
>             PDDocumentCatalog pdCatalog = pdDoc.getDocumentCatalog();
>             PDAcroForm pdAcroForm = pdCatalog.getAcroForm();
>             pdAcroForm.setCacheFields(true);
>             List<PDField> l = pdAcroForm.getFields();
>             Iterator<PDField> it = l.iterator();
>
>             while (it.hasNext())
>             {
>                 PDField f = it.next();
>                 fieldName = f.getFullyQualifiedName();
>                 fieldType = f.getClass().getSimpleName();
>                 System.out.println(fieldType);
>                 System.out.println(f.getClass().getName());
>                 String fieldValue;
>                 if (f instanceof PDTextbox)
>                 {
>                     fieldValue = fieldValues.get(fieldName);
>                     if (fieldValue != null)
>                     {
>                         f.setValue(fieldValue);
>                     }
>
>                 } // end PDTextbox
>                 else if (f instanceof PDCheckbox)
>                 {
>                     fieldValue = fieldValues.get(fieldName);
>                     if (("TRUE".equalsIgnoreCase(fieldValue))
>                             || ("CHECKED".equalsIgnoreCase(fieldValue))
>                             || ("YES".equalsIgnoreCase(fieldValue)))
>                     {
>                         ((PDCheckbox) f).check();
>                     }
>                     else
>                     {
>                         ((PDCheckbox) f).unCheck();
>                     }
>                 } // end PDCheckbox
>                 else if (f instanceof PDChoiceField)
>                 {
>                     fieldValue = fieldValues.get(fieldName);
>                     if (fieldValue != null)
>                     {
>                         f.setValue(fieldValue);
>                     }
>                 } // PDChoiceField
>                 else if (f instanceof PDRadioCollection)
>                 {
>                     fieldValue = fieldValues.get(fieldName);
>                     if (fieldValue != null)
>                     {
>                         f.setValue(fieldValue);
>                     }
>                 } // end PDRadioCollection
>                 else
>                 {
>                     if (!ignoreUnknownFieldTypes)
>                     {
>                         throw new Exception("Fields of type [" + fieldType
> + "] are unsupported");
>                     }
>                 }
>
>             }
>

However, I do get the same dreaded:

org.apache.pdfbox.pdmodel.interactive.form.PDRadioCollection cannot be cast
to org.apache.pdfbox.pdmodel.interactive.form.PDCheckbox

as I get with the following code:

        HashMap<String, PDAcroForm> pdAcroFormMap = new HashMap<>();
        @SuppressWarnings("unchecked")
        List<PDField> oldFields =
oldPDF.getDocumentCatalog().getAcroForm().getFields();
        for (PDField pdField : oldFields) {
            pdAcroFormMap.put(pdField.getFullyQualifiedName(),
pdField.getAcroForm());
            pdField.getAcroForm().exportFDF();
        }

        @SuppressWarnings("unchecked")
        List<PDField> templateFields =
oldPDF.getDocumentCatalog().getAcroForm().getFields();
        for (PDField pdField : templateFields) {
            
pdField.setAcroForm(pdAcroFormMap.get(pdField.getFullyQualifiedName()));
        }

This is probably due to the class definitions of PDRadioCollection and
PDCheckbox.

I'll keep investigating ...

Best regards
Roberto

Reply via email to