2016-03-20 21 views
5

Tài liệu không thực sự rõ ràng đối với tôi. Cho đến nay tôi nghĩ rằng tôi cần phải thiết lập một CGPDFOperatorTable và sau đó tạo ra một CGPDFContentStreamCreateWithPage và CGPDFScannerCreate cho mỗi trang PDF.Làm cách nào để phân tích nội dung từ trang PDF bằng Swift

Tài liệu tham chiếu để thiết lập Callbacks, nhưng không rõ với tôi như thế nào. Làm thế nào để thực sự có được nội dung từ một trang?

Đây là mã của tôi cho đến thời điểm này.

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) 

Câu hỏi tương tự như: PDF Parsing with SWIFT nhưng chưa có câu trả lời.

+0

Tôi nghĩ tôi phải viết callbacks, được gọi khi máy quét quét. Ai đó có thể đăng một ví dụ về một cuộc gọi lại không? Có một phương pháp tùy chỉnh mà tôi đăng ký với CGPDFOperatorTableSetCallback? Một ví dụ sẽ là tuyệt vời. –

+0

Bạn nhận thức được thực tế nếu kiểm tra không làm gì cả? bởi vì nó trả về trong khối if và sau đó tiếp tục thực hiện. Để làm cho nó chỉ vòng qua các trang nếu có các trang, hãy đặt mọi thứ sau khối nếu bên trong khối khác. – Eric

+0

Tôi có. Tôi thực sự muốn biết thêm về callbacks. Tôi nhận thức được tuyên bố nếu, mặc dù mặc dù! –

Trả lời

1

Bạn đã thực sự xác định chính xác cách thực hiện, tất cả những gì bạn cần làm là đặt nó lại với nhau và thử cho đến khi nó hoạt động.

Trước hết, bạn cần phải bảng aa thiết lập với callbacks như bạn nêu mình trong đầu câu hỏi của bạn (tất cả các mã trong Objective C, KHÔNG Swift):

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

Bảng này chứa một danh sách các toán tử PDF mà bạn muốn được gọi và liên kết một cuộc gọi lại với chúng. Những cuộc gọi lại này chỉ đơn giản là các chức năng mà bạn xác định ở nơi khác:

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 
} 

Sau đó, bạn tạo máy quét và thực hiện nó, trong khi chuyển thông tin bạn vừa xác định.

// 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);

Nếu bạn muốn xem ví dụ hoàn chỉnh với mã nguồn trên cách tìm và xử lý hình ảnh, check this website.

+0

Cảm ơn! Mặc dù tôi cảm thấy như tôi đang đi đúng hướng và câu trả lời của bạn thực sự trông giống như những gì tôi cần, tôi chỉ không thể dịch phương thức Objective C sang một cuộc gọi lại Swift đang hoạt động. –

+0

cách lấy dữ liệu ra khỏi ** thông tin **? – Hemang

4

Dưới đây là một ví dụ về callbacks thực hiện trong Swift:

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

Cảm ơn! Sẽ sớm thử nghiệm điều này, mã của bạn sẽ rất tuyệt. –

+0

Cảm ơn câu trả lời, cách lấy dữ liệu ra khỏi 'thông tin'? – Hemang

Các vấn đề liên quan