如何识别PDF文件是否包含表单字段

时间:2019-07-18 22:11:51

标签: java pdf itext

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

我们正在使用iText-5.1将文件读取为字节[],并使用PdfReader打开它。然后,我们使用AcroFields()提取字段并测试是否存在。当前,即使对于我知道包含表单字段的测试PDF,getFields()。size()始终返回0 [请参见下面的代码]

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标识表单字段的方法吗?

1 个答案:

答案 0 :(得分:0)

我曾经编写自己的方法来检查表单域:

public static boolean containsPdfForms(PdfReader reader){

        PdfDictionary acroForm = (PdfDictionary)PdfReader.getPdfObjectRelease(reader.getCatalog().get(PdfName.ACROFORM));

        if(acroForm!=null){
            PdfObject forms = acroForm.get(PdfName.FIELDS);
            if(forms!=null){
                //check for indirect reference
                if( forms.isIndirect()){
                    forms = acroForm.getDirectObject(PdfName.FIELDS);
                }
                if(forms.isArray() && ((PdfArray)forms).size()>0){
                    return true;
                }
            }
        }
        return false;
    }