使用Pdfbox API写入后,PDF acroform字段在Adobe Reader中变得不可编辑

时间:2014-08-20 23:53:43

标签: pdfbox

我正在阅读包含可编辑字段的PDF,并且可以通过Adobe Reader打开字段来编辑字段。我正在使用PDFBox API生成输出PDF,其中包含输入PDF中可编辑字段的数据。输出PDF可以使用Adobe Reader打开,我可以看到字段值,但我无法直接从Adobe阅读器编辑这些字段。

此问题还有一张JIRA票据,根据此链接尚未解决:

https://issues.apache.org/jira/browse/PDFBOX-1121

有人可以告诉我这是否得到解决?另外,如果可能,请回答与我的问题相关的以下问题:

  1. 为了编辑Adobe Reader的输出PDF,是否需要明确设置保护策略或访问权限?

  2. 每次打开使用pdfbox API编写的PDF时,都会收到此消息提示:

  3.   

    "该文档自创建以来已更改,并且不再使用扩展功能...."

    我使用的是PdfBox 1.8.6 jar和Adobe Reader 11.0.8。如果有人能帮我解决这个问题,我将非常感激。

    添加了代码段以帮助响应者进行调试:

    String outputFileNameWithPath = "C:\myfolder\testop.pdf";
    PDDocument pdf = null;
    pdf = PDDocument.load( outputFileNameWithPath );
    
    PDDocumentCatal og docCatalog = pdf.getDocumentCatalog();
    PDAcroForm acroForm = docCatalog.getAcroForm();
    //The map pdfValues is a collection of the data that I need to set in the PDF
    //I am unable to go into the details of my data soutce
    // The key in the data map corresponds to the PDField's expanded name and data
    //  corresponds to the data that I am trying to set.
    Iterator<Entry<String, String>> iter=pdfValues.entrySet().iterator();
    String name=null;
    String value=null;
    PDField field=null;
    //Iterate over all data and see if the PDF has a matching field.
    while(iter.hasNext()) {
        Map.Entry<String, String> currentEntry=iter.next();
        name=currentEntry.getKey();
        value=currentEntry.getValue();
        if(name!=null) {
            name=CommonUtils.fromSchemaNameToPdfName(name);
            field=acroForm.getField(name);      
        }
        if( field != null && value!=null )
            {           
                field.setValue( value ); //setting  the values once field is found.
            }
    }
    // Set access permissions / encryption here before saving
    pdf.save(outputFileNameWithPath);
    

    感谢。

1 个答案:

答案 0 :(得分:0)

  

文档自创建以来已更改,并且不再使用扩展功能....

这表示原始表单已经 Reader-enabled ,即使用Adobe持有的私钥将一个集成的使用权数字签名应用于文档,该私钥告诉Adobe Reader它应该为查看该表单的用户提供一些额外的功能。

如果您不希望在使用PDFBox填写表单期间破坏该签名,则需要确保

  1. 不做任何更改,只是填写表格和
  2. 将更改保存为增量更新。
  3. 如果您提供了表单填写代码和源PDF,则可以对此进行更详细的分析。