【问题标题】:Form field values set with PDFBOX not visible in Adobe Reader使用 PDFBOX 设置的表单字段值在 Adob​​e Reader 中不可见
【发布时间】:2014-06-10 19:27:15
【问题描述】:

我在尝试使用 Apache PDFBOX(1.8.5) 从字段中设置一些内容时遇到问题。我有几个不同的静态 PDF 用于测试。使用以下代码,我可以设置表单字段的值,并保存生成的 PDF。然后我可以在 Adob​​e Reader 中打开这个 PDF 并查看结果:

PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog();
pdfTemplate.setAllSecurityToBeRemoved(true);
PDAcroForm acroForm = docCatalog.getAcroForm();
List fields = acroForm.getFields();     
Iterator fieldsIter = fields.iterator();        
while( fieldsIter.hasNext())
{
    PDField field = (PDField)fieldsIter.next();         
    if(field instanceof PDTextbox){
        ((PDTextbox)field).setValue("STATIC PDFBOX EDIT");
    }
}

然后我最终保存了表单。对于静态 PDF:

  • PDF 版本:1.6 (Acrobat 7.x)
  • PDF 版本:1.7 (Acrobat 8​​.x)

这很好用。我可以在 Adob​​e Reader XI 中打开文档并在表单中查看正确的值。

对于静态 PDF:

  • PDF 版本:1.7 Adob​​e Extension Level 3(Acrobat 9.x)
  • PDF 版本:1.7 Adob​​e Extension Level 8(Acrobat X)
  • PDF 版本:1.7 Adob​​e Extension Level 11(Acrobat XI)

这似乎不起作用。当我在 Adob​​e Reader XI 中打开生成的表单时,这些字段似乎没有被填充。但是,如果我在 Firefox 或 Chrome 浏览器的 PDF 查看器中打开 PDF,这些字段会显示为已填充。

如何设置这些字段,以便在 Adob​​e Reader XI 中查看时显示这些值?

编辑:可在此处找到示例 PDF:https://github.com/bamundson/PDFExample

【问题讨论】:

  • 根据我使用 iText 的经验,我可以想到两个原因:(1)NeedAppearances 值的不同设置; (2) 字段中的DA条目错误。如果您使用 iText 填写表格会发生什么?
  • 请提供样本 PDF 以供分析。
  • 我在原始帖子中添加了一个链接,指向我正在使用的一些示例 PDF,版本 9、X 和 XI。将新字段值写入这些 PDF 可以在最新版本的 iText 中正常工作

标签: java pdfbox adobe-reader


【解决方案1】:

您的 PDF 之间的主要区别在于所使用的表单技术:

  • Test_9.pdf 使用良好的老式 AcroForm 表单;
  • 另一方面,Test_10.pdfTest_10.pdf 使用具有 AcroForm 表示和 XFA(Adobe XML Forms Architecture)表示的混合表单。

支持 XFA 的 PDF 查看器(即最重要的 Adob​​e Reader 和 Adob​​e Acrobat)使用文件中的 XFA 信息,而不支持 XFA 的查看器(即大多数其他人)使用 AcroForm 信息。

PDFBox 大多不支持 XFA。这尤其意味着PDAcroForm.getFields() 返回的PDField 对象仅代表AcroForm 信息。因此,您的 ((PDTextbox)field).setValue("STATIC PDFBOX EDIT") 调用只会影响表单的 AcroForm 表示。

这解释了你的观察

当我在 Adob​​e Reader XI 中打开生成的表单时,字段似乎没有被填充。但是,如果我在 Firefox 或 Chrome 浏览器的 PDF 查看器中打开 PDF,这些字段会显示为已填充。

(据我所知,Firefox 和 Chrome 集成的 PDF 查看器不支持 XFA。)

所以,

如何设置这些字段,以便在 Adob​​e Reader XI 中查看时显示这些值?

基本上有两种方式:

  1. AcroForm 字典中删除 XFA 条目:

    acroForm.setXFA(null);
    

    如果没有 XFA,Adobe Reader 也会使用 AcroForm 表单信息。

  2. 编辑 AcroFormXFA 信息。您可以使用

    检索 XFA 信息
    PDXFAResource xr = acroForm.getXFA();
    

    并使用

    提取底层 XML
    xr.getDocument()
    

    然后您可以编辑 XML,将生成的 XML 放入一个流中,您可以将其包装在 PDXFAResource 中,然后您可以使用 AcroForm.setXFA(...) 进行设置。

虽然选项 1 确实更容易实现,但它仅适用于混合文档。如果您还必须编辑纯 XFA 表单,则需要实施选项 2。

使用最新版本的 iText 将新字段值写入这些 PDF 可以正常工作

iText 对 XFA 表单有一定程度的明确支持。

【讨论】:

  • 我真的希望我能给这个 +1000。感谢您整理出如此有用的答案。
【解决方案2】:

对于 acrofields,您需要将 NeedAppearances 标志设置为 true。 尝试以下代码 sn-p。它将正确显示字段中的值。

COSDictionary acroFormDict = new COSDictionary(); 
acroFormDict.setBoolean(COSName.getPDFName("NeedAppearances"), true);
acroFormDict.setItem(COSName.getPDFName("Fields"), new COSArray());

// add a new AcroForm and add that to the document
PDAcroForm acroForm = new PDAcroForm(document, acroFormDict);

【讨论】:

  • 它将正确显示字段中的值。 - 不。这在某些纯 AcroForm 情况下有所帮助,但在手头的情况下却无济于事。
猜你喜欢
  • 2012-11-09
  • 2012-04-29
  • 2014-02-24
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多