PDFBox: заполните PDF с повторным добавлением одностраничного шаблона, содержащего форму - PullRequest
0 голосов
/ 11 мая 2018

После ТАКОГО вопроса Java pdfBox: заполните форму PDF, добавьте ее в pddocument и повторите У меня были проблемы с добавлением клонированной страницы в новый PDF.

Казалось, код с этой страницыдействительно интересно, но у меня не получилось.

На самом деле ответ не работает, потому что это тот же самый PDField, который вы всегда изменяете и добавляете в список.Поэтому в следующий раз, когда вы позвоните getField с начальным именем, он не найдет его, и вы получите NPE.Я пытался использовать ту же версию pdfbox (1.8.12), что и в хорошем проекте github, но не могу понять, как он это работает.

У меня была такая же проблема сегодня, когда я пытался добавить форму на страницах сразные значения в нем.Мне было интересно, если бы решение не было дублировать поле, но не может сделать это правильно.Я всегда заканчиваю PDF-файлом, содержащим одинаковые значения для каждой формы.

(я предоставил ссылку на шаблон документа для Mkl, но теперь я удалил его, потому что он мне не принадлежит)

Редактировать: Следуя советам Mkl, я понял, чего мне не хватало, но производительность действительно плохая с дублированием каждой страницы.Размер файла не удовлетворяет.Может быть, есть способ оптимизировать это, повторно используя похожие части в PDF.

1 Ответ

0 голосов
/ 11 мая 2018

Наконец-то у меня все заработало без перезагрузки шаблона каждый раз.Таким образом, полученный файл такой, какой я хотел: не слишком большой (4 МБ для 164 страниц).Я думаю, что я сделал 2 ошибки раньше: одну при создании страницы и, возможно, одну при дублировании поля.Итак, вот рабочий код, если кто-то застрял на той же проблеме.

Создание формы:

    PDAcroForm finalForm = new PDAcroForm(finalDoc, new COSDictionary());
    finalForm.setDefaultResources(originForm.getDefaultResources())

Создание страницы:

    PDPage clonedPage = templateDocument.getPage(0);

    COSDictionary clonedDict = new COSDictionary(clonedPage.getCOSObject());

    clonedDict.removeItem(COSName.ANNOTS);
    clonedPage = new PDPage(clonedDict);
    finalDoc.addPage(clonedPage);

Дублирование поля: (переименуйте поле, чтобы оно стало уникальным и установите значение)

    PDTextField field = (PDTextField) originForm.getField(fieldName);
    PDPage page = finalDoc.getPages().get(nPage);
    PDTextField clonedField = new PDTextField(finalForm);
    List<PDAnnotationWidget> widgetList = new ArrayList<>();
    for (PDAnnotationWidget paw : field.getWidgets()) {
        PDAnnotationWidget newWidget = new PDAnnotationWidget();
        newWidget.getCOSObject().setString(COSName.DA,  paw.getCOSObject().getString(COSName.DA));
        newWidget.setRectangle(paw.getRectangle());
        widgetList.add(newWidget);
    }
    clonedField.setQ(field.getQ()); // To get text centered
    clonedField.setWidgets(widgetList);
    clonedField.setValue(value);
    clonedField.setPartialName(fieldName + cnt++);
    fields.add(clonedField);

    page.getAnnotations().addAll(clonedField.getWidgets());

И в конце процесса:

    finalDoc.getDocumentCatalog().setAcroForm(finalForm);
    finalForm.setFields(fields);
    finalForm.flatten();
...