Как получить значения и ключи всех элементов управления в динамическом PDF, используя iText?

Я пытался извлечь все поля из динамической формы. Но я заметил, что код работает для некоторых форм, а не для других. Хуже того, код работал по-разному для той же формы, но двух разных загруженных файлов. Но покопавшись много, я обнаружил, что те формы, которые правильно, были свежеприготовленными. Ни одна деталь не была заполнена из PDF Software(Adobe Reader). Кроме того, если форма была заполнена и сохранена, миниатюра формы в проводнике изменилась бы с. Фрагмент кода выглядит следующим образом:

PdfDocument pdfDoc;
pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
PdfDictionary perms = pdfDoc.getCatalog().getPdfObject().getAsDictionary(PdfName.Perms);
    if (perms != null) {
        perms.remove(new PdfName("UR"));
        perms.remove(PdfName.UR3);
        if (perms.size() == 0) {
            pdfDoc.getCatalog().remove(PdfName.Perms);
        }
    }
    PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);

    List<String> result = new ArrayList<String>(form.getFormFields().keySet());

    Map<String, PdfFormField> fields = form.getFormFields();

Ниже изображение для той же формы, но загружено дважды. Тот, с красочным эскизом, не заполнен. Другое заполняется с помощью Adobe Reader и сохраняется, а при сохранении миниатюра исчезает.

Я подозреваю, что при сохранении формы может быть установлен флаг. Любая помощь приветствуется. Другое странное наблюдение - несоответствие количества параметров в объекте PdfCatalog для двух вышеуказанных форм. Запись для свойства 'NeedsRendering' присутствовала в неисправном PDF, а в остальном - для рабочего PDf. Я приложил скриншоты для рабочего PDF во время сеанса отладки.

hrsa_working_form:

hrsa_working_form

Обновление 1@Browno, извиняюсь за запутанный вопрос из разума новичка. Я разместил скриншоты из RUT-кода itext для ключа '/AcroForm'. Изучая ответы для XFAForm, я узнал, как их заполнить. Но уплощение их вызывает исключение. Я использовал pdfxfa jar по лицензии AGPL. Мне не хватает знаний XFAFlattener и его свойств, используемых в классе XFAFlattenerProperties. Ниже приведен снимок кода:

public void fillData2(String src, String xml, String dest, String newDest){
        throws IOException, ParserConfigurationException, SAXException, InterruptedException {
    PdfReader reader = new PdfReader(src);
    reader.setUnethicalReading(true);
    PdfDocument pdfDoc = new PdfDocument(reader, new PdfWriter(dest), new StampingProperties().useAppendMode());
    PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);

    List<String> result = new ArrayList<String>(form.getFormFields().keySet());
    System.out.println(result.size());
    XfaForm xfa = form.getXfaForm();
    xfa.fillXfaForm(new FileInputStream(xml));
    xfa.write(pdfDoc);
    //form.flattenFields(); throws exception
    pdfDoc.close();
    FileInputStream fis = new FileInputStream(dest);
    FileOutputStream fos = new FileOutputStream(newDest);
    XFAFlattener xfaFlattener = new XFAFlattener();
    xfaFlattener.setFontSettings(new XFAFontSettings().setEmbedExternalFonts(true));
    xfaFlattener.flatten(fis, fos);
    fis.close();
    fos.close();
}

Обнаружено исключение:

Exception in thread "main" java.lang.NoSuchFieldError: FONTFAMILY
at com.itextpdf.tool.xml.xtra.xfa.font.XFAFontProvider.addFonts(XFAFontProvider.java:117)
at com.itextpdf.tool.xml.xtra.xfa.font.XFAFontProvider.<init>(XFAFontProvider.java:56)
at com.itextpdf.tool.xml.xtra.xfa.XFAFlattener.initFlattener(XFAFlattener.java:643)
at com.itextpdf.tool.xml.xtra.xfa.XFAFlattener.flatten(XFAFlattener.java:201)
at com.itextpdf.tool.xml.xtra.xfa.XFAFlattener.flatten(XFAFlattener.java:396)
at com.mycompany.kitext.kitext.fillData2(kitext.java:153)
at com.mycompany.kitext.kitext.main(kitext.java:81)

Также, согласно комментарию @mkl, я приложил PDF-формы:

https://drive.google.com/file/d/0B6w278NcMSCrZDZoZklmVTNuOWc/view?usp=sharing
//iText RUPS /AcroForm Snapshot
https://drive.google.com/file/d/0B6w278NcMSCrZ1Q1VHc5YzY4UG8/view?usp=sharing
//Form filled with fillXfaForm()
//running low on reputation

Форма заполнена с XFA

Я также прочитал заметки о выпуске pdfXFA для разработчиков. Но не смог найти похожий пример. Спасибо за вашу помощь и отличную работу над iText.

0 ответов

Другие вопросы по тегам