【问题标题】:CGPDFScannerScan doesn't fire callback functionsCGPDFScannerScan 不会触发回调函数
【发布时间】:2012-06-20 10:43:59
【问题描述】:

我使用 Quartz 解析 pdf 文件。

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

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

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

【问题讨论】:

  • 您是否开始了扫描过程?您在寻找哪些运营商?也许它们不在该特定页面中。
  • 确定我开始扫描过程。我添加了很多操作符,如BT,ET,Tj,TJ,T* ...等。简而言之,文本显示和定位操作符,还有其他操作符。至少他们必须调用 BT 和 ET,因为我在那个文件中有文本。该文件包含一页。
  • 您说:“除了一个文件外,一切正常”。这是否意味着其他 PDF 文件可以工作而只有一个不能工作?
  • 文件可能不包含您要查找的运算符。您在页面上看到的文字可能只是线条和曲线,没有实际文字。或者页面内容可能是需要单独解析的大型 XObject。如果您可以将文件放在某个地方,我可以查看它并为您提供更多详细信息。
  • 我查过了,你是对的。我试图将所有运算符放在表中,结果发现调用了一些回调。以下是具有回调的运算符列表:cs、scn、gs、re、W、n、Do。

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


【解决方案1】:

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

【讨论】:

  • 嗨@iPDFdev,感谢您的评论,我实际上发现,我的pdf文件响应“Do”运算符。我有 2 页,每页调用两次“Do”操作符 PDF 是简单的文本,我想要的只是将这个文本快速提取为字符串,你能给我一些指导吗?这是我的 pdf:filedropper.com/eula_2
  • @Dzior 像 PDFKitten 这样的库可能会帮助您进行文本提取。
  • 啊,谢谢您的回答,我们实际上让企业主将其更改为文本文件。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-11-23
  • 2015-03-29
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2014-01-26
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多