2012-06-18 70 views
1

我使用Quartz解析pdf文件。CGPDFScannerScan不會觸發回調函數

一切工作正常,除了一個文件。回調函數根本沒有調用。

我的操作員表已創建,我在其中添加了操作員CGPDFOperatorTableSetCallback。一切都看起來不錯,只是回調不叫。

你有什麼想法可以導致這種行爲?

+0

您是否開始掃描過程?你在找什麼操作員?也許他們不在該特定頁面中。 – iPDFdev

+0

當然,我開始掃描過程。我添加了許多運營商,如BT,ET,Tj,TJ,T *等。簡而言之,文本顯示和定位運營商,還有其他運營商。至少他們必須調用BT和ET,因爲我在該文件中有文本。該文件包含一個頁面。 – bob

+0

你說過:「除一個文件外,一切正常。」這是否意味着其他PDF文件的工作,只有一個不工作? – iPDFdev

回答

2

頁面內容是一個大型的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。

+0

嗨@iPDFdev,感謝您的評論, 我已經發現,我的PDF文件響應「Do」操作符。 我有2個頁面,每個頁面調用兩次「Do」操作符 PDF是簡單的文本,我想要的只是在swift中以字符串形式提取此文本,您能否告訴我一些方向該怎麼做。 這是我的PDF:http://www.filedropper.com/eula_2 – Dzior

+0

@Dzior類似PDFKitten的庫可能會幫助您進行文本提取。 – iPDFdev

+0

啊,謝謝你的回答,我們真的讓業主把它改成文本文件。非常感謝! – Dzior