2010-03-02 6 views
19

Mam do czynienia z pewnym problemem w tworzeniu aplikacji dla iPhone'a dla "czytania pliku PDF". Próbowałem już następujące kod. Wiem, że użyłem niewłaściwych metod do parsowania - metody parsowania są właśnie używane do celów wyszukiwania. Ale chcę przekonwertować cały tekst pdf na ciąg znaków. Powiedz na przykład plik MobileHIG.pdf firmy Apple - użyłem go w tym kodzie.Czytanie plików PDF w postaci ciągów znaków za pomocą aplikacji iPhone'a

@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]; 
    } 
} 

Ale nie udało mi się przeczytać nawet jednej linii z dokumentu PDF. Czego jeszcze brakuje?

+0

Zobacz ten link http://www.iphonedevsdk.com/forum/iphone-sdk-development/29770-pdf-title- keywords-label.html - zawiera szczegóły, które odczytują plik pdf i wyciągają z niego ciąg znaków. Link podał szczegóły: - Wyodrębnianie spisu treści. –

+0

Jeśli ktoś potrzebuje więcej pomocy dotyczącej tego, co dokładnie chcę zrobić - przejdź do tego linku "http://www.random-ideas.net/posts/42" –

Odpowiedz

4

Zobacz, jak to robi przykładowa aplikacja QuartzDemo, w szczególności klasa QuartzPDFView w plikach QuartzImages.h i QuartzImages.m. Pokazuje przykład ładowania pliku PDF za pomocą kwarcu.

+0

Tak! Tak postarałem się, zredagowałem więcej w moim pytaniu. Proszę się wymeldować. Chcę tylko ciąg z pdf & Quartz daje obraz. –

14

Jeśli chcesz, aby wyodrębnić pewne treści z pliku pdf, może chcesz przeczytać:

Parsing PDF Content

z przewodnikiem programowania Quartz 2D.

Zasadniczo użyjesz obiektu CGPDFScanner do przeanalizowania zawartości, która działa w następujący sposób. Możesz zarejestrować kilka wywołań zwrotnych, które będą automatycznie wywoływane przez Quartz 2D po napotkaniu niektórych operatorów pdf w strumieniu PDF. Po tym początkowym kroku rozpoczniesz parsowanie strumienia PDF.

Po krótkiej analizie kodu wydaje się, że nie wykonano czynności wymaganych do przeanalizowania zawartości pliku PDF strony, którą uzyskasz przez CGPDFDocumentGetPage(). Najpierw musisz skonfigurować wywołania zwrotne za pomocą CGPDFOperatorTableCreate() i CGPDFOperatorTableSetCallback(), następnie otrzymasz stronę, musisz utworzyć strumień treści za pomocą tej strony (przy użyciu CGPDFContentStreamCreateWithPage()), a następnie utworzyć instancję od CGPDFScanner do CGPDFScannerCreate() i rozpocząć skanowanie przez .

Sekcja "Analizowanie zawartości PDF" dokumentu wskazanego przez powyższy adres URL zawiera wszystkie informacje wymagane do implementacji przetwarzania pdf.

Mam nadzieję, że to pomoże.

+0

Edytowałem moje pytanie. - Zobacz, już dodałem do tego metody. a także próbowałem skanować każdą stronę podczas wczytywania. Ale klucze CGPDFDictionary - jak ktoś może poznać środowisko wykonawcze? –

+0

poszedłem za tobą, ale jak mogę uzyskać zeskanowane dane? – jongbanaag

Powiązane problemy