0

我正在尝试使用 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);

这通常适用于从注释中获取外观文本,但我发现了一个xObject没有/Resources键的 FreeTextCallout 示例,如其 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()

4

1 回答 1

2

对此,pdf规范声明:

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

  • 对于作为页面 Contents 条目值的内容流(或作为该条目值的数组元素),资源字典应由页面字典的 Resources指定 或被继承,如 7.7 中所述。 3.4,“页面属性的继承”,来自页面对象的一些祖先节点。

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

  • 按照早期版本的 PDF 编写的 PDF 文件可能已经省略 了页面上使用的所有形式 XObjects 和 Type 3 字体的Resources 条目。从这些表单和字体中引用的所有资源都应从使用它们的页面的资源字典中继承。此构造已过时,不应该被符合规范的作者使用。

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

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

于 2016-11-15T20:57:36.387 回答