Itext 7:无法删除注释或展平文档

时间:2017-04-25 13:59:40

标签: c# pdf annotations itext7 stamp

自从冲压过程大部分工作以来,我一直在玩耍。现在我试图从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);
    }
}

OR

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中的展平 bool的方法 - 我能得到的最接近的是将注释标记设置为锁定 ...不是最理想的压扁方式。

1 个答案:

答案 0 :(得分:4)

删除注释

方法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