从注释中删除页面引用

时间:2015-02-09 20:19:18

标签: java itext autofill form-fields formfield

我添加了一个文本字段,其中包含几个类似here所述的孩子。是否使用PDF的自动填充功能... 现在我的问题是如何从父元素中删除页面引用?数据字段不应包含父引用,因为它与任何页面无关。小部件应该包含那些(我在那里添加但我不能删除父/ 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 个答案:

答案 0 :(得分:1)

事实1:

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

在您的情况下,您有PdfFormField用作分层元素,虽然该元素也是PdfAnnotation的实例,但事实并非如此。您可以使用isAnnotation()方法进行检查。它将返回false

事实2:

当您向现有PDF添加注释时,您必须使用PdfStamper的{​​{1}}方法,该方法不仅接受注释对象,还接受页码。如果您没有添加页码,addAnnotation()将不知道添加注释的位置。

当您添加实际注释时,PdfStamper将添加一个PdfStamper键,该键引用可视化注释的页面。

事实3:

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

事实4:

/P条目是可选的。要正确显示窗口小部件注释,它们就会显示在页面的/P中。

<强>结论:

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

PdfFormField

我已使用AddFieldAndKids示例对此进行了测试,但它似乎有效:不再添加 void addAnnotation(PdfAnnotation annot, int page) { - annot.setPage(page); + if (annot.isAnnotation()) + annot.setPage(page); addAnnotation(annot, reader.getPageN(page)); } 条目。

这可以更加健壮的方式解决您的问题。你不应该试图删除一些本来不应该添加的东西。