从注释中删除页面引用

Remove page reference from annotation

我添加了一个包含几个孩子的文本字段,与描述的相似 here。这样做是为了使用 PDF 的自动填充功能...... 现在我的问题是如何从 parent 元素中删除页面引用?数据字段不应包含 parent 引用,因为它与任何页面都不相关。小部件应包含那些(我在那里添加但我无法删除 parent /P 页面引用)

我试过了

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);

但是它没有用,因为我猜页面参考已经写好了。之后有没有办法删除它?

事实 1:

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

在您的例子中,您有一个用作分层元素的 PdfFormField,尽管该元素也是 PdfAnnotation 的一个实例,但它不是。您可以使用 isAnnotation() 方法进行检查。它将 return false.

事实 2:

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

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

事实 3:

在使用 PdfStamper 时,除了使用带有注释和页码的 addAnnotation() 之外别无他法。当您添加一个不是真正注释的 PdfFormField 对象时,它不会被区别对待,因此将添加一个 /P 条目,尽管这实际上没有意义(正如您正确指出的那样在你的问题中。

事实 4:

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

结论:

iText 不应添加 /P 条目,以防您添加的 PdfFormField 不是真正的注释。因此,我做出了以下更改:revision 6756

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

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

这以更稳健的方式解决了您的问题。您不应该尝试删除一开始就不应该添加的内容。