java - PDFBox:如何将 "flatten"设为 PDF 格式?

标签 java pdfbox pdf-form

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

Same question was answered here:

a quick way to do this, is to remove the fields from the acrofrom.

For this you just need to get the document catalog, then the acroform and then remove all fields from this acroform.

The graphical representation is linked with the annotation and stay in the document.

所以我写了这段代码:

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();
    }
}

最佳答案

使用 PDFBox 2,现在可以通过调用 PDAcroForm 对象上的 flatten 方法轻松“展平”PDF 表单。请参阅 Javadoc:PDAcroForm.flatten() .

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

//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,请查看 the official migration guide .

关于java - PDFBox:如何将 "flatten"设为 PDF 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14454387/

相关文章:

java - ConcurrentHashMap jdk 8 使用 TreeNodes 而不是 List .. 为什么?

java - 将 .jar 文件提取到目录,添加新文件,然后在 java 中重新打包成 .jar 文件

java - S3 文件作为 PDFBox 的输入

java - 如何使用 apache pdfbox 在 pdf 中打印 html 文本

Java字符串分割返回空结果

java - 如何使用 Selenium webdriver 和 Java 读取 PDF

multi-select - PDF 中的多选表单域

javascript - 如何检查 PDF 表单/Javascript 中按钮的文本/标签

java - 使用 openapi 3.0、aws-cognito oauth2 配置 Springboot 时遇到问题