itext API 无法从 Adob​​e 生命周期工具生成的动态 pdf 中获取字段

itext API Not able to get the fields from Adobe lifecycle tool generated Dynamic pdf

我在使用 iText 时一直可以看到空白字段,但是当我使用 Adob​​e Acrobat 手动打开时我可以看到它们 Reader DC

com.lowagie.text.pdf.PdfReader reader = new com.lowagie.text.pdf.PdfReader(
                            new PRInputStream(dataFile));
com.lowagie.text.pdf.AcroFields af = reader.getAcroFields();
System.out.println("Field Names:" + af.getFields());

使用同一软件生成的静态 PDF 工作正常。

Expected records : 1
Actual : 0

请查找示例 PDF 文件 https://forums.adobe.com/servlet/JiveServlet/download/2051245-11361/ExpandingTextBox.pdf

使用以下代码段

com.lowagie.text.pdf.AcroFields af = reader.getAcroFields();
System.out.println("Field Names:"+af.getXfa().getTemplateSom().getName2Node().toString()); 

我能看到 Field Names:{form1[0].#subform[0].TextFieldContainer[0].TextField1[0]=[field: null]} 但不是实际的字段名称。

下面的代码能够从表单中提取字段名称。

    String fieldName = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getLocalName();
    String str = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getTextContent();
    String SiblingName = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getNextSibling().getLocalName();
    String SiblingValue = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getNextSibling().getTextContent();
    System.out.println("Field Name:"+fieldName);
    System.out.println("Field Value:"+str);
    System.out.println("Sibling Name:"+SiblingName);
    System.out.println("Sibling Value:"+SiblingValue);
    //Set the values back to form
    form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().setTextContent("Updated: Content for First Field");
    String updatedValue = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getTextContent();
    System.out.println("Field Value:"+updatedValue);

我们可以看到正确的字段和值,我可以将值设置回表单,但我没有尝试重新生成表单,但这会起作用。

并且这个用例适用于所有版本的 itext(也适用于 2.1.7)