当资源不在字典中时,如何从外观流中提取内容

本文关键字:外观 提取 资源 字典 | 更新日期: 2023-09-27 18:18:08

我正在尝试阅读PDF注释的外观流,使用iTextSharp,并从流中获取内容文本。

我使用下面的代码:

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()的另一种方式来获取文本?

当资源不在字典中时,如何从外观流中提取内容

pdf规范声明:

资源字典应以下列方式之一与内容流相关联:

  • 对于页面Contents条目值的内容流(或者是作为该条目值的数组元素),资源字典应该由页面字典的Resources指定,或者按照7.7.3.4"页面属性的继承"中的描述被继承。从页对象的某个祖先节点。

  • 对于其他内容流,符合标准的编写者应在流的字典中包含Resources条目,指定包含该内容流使用的所有资源的资源字典。这将适用于定义表单xobject、模式、Type 3字体和注释的内容流。

  • 遵循早期PDF版本编写的
  • PDF文件可能在页面上使用的所有形式xobject和Type 3字体中省略了Resources条目。从这些表单和字体中引用的所有资源都应从使用它们的页面的资源字典中继承。这个结构已经过时了,不应该被符合标准的编写者使用。

(ISO 32000-1第7.8.3节-资源字典)

因此,您找到的示例要么是第三种选择的一种情况,要么示例根本不需要任何资源,或者您的示例文件只是损坏了。