2016-03-20 12 views
5

ドキュメントをPDFページのコンテンツを解析することができますが、私には本当に明確ではありません。これまでのところ、CGPDFOperatorTableを設定し、PDFページごとにCGPDFContentStreamCreateWithPageとCGPDFScannerCreateを作成する必要があると思います。どのように私はスウィフト

ドキュメントには、コールバックを設定するを参照するが、それはどのように私には不明です。実際にページからコンテンツを取得するには?

これは、これまでの私のコードです。

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

あなたが実際にあなたがする必要があるすべてはそれを一緒に入れて、それが動作するまでしようとされ、それを行う方法を正確に指定しました。あなたがあなたの質問(のObjective Cのすべてのコード、NOTスウィフト)の先頭に自分自身を述べるよう

まず第一に、あなたはコールバックとセットアップAAテーブルに必要です:

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