Itext 7:无法删除注释或展平文档
Itext 7: Cannot remove annotations or flatten document
自从让冲压工艺在大部分时间发挥作用后,我就玩得更多了。现在我想删除 PDF 中的所有注释。我已经尝试了多种方法,如下所示:
public void ClearStamps()
{
IList<PdfAnnotation> annotList = pdfDoc.GetFirstPage().GetAnnotations();
int listCount = annotList.Count;
for (int i = 0; i < listCount; i++)
{
annotList.RemoveAt(i);
}
pdfDoc.Close();
if (Overwrite)
{
File.Delete(pdfFilePath);
File.Move(pdfFileDest, pdfFilePath);
}
}
或
IList<PdfAnnotation> annotList = pdfDoc.GetFirstPage().GetAnnotations();
int listCount = annotList.Count;
for (int i = 0; i < listCount; i++)
{
annotList[i].Remove(PdfName.Annots);
}
pdfDoc.Close();
经过上述操作后生成的 PDF 仍然完好无损。
我还尝试循环遍历所有类似于注释的 PdfName 对象(Annot、Annots、Annotation 等)
是不是我获取注解的方法不对?这正是我为邮票操作获取邮票属性的方式。
此外,当涉及到注释操作时,我似乎找不到任何类似于 iText5 中的 Flattening bool 的方法——我能得到的最接近的方法是设置注释标记为 LOCKED...不是最理想的展平方式。
正在删除注释
方法 1。遍历所有注解,一一移除:
private void clearAnnotations(PdfPage page) {
Collection<PdfAnnotation> annotations = new ArrayList<>(page.getAnnotations());
for (PdfAnnotation annotation : annotations) {
page.removeAnnotation(annotation);
}
}
方法 2。更底层的操作:从页面字典中删除 /Annots:
private void clearAnnotations(PdfPage page) {
page.getPdfObject().remove(PdfName.Annots);
}
为每个要清除注释的页面调用该方法,例如:
clearAnnotations(pdfDocument.getFirstPage());
代码在 Java 中,但应该很容易翻译成 C#。
展平注释
iText5
仅支持扁平化其中包含外观流的注释(与表单字段无关)。该功能的范围确实有限。将来可以将此功能添加到 iText7
,但目前没有。
同时,您可以尝试手动实现相同的功能。这个想法是在注释中找到一个外观流(/AP 键是起点),然后创建一个 PdfFormXObject
来包装那个外观流,然后添加它反对任何你喜欢的PdfCanvas
。
自从让冲压工艺在大部分时间发挥作用后,我就玩得更多了。现在我想删除 PDF 中的所有注释。我已经尝试了多种方法,如下所示:
public void ClearStamps()
{
IList<PdfAnnotation> annotList = pdfDoc.GetFirstPage().GetAnnotations();
int listCount = annotList.Count;
for (int i = 0; i < listCount; i++)
{
annotList.RemoveAt(i);
}
pdfDoc.Close();
if (Overwrite)
{
File.Delete(pdfFilePath);
File.Move(pdfFileDest, pdfFilePath);
}
}
或
IList<PdfAnnotation> annotList = pdfDoc.GetFirstPage().GetAnnotations();
int listCount = annotList.Count;
for (int i = 0; i < listCount; i++)
{
annotList[i].Remove(PdfName.Annots);
}
pdfDoc.Close();
经过上述操作后生成的 PDF 仍然完好无损。
我还尝试循环遍历所有类似于注释的 PdfName 对象(Annot、Annots、Annotation 等)
是不是我获取注解的方法不对?这正是我为邮票操作获取邮票属性的方式。
此外,当涉及到注释操作时,我似乎找不到任何类似于 iText5 中的 Flattening bool 的方法——我能得到的最接近的方法是设置注释标记为 LOCKED...不是最理想的展平方式。
正在删除注释
方法 1。遍历所有注解,一一移除:
private void clearAnnotations(PdfPage page) {
Collection<PdfAnnotation> annotations = new ArrayList<>(page.getAnnotations());
for (PdfAnnotation annotation : annotations) {
page.removeAnnotation(annotation);
}
}
方法 2。更底层的操作:从页面字典中删除 /Annots:
private void clearAnnotations(PdfPage page) {
page.getPdfObject().remove(PdfName.Annots);
}
为每个要清除注释的页面调用该方法,例如:
clearAnnotations(pdfDocument.getFirstPage());
代码在 Java 中,但应该很容易翻译成 C#。
展平注释
iText5
仅支持扁平化其中包含外观流的注释(与表单字段无关)。该功能的范围确实有限。将来可以将此功能添加到 iText7
,但目前没有。
同时,您可以尝试手动实现相同的功能。这个想法是在注释中找到一个外观流(/AP 键是起点),然后创建一个 PdfFormXObject
来包装那个外观流,然后添加它反对任何你喜欢的PdfCanvas
。