是否有人使用CGPDFScanner来解析字体字典的ToUnicode CMap流条目?我遇到了一些麻烦。
我从字典中获取CGPDFStream引用并尝试使用它构建CGPDFScanner。问题是CGPDFScanner将CGPDFContentStream作为参数,而不是CGPDFStream。
当我为文本操作符解析CGPDFPage时,我可以很容易地获得带有CGPDFContentStreamCreateWithPage的CGPDFContentStream,但是姐妹函数CGPDFContentStreamCreateWithStream - 这就是说“你可以使用这个函数来访问表单,模式,Type3字体的内容,或任何PDF流“ - 在CGPDFContentStream Reference中有些混乱,我无法找到示例代码。
无论如何,我将CMap流作为 stream 参数传递,资源CGPDFDictionary从流中获取,其中CGPDFStreamGetDictionary作为 streamResources 参数,页面内容流作为< EM>父的。资源字典可以从流本身轻松获得,所以为什么还要先考虑它呢?最重要的是,传递NULL作为参数,但第一个似乎没有任何效果。
结果总是一样的:当我尝试使用带有几个回调的扫描仪扫描内容流时,我收到以下消息
`begincodespacerange' isn't an operator. `beginbfrange' isn't an operator. ... `endbfrange' isn't an operator.
为回调表中设置的每个运算符。这适用于遇到的每一个CMap。
所以,我不确定内容流是否以错误的方式设置,如果运算符无效或者CGPDFScanner不能用于解析CMap,即使它是常规的pdf流对象,也不得不求助于编写我自己的扫描程序来解析流数据。
答案 0 :(得分:3)
CGPDFScanner只能解析PDF内容流,包含要显示的内容的流。页面内容,表单XObjects,模式,Type3字体共享相同的流格式。 ToUnicode CMap是一个完全不同的流,它使用与内容流不同的语法。您需要编写自己的扫描程序来解析CMap。 ToUnicode CMap格式记录在Adobe PDF规范,PDF参考1.7,Adobe技术说明#5014和#5411的第5.9.2节中。