加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用PDFBOX设置的表单字段值在Adobe Reader中不可见

发布时间:2020-12-14 05:34:01 所属栏目:Java 来源:网络整理
导读:我试图用一些使用Apache PDFBOX(1.8.5)的字段来设置一些问题.我有几个不同的静态PDF,我用于测试.使用以下代码,我可以设置表单域的值,并保存生成的PDF.然后我可以在Adobe Reader中打开此PDF并查看结果: PDDocumentCatalog docCatalog = pdfDocument.getDocum
我试图用一些使用Apache PDFBOX(1.8.5)的字段来设置一些问题.我有几个不同的静态PDF,我用于测试.使用以下代码,我可以设置表单域的值,并保存生成的PDF.然后我可以在Adobe 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)

这工作很好.我可以在Adobe Reader XI中打开文档,并在表单中查看正确的值.

对于静态PDF:

> PDF版本:1.7 Adob??e扩展级别3(Acrobat 9.x)
> PDF版本:1.7 Adob??e扩展级别8(Acrobat X)
> PDF版本:1.7 Adob??e扩展级别11(Acrobat XI)

这似乎不起作用当我在Adobe Reader XI中打开结果表单时,这些字段似乎没有被填充.但是,如果我在Firefox或Chrome浏览器的PDF查看器中打开PDF,那么这些字段将显示为填充.

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

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

解决方法

您的PDF之间的主要区别是使用的表格技术:

> Test_9.pdf使用好的ol’fashioned AcroForm表单;
> Test_10.pdf和Test_10.pdf另一方面使用具有AcroForm表示和XFA(Adobe XML Forms Architecture)表示形式的混合形式.

XFA感知的PDF浏览者(即最重要的Adobe Reader和Adobe Acrobat)在XFA不知情的观众(即大多数其他人)使用AcroForm信息时使用该文件中的XFA信息.

PDFBox主要是XFA不知道.这意味着特别是PDAcroForm.getFields()返回的PDField对象只表示AcroForm信息.因此,您的((PDTextbox)字段).setValue(“STATIC PDFBOX EDIT”)调用仅影响表单的AcroForm表示.

这解释了你的观察

When I open the resulting forms in Adobe Reader XI,the fields do not appear to be populated. But If I open the PDF in my Firefox or Chrome browser’s PDF viewer,the fields show as populated there.

(据我所知,Firefox和Chrome集成PDF查看器是XFA不知道的.)

所以,

How can I set these fields so the values will appear when viewed in Adobe Reader XI?

基本上有两种方式:

>从AcroForm字典中删除XFA条目:

acroForm.setXFA(null);

如果没有XFA,Adobe Reader也会使用AcroForm表单信息.
>编辑AcroForm和XFA信息.您可以使用XFA信息检索

PDXFAResource xr = acroForm.getXFA();

并使用底层XML提取

xr.getDocument()

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

而选项1肯定更容易实现,它只适用于混合文档.如果您还必须编辑纯XFA表单,则需要实现选项2.

Writing new field values to these PDFs works fine with the latest version of iText

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读