2016-03-20 16 views
5

Dokumentacja nie jest dla mnie jasna. Do tej pory uważam, że muszę ustawić CGPDFOperatorTable, a następnie utworzyć CGPDFContentStreamCreateWithPage i CGPDFScannerCreate na stronie PDF.Jak analizować zawartość ze strony PDF za pomocą Swift

Ta dokumentacja dotyczy konfiguracji wywołań zwrotnych, ale nie jest dla mnie jasne, w jaki sposób. Jak faktycznie uzyskać zawartość ze strony?

To jest mój kod do tej pory.

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) 

Jest to podobne pytanie: PDF Parsing with SWIFT ale nie ma jeszcze żadnych odpowiedzi.

+0

Sądzę muszę napisać wywołania zwrotne, które są wywoływane, gdy skaner skanuje. Czy ktoś może wysłać przykład wywołania zwrotnego? Czy jest to niestandardowa metoda, którą rejestruję w CGPDFOperatorTableSetCallback? Przykład byłby świetny. –

+0

Czy zdajesz sobie sprawę z tego, że sprawdzenie, czy coś nie działa? ponieważ powraca z bloku if, a następnie kontynuuje wykonywanie. Aby było tylko przeglądać strony, jeśli istnieją strony, umieść wszystko za blokiem if wewnątrz bloku else. – Eric

+0

Ja robię. Naprawdę chcę wiedzieć więcej na temat wywołań zwrotnych. Zdaję sobie jednak sprawę z tego oświadczenia, dziękuję! –

Odpowiedz

1

Podałeś dokładnie, jak to zrobić, wszystko, co musisz zrobić, to złożyć go razem i spróbować, aż to zadziała.

Przede wszystkim, trzeba konfiguracji tabeli aa z wywołania zwrotne jak stwierdza się w początku swoje pytanie (cały kod w Objective C, NIE Swift):

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

Ta tabela zawiera listę operatory plików PDF, które chcesz wywoływać i kojarzą z nimi wywołanie zwrotne. callbacks te są po prostu działa zdefiniować gdzie indziej:

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 
} 

A następnie utworzyć skaner i dostać to będzie, a przekazując mu informacje, które po prostu zdefiniowane.

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

Jeśli chcesz zobaczyć pełny przykład kodu źródłowego, w jaki sposób wyszukiwać i przetwarzać obrazy, check this website.

+0

Dzięki! Chociaż mam wrażenie, że jestem na dobrej drodze, a twoja odpowiedź naprawdę wygląda na to, czego potrzebuję, po prostu nie jestem w stanie przetłumaczyć metody Objective C na działający callback Swift. –

+0

jak uzyskać dane z ** informacji **? – Hemang

4

Oto przykład wywołania zwrotne realizowane w 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

Dzięki! Wkrótce, aby to sprawdzić, Twój kod wygląda świetnie. –

+0

Dzięki za odpowiedź, jak uzyskać dane z 'info'? – Hemang

Powiązane problemy