设置值后 PDFBox 不一致的 PDTextField 行为
PDFBox inconsistent PDTextField behaviour after setValue
PDFBox setValue() 没有为每个 PDTextField 设置数据。它节省了很少的领域。它不适用于在 getFullyQualifiedName() 中具有相似外观的字段。
注意:field.getFullyQualifiedName() { customdutiesa, customdutiesb, customdutysc } 它适用于 customdutiesa,但不适用于 customdutiesb 和 customdutysc 等...
@Test
public void testb3Generator() throws IOException {
File f = new File(inputFile);
outputFile = String.format("%s_b3-3.pdf", "123");
try (PDDocument document = PDDocument.load(f)) {
PDDocumentCatalog catalog = document.getDocumentCatalog();
PDAcroForm acroForm = catalog.getAcroForm();
int i = 0;
for (PDField field : acroForm.getFields()) {
i=i+1;
if (field instanceof PDTextField) {
PDTextField textField = (PDTextField) field;
textField.setValue(Integer.toString(i));
}
}
document.getDocumentCatalog().getAcroForm().flatten();
document.save(new File(outputFile));
document.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
输入 pdf link : https://s3-us-west-2.amazonaws.com/kx-filing-docs/b3-3.pdf
输出 pdf link : https://kx-filing-docs.s3-us-west-2.amazonaws.com/123_b3-3.pdf
问题是在某些情况下,PDFBox 不会为其设置值的字段构造外观,因此,在展平期间完全忘记了字段内容:
// in case all tests fail the field will be formatted by acrobat
// when it is opened. See FreedomExpressions.pdf for an example of this.
if (actions == null || actions.getF() == null ||
widget.getCOSObject().getDictionaryObject(COSName.AP) != null)
{
... generate appearance ...
}
(org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceValue(String)
)
即如果有一个 JavaScript 与该字段关联的值格式操作,并且还没有外观流,PDFBox 假定它不需要创建外观(并且可能无论如何都会做错,因为它不使用该格式动作)。
如果用例稍后将表单展平,则 PDFBox 的假设显然是错误的。
要强制 PDFBox 也为这些字段生成外观,只需在设置字段值之前删除操作即可:
if (field instanceof PDTextField) {
PDTextField textField = (PDTextField) field;
textField.setActions(null);
textField.setValue(Integer.toString(i));
}
(来自FillAndFlatten测试testLikeAbubakarRemoveAction
)
PDFBox setValue() 没有为每个 PDTextField 设置数据。它节省了很少的领域。它不适用于在 getFullyQualifiedName() 中具有相似外观的字段。
注意:field.getFullyQualifiedName() { customdutiesa, customdutiesb, customdutysc } 它适用于 customdutiesa,但不适用于 customdutiesb 和 customdutysc 等...
@Test
public void testb3Generator() throws IOException {
File f = new File(inputFile);
outputFile = String.format("%s_b3-3.pdf", "123");
try (PDDocument document = PDDocument.load(f)) {
PDDocumentCatalog catalog = document.getDocumentCatalog();
PDAcroForm acroForm = catalog.getAcroForm();
int i = 0;
for (PDField field : acroForm.getFields()) {
i=i+1;
if (field instanceof PDTextField) {
PDTextField textField = (PDTextField) field;
textField.setValue(Integer.toString(i));
}
}
document.getDocumentCatalog().getAcroForm().flatten();
document.save(new File(outputFile));
document.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
输入 pdf link : https://s3-us-west-2.amazonaws.com/kx-filing-docs/b3-3.pdf 输出 pdf link : https://kx-filing-docs.s3-us-west-2.amazonaws.com/123_b3-3.pdf
问题是在某些情况下,PDFBox 不会为其设置值的字段构造外观,因此,在展平期间完全忘记了字段内容:
// in case all tests fail the field will be formatted by acrobat
// when it is opened. See FreedomExpressions.pdf for an example of this.
if (actions == null || actions.getF() == null ||
widget.getCOSObject().getDictionaryObject(COSName.AP) != null)
{
... generate appearance ...
}
(org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceValue(String)
)
即如果有一个 JavaScript 与该字段关联的值格式操作,并且还没有外观流,PDFBox 假定它不需要创建外观(并且可能无论如何都会做错,因为它不使用该格式动作)。
如果用例稍后将表单展平,则 PDFBox 的假设显然是错误的。
要强制 PDFBox 也为这些字段生成外观,只需在设置字段值之前删除操作即可:
if (field instanceof PDTextField) {
PDTextField textField = (PDTextField) field;
textField.setActions(null);
textField.setValue(Integer.toString(i));
}
(来自FillAndFlatten测试testLikeAbubakarRemoveAction
)