Spa*_*bil 11 java adobe-reader pdfbox
尝试使用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:
这很好用.我可以在Adobe Reader XI中打开文档,并在表单中查看正确的值.
对于静态PDF:
这似乎不起作用.当我在Adobe Reader XI中打开生成的表单时,字段似乎不会填充.但是,如果我在我的Firefox或Chrome浏览器的PDF查看器中打开PDF,则字段显示为填充在那里.
如何设置这些字段,以便在Adobe Reader XI中查看时显示值?
编辑:示例PDF可以在这里找到:https://github.com/bamundson/PDFExample
mkl*_*mkl 15
您的PDF之间的主要区别在于使用的表单技术:
Test_9.pdf使用好的ol'fashioned AcroForm形式;Test_10.pdf并且Test_10.pdf,另一方面使用混合形式既与AcroForm表示和XFA(XML的Adobe形式架构)表示.支持XFA的PDF查看器(即最重要的Adobe Reader和Adobe Acrobat)使用文件中的XFA信息,而XFA不知情的查看者(即大多数其他人)使用AcroForm信息.
PDFBox主要是XFA不知道的.这尤其意味着PDField返回的对象PDAcroForm.getFields()仅代表AcroForm信息.因此,您的((PDTextbox)field).setValue("STATIC PDFBOX EDIT")调用仅影响表单的AcroForm表示.
这解释了你的观察
当我在Adobe Reader XI中打开生成的表单时,字段似乎不会填充.但是,如果我在我的Firefox或Chrome浏览器的PDF查看器中打开PDF,则字段显示为填充在那里.
(据我所知,Firefox和Chrome集成的PDF查看器是XFA不知道的.)
所以,
如何设置这些字段,以便在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.
使用最新版本的iText可以为这些PDF写入新的字段值
iText对XFA表单有一定程度的明确支持.
| 归档时间: | 
 | 
| 查看次数: | 7114 次 | 
| 最近记录: |