2016-03-20 44 views
5

該文檔對我來說不是很清楚。到目前爲止,我認爲我需要設置一個CGPDFOperatorTable,然後爲每個PDF頁面創建一個CGPDFContentStreamCreateWithPage和CGPDFScannerCreate。如何使用Swift解析PDF頁面中的內容

該文件涉及設置回調,但它不清楚如何。如何真正從頁面獲取內容?

這是我的代碼到目前爲止。

let pdfURL = NSBundle.mainBundle().URLForResource("titleofdocument", withExtension: "pdf") 

    // Create pdf document 
    let pdfDoc = CGPDFDocumentCreateWithURL(pdfURL) 

    // Nr of pages in this PF 
    let numberOfPages = CGPDFDocumentGetNumberOfPages(pdfDoc) as Int 

    if numberOfPages <= 0 { 
     // The number of pages is zero 
     return 
    } 

    let myTable = CGPDFOperatorTableCreate() 

    // lets go through every page 
    for pageNr in 1...numberOfPages { 

     let thisPage = CGPDFDocumentGetPage(pdfDoc, pageNr) 
     let myContentStream = CGPDFContentStreamCreateWithPage(thisPage) 
     let myScanner = CGPDFScannerCreate(myContentStream, myTable, nil) 

     CGPDFScannerScan(myScanner) 

     // Search for Content here? 
     // ?? 

     CGPDFScannerRelease(myScanner) 
     CGPDFContentStreamRelease(myContentStream) 

    } 

    // Release Table 
    CGPDFOperatorTableRelease(myTable) 

這是一個類似的問題:PDF Parsing with SWIFT,但還沒有答案。

+0

我想我必須寫回調,被稱爲當掃描儀掃描。有人可以發佈一個回調的例子嗎?這是一種用CGPDFOperatorTableSetCallback註冊的自定義方法嗎?一個例子會很棒。 –

+0

你知道這個事實,如果檢查沒有做任何事情?因爲它返回的if塊,然後繼續執行。要使頁面只在頁面中循環時,請將if塊內的所有內容放入else塊中。 – Eric

+0

我這樣做。我真的想更多地瞭解回調。我知道if語句,謝謝! –

回答

1

實際上您已經指定了如何操作,您只需將它放在一起並嘗試操作即可。

首先,你需要設置AA表回調爲你的國家,你自己在你的問題的開始(在Objective C中的所有代碼,而不是斯威夫特):

CGPDFOperatorTableRef operatorTable = CGPDFOperatorTableCreate(); 
CGPDFOperatorTableSetCallback(operatorTable, "q", &op_q); 
CGPDFOperatorTableSetCallback(operatorTable, "Q", &op_Q); 

此表包含列表您希望獲得的PDF運算符被調用並將回調與它們關聯起來。這些回調只是功能,您在其他位置定義:

static void op_q(CGPDFScannerRef s, void *info) { 
    // Do whatever you have to do in here 
    // info is whatever you passed to CGPDFScannerCreate 
} 

static void op_Q(CGPDFScannerRef s, void *info) { 
    // Do whatever you have to do in here 
    // info is whatever you passed to CGPDFScannerCreate 
} 

,然後創建掃描儀,並得到它去,同時通過它,你剛纔定義的信息。

// Passing "self" is just an example, you can pass whatever you want and it will be provided to your callback whenever it is called by the scanner. 
CGPDFScannerRef contentStreamScanner = CGPDFScannerCreate(contentStream, operatorTable, self); 

CGPDFScannerScan(contentStreamScanner);

如果您想查看有關如何查找和處理圖像的源代碼的完整示例,請參閱check this website

+0

謝謝!雖然我覺得我在正確的軌道上,你的答案看起來像我所需要的,但我只是無法將Objective C方法轉換爲有效的Swift回調。 –

+0

如何從** info **中獲取數據? – Hemang

4

這裏是斯威夫特實現回調的例子:

let operatorTableRef = CGPDFOperatorTableCreate() 

    CGPDFOperatorTableSetCallback(operatorTableRef, "BT") { (scanner, info) in 
     print("Begin text object") 
    } 
    CGPDFOperatorTableSetCallback(operatorTableRef, "ET") { (scanner, info) in 
     print("End text object") 
    } 
    CGPDFOperatorTableSetCallback(operatorTableRef, "Tf") { (scanner, info) in 
     print("Select font") 
    } 
    CGPDFOperatorTableSetCallback(operatorTableRef, "Tj") { (scanner, info) in 
     print("Show text") 
    } 
    CGPDFOperatorTableSetCallback(operatorTableRef, "TJ") { (scanner, info) in 
     print("Show text, allowing individual glyph positioning") 
    } 

    let numPages = CGPDFDocumentGetNumberOfPages(pdfDocument) 
    for pageNum in 1...numPages { 
     let page = CGPDFDocumentGetPage(pdfDocument, pageNum) 
     let stream = CGPDFContentStreamCreateWithPage(page) 
     let scanner = CGPDFScannerCreate(stream, operatorTableRef, nil) 
     CGPDFScannerScan(scanner) 
     CGPDFScannerRelease(scanner) 
     CGPDFContentStreamRelease(stream) 
    } 
+0

謝謝!即將進行測試,您的代碼看起來很棒。 –

+0

感謝您的答案,如何從'info'中獲取數據? – Hemang