我使用Quartz解析pdf文件。CGPDFScannerScan不會觸發回調函數
一切工作正常,除了一個文件。回調函數根本沒有調用。
我的操作員表已創建,我在其中添加了操作員CGPDFOperatorTableSetCallback。一切都看起來不錯,只是回調不叫。
你有什麼想法可以導致這種行爲?
我使用Quartz解析pdf文件。CGPDFScannerScan不會觸發回調函數
一切工作正常,除了一個文件。回調函數根本沒有調用。
我的操作員表已創建,我在其中添加了操作員CGPDFOperatorTableSetCallback。一切都看起來不錯,只是回調不叫。
你有什麼想法可以導致這種行爲?
頁面內容是一個大型的XObject。表單XObjects是使用類似頁面的內容流的獨立圖形對象。
您需要執行以下操作:在掃描的運算符列表中包含'Do'運算符。遇到它時,其操作數是XObject的符號名稱。從頁面字典中獲取「資源」字典。從「資源」字典中獲取「XObject」字典。從'XObject'字典中,使用與'Do'操作符一起使用的符號名稱來獲取您的xobject。從xobject獲取「子類型」鍵的值。如果它是'圖像',則忽略該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」是頁面內容流中使用的窗體X對象,操作數爲「做」運營商的名稱。它的資源字典如下所示:
/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
當然,我開始掃描過程。我添加了許多運營商,如BT,ET,Tj,TJ,T *等。簡而言之,文本顯示和定位運營商,還有其他運營商。至少他們必須調用BT和ET,因爲我在該文件中有文本。該文件包含一個頁面。 – bob
你說過:「除一個文件外,一切正常。」這是否意味着其他PDF文件的工作,只有一個不工作? – iPDFdev