首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Adobe中不可见的PDFBOX设置的表单字段值

使用Adobe中不可见的PDFBOX设置的表单字段值
EN

Stack Overflow用户
提问于 2014-06-10 19:27:15
回答 2查看 8.8K关注 0票数 11

我在尝试使用(1.8.5)设置字段时遇到了问题。我有几个不同的静态PDF,我正在使用的测试。使用下面的代码,我可以设置表单字段的值,并保存生成的PDF。然后,我可以在Adobe中打开这个PDF,并看到结果:

代码语言:javascript
复制
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)

这个很好用。我可以在Adobe中打开文档,并在表单中看到正确的值。

对于静态PDF而言:

  • PDF版本: 1.7 Adobe扩展级别3(Acrobat9.x)
  • PDF版本: 1.7 Adobe扩展级别8(Acrobat X)
  • PDF版本: 1.7 Adobe扩展层11(Acrobat XI)

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

如何设置这些字段,以便在中查看这些值?

编辑:示例PDF可以在这里找到:https://github.com/bamundson/PDFExample

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-12 15:01:08

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

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

XFA感知的PDF查看器(即最重要的Adobe和Acrobat)使用文件中的XFA信息,而XFA-不知情的查看器(即大多数其他查看器)使用AcroForm信息。

PDFBox主要是没有XFA意识的。这尤其意味着PDAcroForm.getFields()返回的PDAcroForm.getFields()对象仅表示AcroForm信息。因此,((PDTextbox)field).setValue("STATIC PDFBOX EDIT")调用只影响表单的AcroForm表示。

这解释了你的观察

当我在Adobe中打开生成的表单时,这些字段似乎不会被填充。但如果我在Firefox或Chrome浏览器的PDF查看器中打开PDF,字段显示为填充。

(据我所知,Firefox和Chrome集成的PDF浏览器都是XFA不知道的。)

所以,

如何设置这些字段,以便在中查看这些值?

实质上有两种方式:

  1. XFA条目从AcroForm字典中删除: acroForm.setXFA(null); 如果没有XFA,Adobe也将使用AcroForm表单信息。
  2. 同时编辑AcroFormXFA信息。可以使用以下方法检索XFA信息 PDXFAResource xr = acroForm.getXFA(); 并使用以下方法提取底层XML xr.getDocument() 然后您可以编辑XML,将得到的XML放入流中,您可以将该流包装到PDXFAResource中,然后可以使用AcroForm.setXFA(...)进行设置。

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

为这些PDF编写新的字段值对于最新版本的iText很好。

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

票数 20
EN

Stack Overflow用户

发布于 2015-09-02 06:48:26

您需要将NeedAppearances标志设置为适用于顶字段。试着跟随代码片段。它将正确地显示字段中的值。

代码语言:javascript
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24149361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档