[英]How to create multiWidget Form
I am creating a pdf from scratch using PDFbox V2, i want to create PDTextField that appear on different page and have the same value when i fill it. 我正在使用PDFbox V2从头开始创建pdf,我想创建显示在不同页面上并填充时具有相同值的PDTextField。
I already read the example provided by tilman in the doc, but i have specif problem: i'am creating the pdf from json file that contains the informations about the pdf elements , so when i parse the json i don't know yet if the textfield appears on different pages or just on single one. 我已经阅读了tilman在文档中提供的示例,但是我有一个明确的问题:我正在从包含有关pdf元素信息的json文件创建pdf,因此当我解析json时我还不知道文本字段出现在不同的页面上或仅出现在单个页面上。
here is the function that create textField on my pdf. 这是在我的pdf上创建textField的函数。
@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);
}
Methods call 方法调用
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;
}
}
the pdf i am getting only have the last occurrence on adobe reader : 我得到的pdf在Adobe Reader上只有最后一次出现:
but on chrome the pdf form appears on all pages : 但在chrome上,pdf表单出现在所有页面上:
this is problem occur on all multi acroform elements that I add on my pdf. 这是我在pdf上添加的所有多acroform元素上出现的问题。
I finally solved the problem, it comes from overriding the list of PDAnnotationWidget, here is how i fix it : 我终于解决了问题,它来自重写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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.