2016-03-20 43 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