Как получить значения и ключи всех элементов управления в динамическом 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:
Обновление 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.