我添加了一个文本字段,其中包含几个类似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);
然而,由于我认为页面引用已经写好,所以它没有用。有没有办法在之后删除它?
答案 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));
}
条目。
这可以更加健壮的方式解决您的问题。你不应该试图删除一些本来不应该添加的东西。