2010-03-02 4 views
19

Ich habe ein Problem in der iPhone-Anwendungsentwicklung für "Lesen PDF". Ich habe folgenden Code ausprobiert. Ich weiß, dass ich falsche Methoden zum Parsen verwendet habe - Analysemethoden werden nur für Suchzwecke verwendet. Aber ich möchte ganzen PDF-Text in eine Zeichenfolge konvertieren. Sprich zum Beispiel Apples MobileHIG.pdf - ich habe es in diesem Code benutzt.Lesen von PDF-Dateien als Zeichenfolge durch iPhone-Anwendung

@implementation NetPDFViewController 

size_t totalPages; // a variable to store total pages 

// a method to get the pdf ref 
CGPDFDocumentRef MyGetPDFDocumentRef (const char *filename) { 
    CFStringRef path; 
    CFURLRef url; 
    CGPDFDocumentRef document; 
    path = CFStringCreateWithCString (NULL, filename,kCFStringEncodingUTF8); 
    url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0); 
    CFRelease (path); 
    document = CGPDFDocumentCreateWithURL (url);// 2 
    CFRelease(url); 
    int count = CGPDFDocumentGetNumberOfPages (document);// 3 
    if (count == 0) { 
     printf("`%s' needs at least one page!", filename); 
     return NULL; 
    } 
    return document; 
} 

// table methods to parse pdf 
static void op_MP (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    printf("MP /%s\n", name); 
} 

static void op_DP (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    printf("DP /%s\n", name); 
} 

static void op_BMC (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    printf("BMC /%s\n", name); 
} 

static void op_BDC (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    printf("BDC /%s\n", name); 
} 

static void op_EMC (CGPDFScannerRef s, void *info) { 
    const char *name; 
    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    printf("EMC /%s\n", name); 
} 

// a method to display pdf page. 

void MyDisplayPDFPage (CGContextRef myContext,size_t pageNumber,const char *filename) { 
    CGPDFDocumentRef document; 
    CGPDFPageRef page; 
    document = MyGetPDFDocumentRef (filename);// 1 
    totalPages=CGPDFDocumentGetNumberOfPages(document); 
    page = CGPDFDocumentGetPage (document, pageNumber);// 2 

    CGPDFDictionaryRef d; 

    d = CGPDFPageGetDictionary(page); 

// ----- edit problem here - CGPDFDictionary is completely unknown 
// ----- as we don't know keys & values of it. 
    CGPDFScannerRef myScanner; 
    CGPDFOperatorTableRef myTable; 
    myTable = CGPDFOperatorTableCreate(); 
    CGPDFOperatorTableSetCallback (myTable, "MP", &op_MP); 
    CGPDFOperatorTableSetCallback (myTable, "DP", &op_DP); 
    CGPDFOperatorTableSetCallback (myTable, "BMC", &op_BMC); 
    CGPDFOperatorTableSetCallback (myTable, "BDC", &op_BDC); 
    CGPDFOperatorTableSetCallback (myTable, "EMC", &op_EMC); 

    CGPDFContentStreamRef myContentStream = CGPDFContentStreamCreateWithPage (page);// 3 
    myScanner = CGPDFScannerCreate (myContentStream, myTable, NULL);// 4 

    CGPDFScannerScan (myScanner);// 5 

// CGPDFDictionaryRef d; 

    CGPDFStringRef str; // represents a sequence of bytes 

    d = CGPDFPageGetDictionary(page); 

    if (CGPDFDictionaryGetString(d, "Thumb", &str)){ 
     CFStringRef s; 
     s = CGPDFStringCopyTextString(str); 
     if (s != NULL) { 
      //need something in here in case it cant find anything 
      NSLog(@"%@ testing it", s); 
     } 
     CFRelease(s);  
//  CFDataRef data = CGPDFStreamCopyData (stream, CGPDFDataFormatRaw); 
    } 

// ----------------------------------- 

    CGContextDrawPDFPage (myContext, page);// 3 
    CGContextTranslateCTM(myContext, 0, 20); 
    CGContextScaleCTM(myContext, 1.0, -1.0); 
    CGPDFDocumentRelease (document);// 4 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 


// -------------------------------------------------------- 
// code for simple direct image from pdf docs. 
    UIGraphicsBeginImageContext(CGSizeMake(320, 460)); 
    initialPage=28; 
    MyDisplayPDFPage(UIGraphicsGetCurrentContext(), initialPage, [[[NSBundle mainBundle] pathForResource:@"MobileHIG" ofType:@"pdf"] UTF8String]); 
    imgV.image=UIGraphicsGetImageFromCurrentImageContext(); 
    imgV.image=[imgV.image rotate:UIImageOrientationDownMirrored]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint LasttouchPoint = [touch locationInView:self.view]; 
    int LasttouchX = LasttouchPoint.x; 
    startpoint=LasttouchX; 
} 


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 

} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint LasttouchPoint = [touch locationInView:self.view]; 
    int LasttouchX = LasttouchPoint.x; 
    endpoint=LasttouchX; 
    if(startpoint>(endpoint+75)){ 
     initialPage++; 
     [self loadPage:initialPage nextOne:YES]; 
    } else if((startpoint+75)<endpoint){ 
     initialPage--; 
     [self loadPage:initialPage nextOne:NO]; 
    } 
} 


