代码之家  ›  专栏  ›  技术社区  ›  Rajasekhar Paati

itext API无法从Adobe lifecycle tool生成的动态pdf获取字段

  •  0
  • Rajasekhar Paati  · 技术社区  · 6 年前

    我可以用iText一直看到空字段,但当我使用Adobe 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]} 但不是实际的字段名。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Rajasekhar Paati    6 年前

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

        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)