PDFBox несовместимое поведение PDTextField после setValue - PullRequest
1 голос
/ 01 апреля 2020

PDFBox setValue () не устанавливает данные для каждого PDTextField. Это экономит несколько полей. Это не работает для полей, которые имеют похожий вид в getFullyQualifiedName ().

Примечание: field.getFullyQualifiedName () {customdutiesa, customdutiesb, customduties c} он работает для customdutiesa, но не работает для customdutiesb и customduties c et c ...

@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-ссылка: https://s3-us-west-2.amazonaws.com/kx-filing-docs/b3-3.pdf Выходная PDF-ссылка: https://kx-filing-docs.s3-us-west-2.amazonaws.com/123_b3-3.pdf

1 Ответ

2 голосов
/ 01 апреля 2020

Проблема в том, что при определенных условиях 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 test testLikeAbubakarRemoveAction)

...