【问题标题】:Using pdfbox to get form field values使用 pdfbox 获取表单字段值
【发布时间】:2014-05-06 14:18:20
【问题描述】:

我是第一次使用 pdfbox。现在我在Pdf网站上读到一些东西

总结一下,我有一个这样的 pdf:

只是我的文件有很多不同的组件(textField、RadionButton、CheckBox)。对于这个 pdf,我必须阅读这些值:Mauro,Rossi,MyCompany。现在我写了以下代码:

PDDocument pdDoc = PDDocument.loadNonSeq( myFile, null );
PDDocumentCatalog pdCatalog = pdDoc.getDocumentCatalog();
PDAcroForm pdAcroForm = pdCatalog.getAcroForm();

for(PDField pdField : pdAcroForm.getFields()){
    System.out.println(pdField.getValue())
}

这是读取表单组件内部值的正确方法吗? 对此有何建议? 我在哪里可以在 pdfbox 上学习其他内容?

【问题讨论】:

  • 那么,您的代码是否返回了预期值?您自己提供的链接显然是了解更多信息的地方。

标签: java pdf pdfbox


【解决方案1】:

您拥有的代码应该可以工作。如果你真的想对这些值做一些事情,你可能需要使用其他一些方法。例如,您可以使用pdAcroForm.getField(<fieldName>)获取特定字段:

PDField firstNameField = pdAcroForm.getField("firstName");
PDField lastNameField = pdAcroForm.getField("lastName");

请注意,PDField 只是一个基类。您可以将事物转换为子类以从中获取更多有趣的信息。例如:

PDCheckbox fullTimeSalary = (PDCheckbox) pdAcroForm.getField("fullTimeSalary");
if(fullTimeSalary.isChecked()) {
    log.debug("The person earns a full-time salary");
} else {
    log.debug("The person does not earn a full-time salary");
}

按照您的建议,您可以在 apache pdfbox 网站上找到更多信息。

【讨论】:

  • 在这种情况下,我建议在实际执行强制转换之前使用 as 关键字来测试兼容性。这避免了 InvalidCastExceptiont 异常。
  • 你拥有的代码应该可以工作不,原因在另一个答案中解释了,尽管你的答案也很有帮助。
【解决方案2】:

该字段可以是顶级字段。所以需要循环,直到不再是顶级字段,才可以取到值。下面的代码 sn-p 循环遍历所有字段,并输出字段名称和值。

{
    //from your original code
    PDDocument pdDoc = PDDocument.loadNonSeq( myFile, null );
    PDDocumentCatalog pdCatalog = pdDoc.getDocumentCatalog();
    PDAcroForm pdAcroForm = pdCatalog.getAcroForm();


    //get all fields in form
    List<PDField> fields = acroForm.getFields();
    System.out.println(fields.size() + " top-level fields were found on the form");

    //inspect field values
    for (PDField field : fields)
    {
            processField(field, "|--", field.getPartialName());
    }

    ...
}


private void processField(PDField field, String sLevel, String sParent) throws IOException
{
        String partialName = field.getPartialName();

        if (field instanceof PDNonTerminalField)
        {
                if (!sParent.equals(field.getPartialName()))
                {
                        if (partialName != null)
                        {
                                sParent = sParent + "." + partialName;
                        }
                }
                System.out.println(sLevel + sParent);

                for (PDField child : ((PDNonTerminalField)field).getChildren())
                {
                        processField(child, "|  " + sLevel, sParent);
                }
        }
        else
        {
            //field has no child. output the value
                String fieldValue = field.getValueAsString();
                StringBuilder outputString = new StringBuilder(sLevel);
                outputString.append(sParent);
                if (partialName != null)
                {
                        outputString.append(".").append(partialName);
                }
                outputString.append(" = ").append(fieldValue);
                outputString.append(",  type=").append(field.getClass().getName());
                System.out.println(outputString);
        }
}

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 2018-09-06
    • 2012-07-24
    • 2013-02-02
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多