首页 文章

使用PDF框设置的表单字段值在Adobe Reader中不可见

提问于
浏览
10

尝试使用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 Adobe Extension Level 3(Acrobat 9.x)

  • PDF版本:1.7 Adobe Extension Level 8(Acrobat X)

  • PDF版本:1.7 Adobe Extension Level 11(Acrobat XI)

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

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

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

2 回答

  • 4

    您需要为acrofields设置NeedAppearances标志为true . 请尝试以下代码段 . 它将正确显示字段中的值 .

    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);
    
  • 14

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

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

    支持XFA的PDF查看器(即最重要的Adobe Reader和Adobe Acrobat)使用文件中的 XFA 信息,而XFA不知情的查看者(即大多数其他人)使用 AcroForm 信息 .

    PDFBox主要是XFA不知道的 . 这尤其意味着 PDAcroForm.getFields() 返回的 PDField 对象仅代表 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 表单信息 .

    • 编辑 AcroFormXFA 信息 . 您可以使用检索XFA信息
    PDXFAResource xr = acroForm.getXFA();
    

    并使用提取底层XML

    xr.getDocument()
    

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

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

    使用最新版本的iText可以为这些PDF编写新的字段值

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

相关问题