2011-01-28 17 views
2

是否有人使用CGPDFScanner來解析字體字典的ToUnicode CMap流入口?我遇到了一些麻煩。使用CGPDFScanner解析CMap流

我從字典中獲取CGPDFStream引用並嘗試使用它創建CGPDFScanner。問題是CGPDFScanner將CGPDFContentStream作爲參數,而不是CGPDFStream。

當我解析文本運營商CGPDFPage我可以輕鬆地獲得與CGPDFContentStreamCreateWithPage的CGPDFContentStream,不過姐姐功能CGPDFContentStreamCreateWithStream - 這是說,「你可以使用此功能以訪問形式,模式,類型3的內容字體或任何PDF流「 - 在CGPDFContentStream Reference有點泥濘,我無法找到示例代碼。

不管怎樣,我通過CMAP的流作爲說法,CGPDFDictionary從流得到CGPDFStreamGetDictionary作爲streamResources參數和頁面內容流作爲資源。資源字典可以很容易地從流本身獲得,所以爲什麼要首先問它呢?最重要的是,傳遞NULL作爲參數,但第一個參數似乎沒有任何影響。

結果總是相同的:當我嘗試設置了一些回調,我得到了以下信息

 
`begincodespacerange' isn't an operator. 
`beginbfrange' isn't an operator. 
... 
`endbfrange' isn't an operator. 

爲每個運營商在回調錶設置掃描儀掃描的內容流。這爲每個遇到的CMap。

所以,我不確定內容流是否設置錯誤,如果操作符無效或者如果CGPDFScanner不能用於解析CMap,即使它是普通的pdf流對象,也不能訴諸寫我自己的掃描儀來解析流數據。

回答

3

CGPDFScanner只能解析包含要顯示的內容的PDF內容流。頁面內容,表單XObjects,模式,Type3字體共享相同的流格式。 ToUnicode CMap是一個完全不同的流,它使用與內容流不同的語法。你需要寫你自己的掃描儀來解析CMap。 ToUnicode CMap格式記錄在Adobe PDF規範中,PDF參考1.7,Adobe技術說明#5014和#5411的第5.9.2節。

+0

我明白了。另外,查看PDF操作表(Appendinx A),所有CMap操作符都沒有跟蹤。 「任何PDF流」與CGPDFContentStreamCreateWithStream一起欺騙了我。謝謝你的解釋。 – sigsegv 2011-01-28 13:35:56