【问题标题】:Apache PDFBox - Not able to read all fields from PDFApache PDFBox - 无法从 PDF 读取所有字段
【发布时间】:2019-01-17 11:59:03
【问题描述】:

我们正在尝试读取 PDF 并在其中动态填充值。根据传入的请求,我们运行一些规则并派生要使用的 PDF,然后动态填充值。我们使用的是 Apache PDFBox 2.0.11 版,出于某种原因,我们遇到了特定 PDF 模板的问题。我们无法读取此特定模板的某些字段,并且生成的 PDF 不完整。想知道是否与原始 PDF 本身有关。这是我们用来读取字段并填充它的代码 sn-p。

PDDocument pdfTemplate = PDDocument.load(inputStream);
PDDocumentCatalog docCatalog = pdfTemplate.getDocumentCatalog();
PDAcroForm  acroForm = docCatalog.getAcroForm();
acroForm.setXFA(null);
COSArrayList<PDField> list = (COSArrayList<PDField>) acroForm.getFields();
for (PDField field : list) {
     field.setReadOnly(true);
      logger.debug("Field name "+field.getFullyQualifiedName())))
      //use logic to populate value by calling field.setValue();
}

当我们尝试打印每个字段名称时,我们发现超过 30% 的字段丢失。任何人都可以帮助解决它吗? PDF 有 15 页,有不同的问题。如果问题出在原始 PDF 本身,那么可能是什么原因导致无法读取某些字段?

【问题讨论】:

  • 请阅读getFields()的javadoc并更新代码。如果这没有帮助,请分享 PDF 并提及一个被忽略的字段。
  • 您好 Tilam,感谢您的回复。我仔细检查了 java doc 并试图检索孩子,但没有帮助。不幸的是,我无法在任何地方附加 PDF,因为它可能违反公司的政策。你有什么建议我检查的吗
  • 一种可能性是 PDF 只有小部件注释(与页面相关),而没有字段(与文档相关,每个字段可以有 1-n 个小部件)。使用 PDFBox PDFDebugger 打开文件。在页面中,将鼠标移动到字段区域。字段名称是否出现在状态栏中?另一个想法:在菜单中,单击“查看”、“显示内部结构”,然后在树中转到 Root/AcroForm/Fields。然后查看整个结构并尝试找到您的领域。你找到了吗?
  • 您好 Tilman,我尝试了您的建议,但在 Root/AcroForm/Fields 下看不到字段。在那里找不到字段可能是什么原因?我们需要修复 PDF 本身吗?
  • 可能是 XFA 表格。 Pdfbox 无法处理这些。但是你写了你得到了一些字段然后你应该看到它们

标签: java apache pdf pdf-generation pdfbox


【解决方案1】:

您可能在该表单上有分层字段。请尝试类似下面的代码...

PDDocument pdfTemplate = PDDocument.load(inputStream);
PDDocumentCatalog docCatalog = pdfTemplate.getDocumentCatalog();    
PDAcroForm  acroForm = docCatalog.getAcroForm();
PDFieldTree fieldTree = acroForm.getFieldTree();
Iterator<PDField> fieldTreeIterator = fieldTree.iterator();
while (fieldTreeIterator.hasNext()) {
    PDField field = fieldTreeIterator.next();
    if (field instanceof PDTerminalField) {
        String fullyQualifiedName = field.getFullyQualifiedName();
        logger.debug("Field name "+fullyQualifiedName);
    }
}

PDAcroForm.getFields() 只获取根字段,而不是它们的子字段。 PDAcroForm.getFieldTree() 获取所有字段,但是您需要在设置值之前测试它们是否是终端。非终端字段不能有值,也没有与之关联的小部件(页面上的表示)。如果完全限定名称中有句点,您就会知道这是问题所在。句点代表层次结构。

【讨论】:

  • 感谢 joelgeraci 的建议。使用 FieldTree 也没有帮助。
  • 你能把 PDF 贴在某个地方让我看看细节吗?
  • joelgeric,不幸的是,我无法在任何地方附加 PDF,因为它可能违反公司的政策。你有什么建议我检查的吗?
  • 您能否将底层页面替换为空白页面,然后发布仅包含表单字段的 PDF?
【解决方案2】:

重新构建整个 PDF 后问题已解决。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多