我在尝试使用(1.8.5)设置字段时遇到了问题。我有几个不同的静态PDF,我正在使用的测试。使用下面的代码,我可以设置表单字段的值,并保存生成的PDF。然后,我可以在Adobe中打开这个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中打开文档,并在表单中看到正确的值。
对于静态PDF而言:
这似乎不起作用。当我在Adobe中打开生成的表单时,这些字段似乎不会被填充。但如果我在Firefox或Chrome浏览器的PDF查看器中打开PDF,字段显示为填充。
如何设置这些字段,以便在中查看这些值?
编辑:示例PDF可以在这里找到:https://github.com/bamundson/PDFExample
发布于 2014-06-12 15:01:08
PDF之间的主要区别在于所使用的表单技术:
Test_9.pdf使用良好的AcroForm表单;Test_10.pdf和Test_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不知道的。)
所以,
如何设置这些字段,以便在中查看这些值?
实质上有两种方式:
PDXFAResource中,然后可以使用AcroForm.setXFA(...)进行设置。虽然选项1当然更容易实现,但它只适用于混合文档。如果还必须编辑纯XFA表单,则需要实现选项2。
为这些PDF编写新的字段值对于最新版本的iText很好。
iText对XFA表单有一定程度的明确支持。
发布于 2015-09-02 06:48:26
您需要将NeedAppearances标志设置为适用于顶字段。试着跟随代码片段。它将正确地显示字段中的值。
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);https://stackoverflow.com/questions/24149361
复制相似问题