首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PDFBox:如何“压平”PDF格式?

PDFBox:如何“压平”PDF格式?
EN

Stack Overflow用户
提问于 2013-01-22 08:32:48
回答 10查看 35.5K关注 0票数 11

如何使用PDFBox“平平”PDF-表单(删除表单字段,但保留字段的文本)?

在此也回答了同样的问题:

要做到这一点,一个快速的方法是从顶格中移除字段。 为此,您只需获得文档目录,然后从该样式中删除所有字段。 图形表示与注释相链接,并留在文档中。

所以我写了这段代码:

代码语言:javascript
复制
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;

public class PdfBoxTest {
    public void test() throws Exception {
        PDDocument pdDoc = PDDocument.load(new File("E:\\Form-Test.pdf"));
        PDDocumentCatalog pdCatalog = pdDoc.getDocumentCatalog();
        PDAcroForm acroForm = pdCatalog.getAcroForm();

        if (acroForm == null) {
            System.out.println("No form-field --> stop");
            return;
        }

        @SuppressWarnings("unchecked")
        List<PDField> fields = acroForm.getFields();

        // set the text in the form-field <-- does work
        for (PDField field : fields) {
            if (field.getFullyQualifiedName().equals("formfield1")) {
                field.setValue("Test-String");
            }
        }

        // remove form-field but keep text ???
        // acroForm.getFields().clear();         <-- does not work
        // acroForm.setFields(null);             <-- does not work
        // acroForm.setFields(new ArrayList());  <-- does not work
        // ???

        pdDoc.save("E:\\Form-Test-Result.pdf");
        pdDoc.close();
    }
}
EN

回答 10

Stack Overflow用户

发布于 2016-06-14 18:24:12

使用PDFBox 2,现在可以通过调用PDAcroForm对象上的flatten方法来轻松地“平平”PDF格式。参见Javadoc:PDAcroForm.flatten()

使用此方法的示例调用的简化代码:

代码语言:javascript
复制
//Load the document
PDDocument pDDocument = PDDocument.load(new File("E:\\Form-Test.pdf"));    
PDAcroForm pDAcroForm = pDDocument.getDocumentCatalog().getAcroForm();

//Fill the document
...

//Flatten the document
pDAcroForm.flatten();

//Save the document
pDDocument.save("E:\\Form-Test-Result.pdf");
pDDocument.close();

注意:动态XFA表单不能扁平。

对于从PDFBox 1.*到2.0的迁移,请看一下官方移民指南

票数 25
EN

Stack Overflow用户

发布于 2013-07-18 15:11:19

setReadOnly确实为我工作,如下所示-

代码语言:javascript
复制
   @SuppressWarnings("unchecked")
    List<PDField> fields = acroForm.getFields();
    for (PDField field : fields) {
        if (field.getFullyQualifiedName().equals("formfield1")) {
            field.setReadOnly(true);
        }
    }
票数 7
EN

Stack Overflow用户

发布于 2015-01-23 17:37:37

在阅读了有关pdf参考指南之后,我发现通过添加值为1的"Ff“键(字段标志),您可以很容易地为AcroForm字段设置只读模式。

如果设置,用户可能不会更改字段的值。任何相关的小部件注释都不会与用户交互;也就是说,它们不会响应鼠标的单击或响应鼠标的移动而更改外观。对于值是从数据库计算或导入的字段,此标志非常有用。

因此,代码可以是这样的(使用pdfbox ):

代码语言:javascript
复制
 public static void makeAllWidgetsReadOnly(PDDocument pdDoc) throws IOException {

    PDDocumentCatalog catalog = pdDoc.getDocumentCatalog();

    PDAcroForm form = catalog.getAcroForm();

    List<PDField> acroFormFields = form.getFields();

    System.out.println(String.format("found %d acroFrom fields", acroFormFields.size()));

    for(PDField field: acroFormFields) {
        makeAcroFieldReadOnly(field);
    }
}

private static void makeAcroFieldReadOnly(PDField field) {

    field.getDictionary().setInt("Ff",1);

}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14454387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档