【发布时间】:2019-11-27 21:41:57
【问题描述】:
我们允许用户上传 PDF 文档供我们存储。我们警告用户在上传 PDF 之前必须将其拼合,但许多人仍然会上传包含表单域的 PDF 文档。我们希望通过在上传到我们的存储之前验证 PDF 文件来防止这种情况发生。
我们正在使用 iText-5.1 将文件作为字节 [] 读取并使用 PdfReader 打开它。然后我们使用 AcroFields() 提取字段并测试是否存在。目前 getFields().size() 总是返回 0 [见下面的代码],即使是我知道包含表单字段的测试 PDF。
PdfReader reader = new PdfReader(bytes);
AcroFields fields = reader.getAcroFields()
boolean hasFormFields =
(fields != null && fields.getFields() != null && fields.getFields().size() > 0);
if (hasFormFields) {
// Report Error to User - throw exception, etc.
}
当 PDF 包含表单域元素时,我希望 getFields().size() 大于 0。还有其他方法可以使用 Java 和 iText 识别表单字段吗?
【问题讨论】:
-
您显示的代码应该适用于所有 acroform 表单元素。您的示例文件是纯 xfa 格式吗?
-
另一种可能性是你做扁平化,因为里面有表单域。但这可能取决于您的用户。 (我们的一些用户无法拼合他们的文档...)
-
@mkl 如何以编程方式识别 PDF 文件是否为“纯 xfa 格式”?那是 META-Data 中我能读懂的东西吗?
-
要检查 XFA,请使用
fields.getXfa().isXfaPresent()。要检查 AcroForm,请使用您的代码。还有一种您可能希望避免的情况:当没有 AcroForm 字典或只有一个没有 Fields 数组或只有一个空 Fields 数组。要检查它们,您必须遍历文档页面并检查其所有注释的 Subtype 值。 -
我终于明白了——这些 PDF 文件真的是 XFA,这就是我找不到 AcroForms 的原因。我添加了代码以排除 XFA 表单,这解决了我的问题。感谢大家对此的帮助。