我使用Quartz解析pdf文件。

除了一个文件之外,其他所有东西都可以正常工作。回调函数根本不被调用。

我的运算符表已创建,我使用 CGPDFOperatorTableSetCallback 向其中添加了运算符。一切似乎正常,只是不调用回调。

您是否知道会导致这种行为的原因?

最佳答案

页面内容是大型XObject。表单XObject是使用诸如页面之类的内容流的自包含图形对象。
您需要执行以下操作:在扫描的运算符列表中包括“Do”运算符。遇到它时,其操作数是XObject的符号名称。从页面字典中获取“资源”字典。从“资源”字典中获取“XObject”字典。从“XObject”字典中,使用与“Do”运算符一起使用的符号名称来获取xobject。从xobject获取'Subtype'键的值。如果是'Image',则忽略xobject,因为它是图像。如果它是“Form”,那么您有一个XObject表单。从xobject获取流,并以与扫描页面内容流相同的方式对其进行扫描。您可以重用相同的扫描程序类,只需要保留上下文即可知道要扫描的对象。表单XObjects可以使用其他表单XObjects,它们位于父表单XObject'Resources'字典中。
您的页面字典如下所示:

<<
/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>>
 >>

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

07-26 01:14