【问题标题】:itext API Not able to get the fields from Adobe lifecycle tool generated Dynamic pdfitext API 无法从 Adob​​e 生命周期工具生成的动态 pdf 中获取字段
【发布时间】:2018-03-02 05:55:39
【问题描述】:

我可以在 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

用下面的sn-p

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]} 但不是实际的字段名称。

【问题讨论】:

  • 您正在使用 iText 2.1.7 或更早版本,即 9 岁。你能用一个月前发布的 iText 5.1.3 或 7.1.1 重现这个吗?
  • 问题是您正在尝试使用 AcroForm API 调用读取 XFA 表单。通过从 PDF 中获取 XFA 表单,您走在了正确的轨道上,但是,您需要解析您提取的 XML,这不是 iText 将为您做的事情。
  • @MichaëlDemey 抱歉,我没明白你的意思,你能详细说明一下吗?我的要求只是从 PDF 中获取可用的字段名称。您的意思是 iText API 无法从动态 PDF 中获取字段名称?
  • @AmedeeVanGasse 我用 5.3.4 尝试过,对于上面的 sn-p,结果仍然相同,我需要尝试不同的方法吗?
  • 我让你用 5.5.13 做,而不是用 5.3.4。

标签: java itext adobe dynamicpdf


【解决方案1】:

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

    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)

【讨论】:

  • 我可以像下面这样提取输出。字段名称:TextField1 字段值:第一个字段值兄弟名称:TextField2 兄弟值:第二个字段值字段值:更新:第一个字段的内容
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 2021-10-20
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
相关资源
最近更新 更多