gpt4 book ai didi

java - 如何识别 PDF 文件是否包含表单域

转载 作者:搜寻专家 更新时间:2023-11-01 03:45:45 26 4
gpt4 key购买 nike

我们允许用户上传 PDF 文档供我们存储。我们警告用户在上传 PDF 之前必须将其拼合,但许多人仍然上传包含表单字段的 PDF 文档。我们希望通过在上传到我们的存储之前验证 PDF 文件来防止这种情况。

我们使用 iText-5.1 将文件读取为 byte[] 并使用 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 识别表单字段?

最佳答案

您使用了正确的方法来识别(有效的)PDF 文件是否包含表单域。您描述的问题是如何处理不符合标准的 PDF 文件,这些文件也包含表单字段但确实存在一些问题,例如缺少 AcroField 字典、缺少 Fields 数组或其他。您有三种可能性:

  1. 忽略这些情况,因为它们是边缘情况
  2. 确定问题(例如使用 Acrobat Preflight)并编写一个方法来检查对于那些情况。您在下面找到的一个示例,我在其中编写了一个方法识别缺少 Fields 数组的文档。
  3. 只需将所有上传的文件拼合起来即可。

以下代码检查您的方法返回 true 但仍包含表单字段的文档。这些字段也将显示在 *dobe reader 中。

   public boolean containsFormFields2() {

AcroFields acroFields = reader.getAcroFields();

if (acroFields.getFields() == null || acroFields.getFields().size() == 0) {
// recheck "manually"
for (int i = 1; i <= super.reader.getNumberOfPages(); i++) {
PdfDictionary page = super.reader.getPageN(i);
PdfArray annots = page.getAsArray(PdfName.ANNOTS);

if (annots != null) {
// check for form fields in general
for (int j = 0; j < annots.size(); j++) {
PdfDictionary po2 = (PdfDictionary) annots.getDirectObject(j);

// FT key only exists for form fields
PdfName type = (PdfName) po2.get(PdfName.FT);
if (type != null) {
return true;
}
}
}
}
return false;
}
else{
return true;
}
}

关于java - 如何识别 PDF 文件是否包含表单域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57103237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com