我正在尝试使用iTextSharp读取PDF注释的外观流,并从流中获取内容文本。当资源不在字典中时如何从外观流中提取内容?
我用下面的代码:
public String ExtractAnnotationText(PdfStream xObject)
{
PdfDictionary resources = xObject.GetAsDict(PdfName.RESOURCES);
ITextExtractionStrategy strategy = new LocationTextExtractionStrategy();
PdfContentStreamProcessor processor = new PdfContentStreamProcessor(strategy);
byte[] contentByteArray = ContentByteUtils.GetContentBytesFromContentObject(xObject);
processor.ProcessContent(contentByteArray, resources);
return strategy.GetResultantText();
}
xObject
从外观字典检索和传递这样的:
PRStream value = (PRStream)appearancesDictionary.GetAsStream(key);
String text = ExtractAnnotationText(value);
这通常非常适用于正从注释外观文,但我找到了一个FreeTextCallout的示例,其中xObject
没有/Resources
密钥,如其hashMap所示:
[/Type, /XObject]
[/Subtype, /Form]
[/FormType, 1]
[/Length, 71]
[/Matrix, [1, 0, 0, 1, -28.7103, -643.893]]
[/BBox, [28.7103, 643.893, 597.85, 751.068]]
[/Filter, /FlateDecode]
在这种情况下,是否有另一种方法来构造一个Resources
字典传递到PdfContentStreamProcessor.ProcessContent()
?或者甚至以不同的方式获取文本而不使用ProcessContent()
?
可能是一个破碎的文件;我的项目的目标是采用由Foxit错误构建的PDF,并修改它们以在Adobe Reader中呈现时正确运行。在这种情况下,也许我必须编写一个替代外观文本解析器。 – sigil
*“Foxit错误地构建”* - Foxit以何种方式错误地构造pdfs? (我还没有认真对待它......) – mkl
如果确认Foxit不正确地构造pdf文件,那么向他们发送错误报告可能会有用。 –