如何使用iText获取动态pdf中所有控件的值和键?

如何使用iText获取动态pdf中所有控件的值和键?,itext,pdf-generation,itext7,xfa,Itext,Pdf Generation,Itext7,Xfa,我试图从动态表单中提取所有字段。但我注意到,代码对某些表单有效,而对其他表单无效。最糟糕的是,对于相同的表单,代码的工作方式不同,但下载的文件不同。但经过大量挖掘,我发现那些正确的形式,是新加工的。PDF软件(Adobe Reader)甚至没有填写任何细节。此外,如果表单已填充并保存,则浏览器中表单的缩略图将从更改为。代码片段如下所示: PdfDocument pdfDoc; pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(d

我试图从动态表单中提取所有字段。但我注意到,代码对某些表单有效,而对其他表单无效。最糟糕的是,对于相同的表单,代码的工作方式不同,但下载的文件不同。但经过大量挖掘,我发现那些正确的形式,是新加工的。PDF软件(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();
用XFA填写的表格


我还阅读了pdfXFA开发者发行说明。但找不到类似的例子。感谢您的帮助和在iText上所做的出色工作。

我想我们陷入了困境。我认为您对PDF中存在的不同类型的表单感到困惑,由于这种困惑,您的问题非常困惑。对你的问题做出一个好的回答可以消除一些困惑,但是很难给出一个好的答案,因为你的问题太令人困惑了。你为什么不后退一步呢。下载一个名为iText-RUPS的工具,并在该工具中打开PDF。导航到目录,并搜索
/AcroForm
键。发布所见内容的屏幕截图。了解基于AcroForm技术的交互式表单、使用XML表单体系结构(XFA)的表单和混合表单(AcroForm和XFA都存在)之间的巨大差异非常重要。你可能应该先阅读,然后重写你的问题,这样对那些看不懂你的想法的人来说就不会那么困惑了。如果你想要具体的帮助,你最好分享这些有问题的PDF。我想我们陷入了某种困境。我认为您对PDF中存在的不同类型的表单感到困惑,由于这种困惑,您的问题非常困惑。对你的问题做出一个好的回答可以消除一些困惑,但是很难给出一个好的答案,因为你的问题太令人困惑了。你为什么不后退一步呢。下载一个名为iText-RUPS的工具,并在该工具中打开PDF。导航到目录,并搜索
/AcroForm
键。发布所见内容的屏幕截图。了解基于AcroForm技术的交互式表单、使用XML表单体系结构(XFA)的表单和混合表单(AcroForm和XFA都存在)之间的巨大差异非常重要。你可能应该先阅读,然后重写你的问题,这样就不会让那些看不懂你的想法的人感到困惑。如果你想得到具体的帮助,最好与别人分享你的问题。
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)
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