CGPDFScannerScan不会触发回调函数

时间:2012-06-18 12:49:35

标签: objective-c ios pdf quartz-2d cgpdf

我使用Quartz解析pdf文件。

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

我的操作员表已创建,我使用 CGPDFOperatorTableSetCallback 将操作符添加到其中。一切似乎都没问题,只是不回调回调。

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

1 个答案:

答案 0 :(得分:2)

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

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