我想从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();
}
当我第一次创建annotArray
时,它有217个项目。在annotArray.Remove()
的for循环之后,它有108个项目,我仍然可以在outputPath
生成的PDF上看到一些标注和行。我不清楚剩下的项目有什么共同点,以及annotArray.Remove()
跳过它们的原因。如何删除每个注释?
答案 0 :(得分:4)
假设数组中有10个元素:
array = [a, b, c, d, e, f, g, h, i, j]
然后循环遍历数组:
for (int i = 0; i < array.Size; i++)
{
array.Remove(i);
}
然后这是一步一步发生的事情:
第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);
}
或者,正如您自己发现的那样,您可以立即删除所有注释:
pdfReader.RemoveAnnotations();
答案 1 :(得分:1)
删除所有注释相当容易:
In [32]: df.loc[df.Diff < 0, 'Diff'] = 365 + df.Day - df.shift().loc[df.Diff < 0, 'Day']
In [33]: df
Out[33]:
Day Diff
0 137 0.0
1 185 48.0
2 249 64.0
3 139 255.0
答案 2 :(得分:0)
免责声明:我没有使用过itextSharp。我很好奇为什么它不应该删除。虽然代码看起来还不错。我用Google搜索并发现了一些您可能感兴趣的内容。希望它有所帮助。
您无法使用“删除”注释删除注释 iTextSharp的。您必须根据原始和方式创建新的PDF 这样做是用PDFReader打开原文,使用RemoveAt来摆脱 在内存中不需要的注释,然后使用PDFstamper或PDFcopy 根据剩下的内容制作新的PDF。
Remove Annotation using PDF Object Number