【发布时间】:2017-03-15 06:58:27
【问题描述】:
我有一个 pdf 文件,其中包含一些我想从 java 填写的表单字段。现在,我正在尝试填写一张我通过其名称找到的表格。我的代码如下所示:
File file = new File("c:/Testy/luxmed/Skierowanie3.pdf");
PDDocument document = PDDocument.load(file);
PDDocumentCatalog doc = document.getDocumentCatalog();
PDAcroForm Form = doc.getAcroForm();
String formName = "topmostSubform[0].Page1[0].pana_pania[0]";
PDField f = Form.getField(formName);
setField(document, formName, "Artur");
System.out.println("New value 2nd: " + f.getValueAsString());
document.saveIncremental(new FileOutputStream("c:/Testy/luxmed/nowy_pd3.pdf"));
document.close();
还有这个:
public static void setField(PDDocument pdfDocument, String name, String Value) throws IOException
{
PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();
PDField field = acroForm.getField(name);
if (field instanceof PDCheckBox){
field.setValue("Yes");
}
else if (field instanceof PDTextField){
System.out.println("Original value: " + field.getValueAsString());
field.setValue(Value);
System.out.println("New value: " + field.getValueAsString());
}
else{
System.out.println("Nie znaleziono pola");
}
}
正如 system.out 所述,该值设置正确,但在新生成的 pdf 文件中,新值未显示(显示原始字符串),所以我猜增量保存无法正常工作。我错过了什么?
我使用 2.0.2 版本的 pdfbox,这是我使用的 pdf 文件:pdf
【问题讨论】:
-
在以前的 PDFBox 版本中,必须为所有更改的对象设置
setNeedToBeUpdated到true,包括从指向它们的目录开始的每个对象链。我认为这个过程有待改进,但我不知道它是否已经改进了。 -
还是这样。重要的是拥有从目录到您关心的更新对象的“链”,因此在这里:目录 - acroform - 字段列表 - 字段/注释。如果 PDF 已签名,则 saveIncremental 不起作用。另见问题 PDFBOX-45 及相关问题。可能是最古老的未解决问题。
-
查看stackoverflow.com/questions/41467415/…了解如何使用setNeedToBeupdated