C# 从PDF中删除空批注

C# 从PDF中删除空批注,c#,itext,C#,Itext,我编写了一个C#程序,从PDF文件中无需任何操作即可删除注释。我使用iTextSharp。但是,在我的一个文件中,一个非空注释被删除(它是JavaScript操作),而其他非空注释则不会被删除。是这样吗?是因为我的代码还是有问题 使用系统; 使用System.IO; 使用iTextSharp.text.pdf; 命名空间删除空 { 班级计划 { 公共静态void Main() { //字节将保存我们的最终PDF 字节[]字节; 使用(var ms=new MemoryStream()){ 使用(

我编写了一个
C#
程序,从PDF文件中无需任何操作即可删除注释。我使用
iTextSharp
。但是,在我的一个文件中,一个非空注释被删除(它是JavaScript操作),而其他非空注释则不会被删除。是这样吗?是因为我的代码还是有问题

使用系统;
使用System.IO;
使用iTextSharp.text.pdf;
命名空间删除空
{
班级计划
{
公共静态void Main()
{
//字节将保存我们的最终PDF
字节[]字节;
使用(var ms=new MemoryStream()){
使用(var阅读器=新的PdfReader(“sandri6.pdf”)){
使用(var压模=新PdfStamper(读卡器,ms)){

对于(int i=1;i您提供的文档在其唯一页面上包含13个链接注释。与您的假设(所有注释都有关联的操作)相反,第二个注释没有操作,因此,您的代码正确地删除了它:

如您所见,对象778中的第二个注释没有条目


因此,对于示例文档,代码工作正常

但是,请注意,某些注释类型不仅可以具有标准操作(a条目),还可以(或者相反!)具有响应各种触发事件的附加操作。因此,对于通用解决方案,您还必须检查这些类型注释中的AA条目


但是,代码中存在错误,即使它没有在示例文档中触发。在注释删除循环中,我们看到:

for (int j = 0; j < annotationsArray.Size; j++) {
    // for current annotation
    PdfDictionary currentAnnotation = annotationsArray.GetAsDict(j);

    PdfDictionary annotationAction = currentAnnotation.GetAsDict(PdfName.A);
    if (annotationAction == null) {
        annotationsArray.Remove(j);
        Console.Write("Removed annotation {0} with no action from page {1}\n", j, i);
    }
}
或者通过在
注释数组之后递减
j
。删除(j)
调用


向后循环的优点是,
控制台
输出更有意义,在后一种情况下,注释索引并不总是表示原始数组中的索引,而只是表示当前中间数组中的索引。

谢谢您的回答。这是否意味着AA条目在第二个注释中存储JavaScript。我感到困惑,因为在另一个注释为空(Adobe Acrobat这样说)的情况下,它们不会被代码删除。如何修复此问题?@menteith“这是否意味着AA条目会在第二个注释中存储JavaScript。”-否。正如您在屏幕截图中看到的,第二个批注既没有A条目,也没有AA条目。@menteith关于您的另一个文件:我无法复制您的观察结果。正是那些没有操作的批注(恰好是作者姓名周围的链接批注)已删除。我通过检查PDF对象和在Acrobat中单击来进行检查。这很奇怪,因为在我的案例中,我重复了检查,并且这些注释尚未删除。您使用的是哪个版本的iTextSharp?我使用最新版本–5.5.10,并使用VS 2015编译代码。输出文件是否包含未删除的操作维德。我还更新了我的第一篇帖子,展示了所有的代码。你能检查一下吗?@Menth你更改了代码,不再检查A,只检查AA。我使用了你原来的代码,再次检查了A。(当我提到AA时,我不是说你要找它,而不是找A,而是除了找A之外).但现在,即使是原始代码中的实际错误也变得清晰了。我将编辑我的答案。
for (int j = 0; j < annotationsArray.Size; j++) {
    // for current annotation
    PdfDictionary currentAnnotation = annotationsArray.GetAsDict(j);

    PdfDictionary annotationAction = currentAnnotation.GetAsDict(PdfName.A);
    if (annotationAction == null) {
        annotationsArray.Remove(j);
        Console.Write("Removed annotation {0} with no action from page {1}\n", j, i);
    }
}
for (int j = annotationsArray.Size - 1; j >= 0; j--)