PdfArray.remove() 并未删除所有注释

sig*_*gil 1 c# pdf itext

我想从 PDF 中删除所有注释。我正在使用这段代码:

void removeAnnotations(string inputPath,string outputPath)
        {
            PdfReader pdfReader = new PdfReader(inputPath);
            PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(outputPath, FileMode.Create));
            PdfDictionary pageDict = pdfReader.GetPageN(1);
            PdfArray annotArray = pageDict.GetAsArray(PdfName.ANNOTS);
            for (int i = 0; i < annotArray.Size; i++)
            {
                annotArray.Remove(i);   
            }
            pdfStamper.Close();
        }
Run Code Online (Sandbox Code Playgroud)

当我第一次创建时annotArray,它有 217 个项目。在 的 for 循环之后annotArray.Remove(),它有 108 个项目,我仍然可以在 生成的 PDF 上看到一些标注和线条outputPath。我暂时不清楚其余项目有什么共同点,以及为什么它们被 跳过annotArray.Remove()。如何删除所有注释?

Bru*_*gie 5

假设数组中有 10 个元素:

array = [a, b, c, d, e, f, g, h, i, j]
Run Code Online (Sandbox Code Playgroud)

然后像这样循环数组:

for (int i = 0; i < array.Size; i++)
{
    array.Remove(i);   
}
Run Code Online (Sandbox Code Playgroud)

然后这是一步一步发生的事情:

步骤0

删除元素 0。结果:[b, c, d, e, f, g, h, i, j]

步骤1

删除元素 1。结果:[b, d, e, f, g, h, i, j]

第2步

删除元素 2。结果:[b, d, f, g, h, i, j]

步骤3

删除元素 3。结果:[b, d, f, h, i, j]

步骤4

删除元素 4。结果:[b, d, f, h, j]

步骤5

删除元素 5。没有元素 5,因此无需删除任何内容。结果:[b, d, f, h, j]

步骤 6 至 9

删除元素 6 到 9。没有元素 6 到 9,所以没有什么可删除的。结果:[b, d, f, h, j]

虽然我的数组只包含 10 个元素,而你的数组包含 128 个元素,但原理是相同的:由于代码中的逻辑错误,你不会删除所有注释。另一种类型的数组会抛出数组越界异常,但PdfArray不会这样做,因为为了更容忍数组不完整的错误 PDF。

您可以像这样修复您的代码:

int n = annotArray.Size;
for (int i = 0; i < n; i++)
{
    annotArray.Remove(0);   
}
Run Code Online (Sandbox Code Playgroud)

或者,正如您自己发现的那样,您可以立即删除所有注释:

pdfReader.RemoveAnnotations();
Run Code Online (Sandbox Code Playgroud)