2016-03-20 5 views
5

analysieren Die Dokumentation ist mir nicht wirklich klar. Bis jetzt muss ich eine CGPDFOperatorTable einrichten und dann eine CGPDFContentStreamCreateWithPage und CGPDFScannerCreate pro PDF-Seite erstellen.Wie kann ich Inhalt von einer PDF-Seite mit Swift

Die Dokumentation bezieht sich auf die Einrichtung von Callbacks, aber es ist mir unklar, wie. Wie erhalte ich den Inhalt von einer Seite?

Dies ist mein Code so weit.

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) 

Es ist eine ähnliche Frage: PDF Parsing with SWIFT hat aber noch keine Antworten.

+0

Ich glaube, ich Rückrufe zu schreiben, die, wenn die Scanner scannt aufgerufen werden. Kann jemand ein Beispiel für einen Rückruf posten? Ist es eine benutzerdefinierte Methode, die ich bei CGPDFOperatorTableSetCallback registriere? Ein Beispiel wäre großartig. –

+0

Sie sind sich der Tatsache bewusst, dass die Überprüfung nichts bewirkt? weil es aus dem if-Block zurückkehrt und dann weiter ausführt. Um zu erreichen, dass nur die Seiten durchlaufen werden, wenn es Seiten gibt, lege alles nach dem if-Block in einen else-Block. – Eric

+0

tue ich. Ich möchte wirklich mehr über Rückrufe wissen. Ich bin mir der if-Anweisung bewusst, aber danke! –

Antwort

1

Sie haben tatsächlich genau angegeben, wie es geht, alles was Sie tun müssen, ist es zusammenzusetzen und zu versuchen, bis es funktioniert.

Zunächst einmal müssen Sie Setup aa Tisch mit Rückrufe, wie Sie sich am Anfang Ihrer Frage angeben (alle Code in Objective C, Swift NOT):

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

Diese Tabelle enthält eine Liste der enthält die PDF-Operatoren, die Sie abrufen möchten, und ordnen Sie ihnen einen Rückruf zu. Diese Rückrufe sind einfach Funktionen Sie definieren anderswo:

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 
} 

Und dann legen Sie den Scanner und damit es funktioniert, während es die Informationen geben Sie gerade definiert haben.

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

Wenn Sie ein vollständiges Beispiel mit Quellcode zum Suchen und Verarbeiten von Bildern sehen möchten, geben Sie check this website ein.

+0

Danke! Obwohl ich denke, dass ich auf dem richtigen Weg bin und Ihre Antwort wirklich aussieht, was ich brauche, kann ich die Objective-C-Methode einfach nicht in einen funktionierenden Swift-Callback übersetzen. –

+0

Wie bekomme ich Daten aus ** info **? – Hemang

4

Hier ist ein Beispiel für die in Swift implementiert Rückrufe:

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

Danke! Um das bald zu testen, sieht dein Code gut aus. –

+0

Danke für die Antwort, wie man Daten aus 'info' holt? – Hemang

Verwandte Themen