1

我使用 Quartz 解析 pdf 文件。

除了一个文件外,一切正常。回调函数根本不被调用。

我的运算符表已经创建,我使用CGPDFOperatorTableSetCallback添加了运算符。一切似乎都很好,只是没有调用回调。

你知道什么会导致这种行为吗?

4

1 回答 1

2

页面内容是一个大型 XObject。表单 XObject 是自包含的图形对象,它们使用类似于页面的内容流。
您需要执行以下操作:在扫描的运算符列表中包含“Do”运算符。当遇到它时,它的操作数是 XObject 的符号名。从页面字典中获取“资源”字典。从“资源”字典中获取“XObject”字典。从“XObject”字典中使用与“Do”运算符一起使用的符号名称获取您的 xobject。从 xobject 获取“子类型”键的值。如果它是“图像”,则忽略 xobject,因为它是图像。如果它是“表单”,那么您有一个表单 XObject。从 xobject 获取流并以与扫描页面内容流相同的方式对其进行扫描。您可以重用相同的扫描器类,您只需要保留上下文以了解您正在扫描的对象。
您的页面字典如下所示:

<<
/ArtBox[0.0 0.0 768.0 7066.0]
/BleedBox[0.0 0.0 768.0 7066.0]
/Contents 29 0 R
/CropBox[0.0 0.0 768.0 7066.0]
/Group 62 0 R
/MediaBox[0.0 0.0 768.0 7066.0]
/Parent 23 0 R
/Resources
 <<
  /ExtGState<</GS0 30 0 R>>
  /XObject<</Fm0 61 0 R>>
 >>
/Rotate 0
/TrimBox[0.0 0.0 768.0 7066.0]
/Type/Page
>> 

“Fm0”是页面内容流中使用的表单 XObject 的名称,是“Do”运算符的操作数。它的资源字典如下所示:

/Resources
 <<
  /ColorSpace<</CS0 32 0 R>>
  /ExtGState<</GS0 34 0 R/GS1 30 0 R>>
  /Font<</T1_0 38 0 R/T1_1 40 0 R>>
  /ProcSet[/PDF/Text]
  /XObject<</Fm0 45 0 R/Fm1 48 0 R/Fm2 51 0 R/Fm3 54 0 R/Fm4 57 0 R/Fm5 60 0 R>>
 >>

如您所见,它使用了几种其他形式的 XObject。

于 2012-06-19T12:17:23.310 回答