根据以下帖子: iTextSharp PDF 使用 C# 读取突出显示的文本(突出显示注释)
这段代码:
for (int i = pageFrom; i <= pageTo; i++) {
PdfDictionary page = reader.GetPageN(i);
PdfArray annots = page.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS);
if (annots!=null)
foreach (PdfObject annot in annots.ArrayList) {
PdfDictionary annotation = (PdfDictionary)PdfReader.GetPdfObject(annot);
PdfString contents = annotation.GetAsString(PdfName.CONTENTS);
// now use the String value of contents
}
}
}
Run Code Online (Sandbox Code Playgroud)
正在努力提取 PDF 注释。但是为什么以下相同的代码无法突出显示(特别是 PdfName.HIGHLIGHT 不起作用):
for (int i = pageFrom; i <= pageTo; i++) {
PdfDictionary page = reader.GetPageN(i);
PdfArray annots = page.GetAsArray(iTextSharp.text.pdf.PdfName.HIGHLIGHT);
if (annots!=null)
foreach (PdfObject annot in annots.ArrayList) {
PdfDictionary annotation = (PdfDictionary)PdfReader.GetPdfObject(annot);
PdfString contents = annotation.GetAsString(PdfName.CONTENTS);
// now use the String value of contents
}
}
}
Run Code Online (Sandbox Code Playgroud)
请查看 ISO-32000-1(又称 PDF 参考)中的表 30。它的标题是“页面对象中的条目”。在这些条目中,您可以找到一个名为 的键Annots。其值为:
(可选)注释字典数组,其中应包含对与页面关联的所有注释的间接引用(请参阅第 12.5 节“注释”)。
您将找不到带有诸如 之类的键的条目Highlight,因此当您有以下行时,返回的数组为 null 是正常的:
PdfArray annots = page.GetAsArray(iTextSharp.text.pdf.PdfName.HIGHLIGHT);
Run Code Online (Sandbox Code Playgroud)
您需要按照您已经做的方式获取注释:
PdfArray annots = page.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS);
Run Code Online (Sandbox Code Playgroud)
现在您需要循环该数组并查找Subtype等于的 注释Highlight。这种类型的注释列在 ISO-32000-1 的表 169 中,标题为“注释类型”。
换句话说,您认为页面字典包含带有键的条目的假设Highlight是错误的,如果您阅读整个规范,您还会发现您所做的另一个错误假设。您错误地假设突出显示的文本存储在Contents注释条目中。这表明人们对注释与页面内容的本质缺乏了解。
您要查找的文本存储在页面的内容流中。页面的内容流独立于页面的注释。Highlight因此,要获取突出显示的文本,您需要获取存储在注释中(存储在数组中)的坐标QuadPoints,并且需要使用这些坐标来解析页面内容中这些坐标处存在的文本。