从注释中删除页面引用
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 添加注释时,您必须使用 PdfStamper
的 addAnnotation()
方法,该方法不仅接受注释对象,还接受页码。如果您不添加页码,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
条目。
这以更稳健的方式解决了您的问题。您不应该尝试删除一开始就不应该添加的内容。
我添加了一个包含几个孩子的文本字段,与描述的相似 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 添加注释时,您必须使用 PdfStamper
的 addAnnotation()
方法,该方法不仅接受注释对象,还接受页码。如果您不添加页码,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
条目。
这以更稳健的方式解决了您的问题。您不应该尝试删除一开始就不应该添加的内容。