0

I added a textfield with several kids similar as described here. Did that to use the autofill functionality of PDF... Now my question is how am I able to remove the page reference from the parent element? The data field should not contain a parent reference since it is not related to any page. The widgets should contain those (which I added there however I can't remove the parent /P page reference)

I tried

PdfFormField parent = PdfFormField.createTextField(stamper.getWriter(), false, false, 0);
parent.setFieldName(fieldName);

for (int page = 1; page <= pages; page++) {
    TextField textField = new TextField(stamper.getWriter(), new Rectangle(560, 600, 590, 800), null);

    PdfFormField pff = textField.getTextField();
    parent.addKid(pff);
    // add widget to each page
    pff.setPlaceInPage(page);
    //iText workarounds
    field.put(PdfName.P, stamper.getWriter().getPageReference(page));
    field.remove(PdfName.FF);
    field.remove(PdfName.FT);
}
//in addAnnotation() the page reference is written
stamper.addAnnotation(parent, 1);
//does not work
parent.remove(PdfName.P);

however it didn't work since I guess the page reference is already written. Is there a way to remove it afterwards?

4

1 回答 1

1

事实1:

该类PdfFormField扩展了PdfAnnotation该类,因为大多数时候,可以将字段字典与注释字典合并。

在您的情况下,您有 aPdfFormField用作分层元素,尽管该元素也是 的实例PdfAnnotation,但它不是。您可以使用该isAnnotation()方法进行检查。它会返回false

事实2:

当您向现有 PDF 添加注释时,您必须使用PdfStamper'addAnnotation()方法,该方法不仅接受注释对象,还接受页码。如果您没有添加页码,PdfStamper将不知道在哪里添加注释。

当您添加真正的注释时,PdfStamper将添加一个/P键,该键指向可视化注释的页面。

事实 3:

addAnnotation()使用PdfStamper. 当您添加一个PdfFormField不是真正注释的对象时,它不会被区别对待,因此/P将添加一个条目,尽管这并没有真正意义(正如您在问题中正确指出的那样)。

事实4:

/P条目是可选的。要正确显示小部件注释,它们出现在/Annots页面中就足够了。

结论:

如果您添加的不是真正的注释,iText 不应添加/P条目。PdfFormField因此,我提交了以下更改:修订版 6756

     void addAnnotation(PdfAnnotation annot, int page) {
-     annot.setPage(page);
+        if (annot.isAnnotation())
+            annot.setPage(page);
         addAnnotation(annot, reader.getPageN(page));
     }

我已经使用AddFieldAndKids示例对此进行了测试,它似乎有效:/P不再添加该条目。

这以更强大的方式解决了您的问题。您不应该尝试删除最初不应该添加的内容。

于 2015-02-10T12:11:40.347 回答