设置值后 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