我想从 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()。如何删除所有注释?
假设数组中有 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)