【发布时间】: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