如何使用PDFBox“平平”PDF-表单(删除表单字段,但保留字段的文本)?
在此也回答了同样的问题:
要做到这一点,一个快速的方法是从顶格中移除字段。 为此,您只需获得文档目录,然后从该样式中删除所有字段。 图形表示与注释相链接,并留在文档中。
所以我写了这段代码:
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();
}
}发布于 2016-06-14 18:24:12
使用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的迁移,请看一下官方移民指南。
发布于 2013-07-18 15:11:19
setReadOnly确实为我工作,如下所示-
@SuppressWarnings("unchecked")
List<PDField> fields = acroForm.getFields();
for (PDField field : fields) {
if (field.getFullyQualifiedName().equals("formfield1")) {
field.setReadOnly(true);
}
}发布于 2015-01-23 17:37:37
在阅读了有关pdf参考指南之后,我发现通过添加值为1的"Ff“键(字段标志),您可以很容易地为AcroForm字段设置只读模式。
如果设置,用户可能不会更改字段的值。任何相关的小部件注释都不会与用户交互;也就是说,它们不会响应鼠标的单击或响应鼠标的移动而更改外观。对于值是从数据库计算或导入的字段,此标志非常有用。
因此,代码可以是这样的(使用pdfbox ):
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);
}https://stackoverflow.com/questions/14454387
复制相似问题