-(void)loadPage:(NSUInteger)page nextOne:(BOOL)yesOrNo{ 
    if(page<=totalPages && page>0){ 
     UIGraphicsBeginImageContext(CGSizeMake(720, 720)); 
     MyDisplayPDFPage(UIGraphicsGetCurrentContext(), page, [[[NSBundle mainBundle] pathForResource:@"MobileHIG" ofType:@"pdf"] UTF8String]); 

     CATransition *transition = [CATransition animation]; 
     transition.duration = 0.75; 
     transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
     transition.type=kCATransitionPush; 
     if(yesOrNo){ 
      transition.subtype=kCATransitionFromRight; 
     } else { 
      transition.subtype=kCATransitionFromLeft; 
     } 

     transition.delegate = self; 
     [imgV.layer addAnimation:transition forKey:nil]; 
     imgV.image=UIGraphicsGetImageFromCurrentImageContext(); 
     imgV.image=[imgV.image rotate:UIImageOrientationDownMirrored]; 
    } 
} 

Aber ich habe Erfolg nicht bekommen, sogar eine einzelne Linie vom pdf Dokument zu lesen. Was fehlt noch?

+0

Siehe diesen Link http://www.iphonedevsdk.com/forum/iphone-sdk-development/29770-pdf-title- keywords-label.html - es hat Details, die PDF-Datei lesen und extrahiert String daraus. Link hat Details von - Extrahieren des Inhaltsverzeichnisses gegeben –

+0

Wenn jemand mehr Hilfe benötigt, was genau ich tun möchte - kann für diesen Link gehen "http://www.random-ideas.net/posts/42" –

Antwort

4

Sehen Sie sich an, wie die Beispielanwendung QuartzDemo dies tut, insbesondere die QuartzPDFView-Klasse in den Dateien QuartzImages.h und QuartzImages.m. Es zeigt ein Beispiel zum Laden einer PDF über Quartz.

+0

Ja! Ich habe es versucht, ich habe mehr in meiner Frage bearbeitet. Bitte checken sie aus. Ich will nur String von PDF & Quartz gibt das Bild. –

14

Wenn Sie einige Inhalte aus einer PDF-Datei extrahieren möchten, dann sollten Sie die folgenden lesen:

Parsing PDF Content

aus dem Quartz 2D Programmieranleitung.

Grundsätzlich verwenden Sie ein CGPDFScanner Objekt, um den Inhalt zu analysieren, der wie folgt funktioniert. Sie registrieren einige Callbacks, die von Quartz 2D bei einigen PDF-Operatoren im PDF-Stream automatisch aufgerufen werden. Nach diesem ersten Schritt beginnen Sie den PDF-Stream tatsächlich zu analysieren.

Mit einem kurzen Blick auf Ihren Code scheint es, dass Sie nicht die Schritte ausführen, die zum Analysieren des PDF-Inhalts der Seite erforderlich sind, die Sie durch CGPDFDocumentGetPage() erhalten. Sie müssen zuerst die Callbacks mit CGPDFOperatorTableCreate() und CGPDFOperatorTableSetCallback() einrichten, dann erhalten Sie die Seite, müssen Sie einen Content-Stream mit dieser Seite erstellen (CGPDFContentStreamCreateWithPage()) und dann eine CGPDFScanner durch CGPDFScannerCreate() instanziieren und tatsächlich über CGPDFScannerScan() scannen starten.

Der Abschnitt "PDF-Inhalt parsen" des Dokuments, auf den die obige URL verweist, enthält alle Informationen, die für die Implementierung der PDF-Analyse erforderlich sind.

Hoffe, das hilft.

+0

Ich habe meine Frage bearbeitet. - Sehen Sie, ich habe bereits Methoden dafür hinzugefügt. Außerdem habe ich versucht, jede Seite beim Laden zu scannen. Aber CGPDFDictionary Keys - wie kann jemand Runtime kennenlernen? –

+0

ich folgte dir, aber wie kann ich die gescannten Daten bekommen? – jongbanaag

Verwandte Themen