2016-03-20 6 views
5

La documentazione non è molto chiara per me. Finora ho bisogno di configurare un CGPDFOperatorTable e quindi creare una pagina CGPDFContentStreamCreateWithPage e CGPDFScannerCreate per PDF.Come posso analizzare il contenuto da una pagina PDF con Swift

La documentazione si riferisce all'impostazione di Callback, ma non è chiaro come. Come ottenere effettivamente il contenuto da una pagina?

Questo è il mio codice finora.

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) 

E 'una domanda simile a: PDF Parsing with SWIFT ma non ha ancora risposto.

+0

mi sa che devo scrivere callback, che sono chiamati quando viene eseguita la scansione. Qualcuno può pubblicare un esempio di callback? È un metodo personalizzato che mi registro con CGPDFOperatorTableSetCallback? Un esempio sarebbe grandioso. –

+0

Sei consapevole del fatto che il controllo se non fa nulla? perché ritorna fuori dal blocco if e quindi continua ad essere eseguito. Per fare solo scorrere le pagine se ci sono pagine, metti tutto dopo il blocco if all'interno di un altro blocco. – Eric

+0

lo faccio. Voglio davvero saperne di più sui callback. Sono a conoscenza dell'istruzione if, grazie però! –

risposta

1

Hai effettivamente specificato esattamente come farlo, tutto ciò che devi fare è metterlo insieme e provare fino a quando non funziona.

Prima di tutto, è necessario impostare tavolo aa con callback come affermate voi stessi all'inizio della tua domanda (tutto il codice in Objective C, NON Swift):

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

Questa tabella contiene un elenco delle gli operatori PDF ai quali si desidera essere richiamati e associa loro una richiamata. Quei callback sono semplicemente funzioni definite altrove:

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 
} 

e quindi si crea lo scanner e farlo andare, passando le informazioni di appena definito.

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

Se si desidera visualizzare un esempio completo con codice sorgente su come trovare ed elaborare le immagini, check this website.

+0

Grazie! Anche se mi sento come se fossi sulla buona strada e la tua risposta sembra davvero quella di cui ho bisogno, non sono in grado di tradurre il metodo Objective C in un callback Swift funzionante. –

+0

come ottenere i dati da ** informazioni **? – Hemang

4

Ecco un esempio di callback implementate in 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

Grazie! Andando a testare questo presto, il tuo codice sembra fantastico. –

+0

Grazie per la risposta, come ottenere i dati da 'info'? – Hemang

Problemi correlati