2016-03-20 12 views
5

ile nasıl ayrıştırabilirim? Belgelerim bana açık değildir. Şimdiye kadar bir CGPDFOperatorTable kurmak ve daha sonra PDF sayfası başına bir CGPDFContentStreamCreateWithPage ve CGPDFScannerCreate oluşturmak gerektiğini düşünüyorum.PDF sayfadan içeriği Swift

Belgeler, Geri Aramaların ayarlanması anlamına gelir, ancak bunun nasıl yapılacağı açık değildir. Bir sayfadan içerik nasıl edinilir?

Bu benim kodum şu ana kadar. PDF Parsing with SWIFT ancak henüz hiçbir cevap vermektedir:

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) 

Bu benzer bir soru.

+0

: Burada –

+0

Eğer kontrol bir şey yapmıyorsa farkında mısınız? çünkü if bloğundan çıkar ve sonra yürütmeye devam eder. Sayfalar varsa sadece sayfalar arasında dolaşmak için, eğer herhangi bir bloğun içindeki bloktan sonra her şeyi koyun. – Eric

+0

Yaparım. Geri aramalar hakkında daha çok şey bilmek istiyorum. If ifadesinden haberdarım, teşekkürler! –

cevap

1

Gerçekten nasıl yapılacağını tam olarak belirttiniz, yapmanız gereken tek şey birlikte koymak ve çalışana kadar denemek. Her şeyden

Öncelikle, (Objective C tüm kod Swift DEĞİL) Sorunuzun başında kendinizi ifade olarak geri aramaları ile kurulum aa masaya gerekir:

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

Bu tablo bir listesini içerir İstediğiniz PDF operatörleri aranır ve onlarla bir geri çağrı ilişkilendirir. Eğer sadece tanımlanmış bilgiyi geçerken,

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 
} 

Ve sonra tarayıcıyı oluşturup gidiyor olsun: O geri aramalar sadece başka bir yerde tanımlamak fonksiyonları vardır.

( )

Görüntü kodunun nasıl bulunacağı ve işleneceği konusunda kaynak kodu içeren tam bir örnek görmek isterseniz, check this website. Ben ne zaman tarayıcı taramaları denir geri aramalar, yazmak zorunda herhalde

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

Teşekkürler! Doğru yolda olduğumu hissediyorum ve cevabım gerçekten neye ihtiyacım var gibi görünse de, Objective C yöntemini çalışan bir Swift geri çağrısına çeviremiyorum. –

+0

** bilgi ** dışında nasıl veri alınır? – Hemang

4

Swift uygulanan geri aramaları bir örnektir. Birisi bir geri arama örneği gönderebilir mi? CGPDFOperatorTableSetCallback ile kaydettiğim özel bir yöntem mi? Bir örnek harika olurdu.
+0

Teşekkürler! Yakında bunu test etmek için kodunuz harika görünüyor. –

+0

Cevabınız için teşekkürler, veriden nasıl bilgi alınır? – Hemang