Как создать форму мультивиджета - PullRequest
0 голосов
/ 22 мая 2019

Я создаю PDF с нуля, используя PDFbox V2, я хочу создать PDTextField, который отображается на другой странице и имеет одинаковое значение при его заполнении.

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

вот функция, которая создает textField на моем PDF.

    @Override
    public void writeElement(CustomInputField element, PDDocument document, 
    PDPage page, PDAcroForm acroForm) throws IOException {

    String inputFieldKey = element.getKey();
    PDTextField myTextBox =  (PDTextField) acroForm.getField(inputFieldKey);
    if(myTextBox == null) { // if pdtexField don't exist
        myTextBox = new PDTextField(acroForm);
        myTextBox.setMultiline(true);
        myTextBox.setPartialName(inputFieldKey);
        myTextBox.setAlternateFieldName(element.getTooltip());
        acroForm.getFields().add(myTextBox);
        System.out.println(myTextBox);
    }
    List<PDAnnotationWidget> widgets = new ArrayList<>();

    PDAnnotationWidget widget = new PDAnnotationWidget();
    PDRectangle rect = new PDRectangle(element.getLeft(), page.getMediaBox().getHeight() - (element.getTop() + element.getHeight()), element.getWidth(),
            element.getHeight());
    widget.setRectangle(rect);
    widget.setPage(page);
    widget.setParent(myTextBox);
    widget.setPrinted(true);
    page.getAnnotations().add(widget);
    widgets.add(widget);
    myTextBox.setWidgets(widgets);
}

Вызов методов

private void writeElementsInPage(PDDocument document, PDPage page, AbstractPDFObject currentElement, PDAcroForm acroForm) throws IOException {

    switch (ElementEnum.resolveElment(currentElement.getClass())) {
    case Rectangle:
        rectangleService.writeElement((CustomRectangle) currentElement, document, page, null);
        break;
    case Image:
        imageService.writeElement((CustomImage) currentElement, document, page, null);
        break;
    case CheckBox:
        checkBoxService.writeElement((CustomInputCheckBox) currentElement, document, page, acroForm);
        break;
    case InputField:
        inputFieldService.writeElement((CustomInputField) currentElement, document, page, acroForm);
        break;
    default:
        System.err.println("UNKNOWN Element\t" + currentElement.getClass().getCanonicalName());
        break;

    }
}

PDF, который я получаю, имеет последнее появление на Adobeчитатель: enter image description here

, но в Chrome PDF-форма отображается на всех страницах:

enter image description here

thisпроблема возникает на всех элементах multi acroform, которые я добавляю в pdf.

1 Ответ

1 голос
/ 23 мая 2019

Я наконец-то решил проблему, это происходит из-за переопределения списка PDAnnotationWidget, вот как я могу это исправить:

@Override
public void writeElement(CustomInputField element, PDDocument document, PDPage page, PDAcroForm acroForm) throws IOException {

    String inputFieldKey = element.getKey();
    PDTextField myTextBox = (PDTextField) acroForm.getField(inputFieldKey);
    List<PDAnnotationWidget> widgets;
    if (myTextBox == null) { // if pdtexField don't exist
        myTextBox = new PDTextField(acroForm);
        myTextBox.setMultiline(true);
        myTextBox.setPartialName(inputFieldKey);
        myTextBox.setAlternateFieldName(element.getTooltip());
        acroForm.getFields().add(myTextBox);
        widgets = new ArrayList<>();
    } else {
        widgets = myTextBox.getWidgets();
    }
    PDAnnotationWidget widget = new PDAnnotationWidget();
    PDRectangle rect = new PDRectangle(element.getLeft(), page.getMediaBox().getHeight() - (element.getTop() + element.getHeight()), element.getWidth(),
            element.getHeight());
    widget.setRectangle(rect);
    widget.setPage(page);
    widget.setParent(myTextBox);
    widget.setPrinted(true);
    page.getAnnotations().add(widget);
    widgets.add(widget);
    myTextBox.setWidgets(widgets);

}
...