2013-08-16 3 views
1

Я пытаюсь разобрать PDF-документ с каркасом Quartz и скопировать &, вставив фрагменты кода из документации Apple в мой исходный код. К сожалению, он не извлекает данные. Он просто перебирает страницы, регистрирует номер текущей страницы на консоли и сбой в конце. У вас есть идея о том, что не так с кодом?Анализ документов PDF с помощью Quartz

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; 

    NSLog(@"DP /%s\n", name); 
} 

static void op_BMC (CGPDFScannerRef s, void *info) 
{ 
    const char *name; 

    if (!CGPDFScannerPopName(s, &name)) 
     return; 

    NSLog(@"BMC /%s\n", name); 
} 

static void op_BDC (CGPDFScannerRef s, void *info) 
{ 
    const char *name; 

    if (!CGPDFScannerPopName(s, &name)) 
     return; 
    NSLog(@"BDC /%s\n", name); 
} 

static void op_EMC (CGPDFScannerRef s, void *info) 
{ 
    const char *name; 

    if (!CGPDFScannerPopName(s, &name)) 
     return; 

    NSLog(@"EMC /%s\n", name); 
} 

static void op_TJ (CGPDFScannerRef s, void *info) 
{ 
    const char *name; 

    if (!CGPDFScannerPopName(s, &name)) 
     return; 

    NSLog(@"TJ /%s\n", name); 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    CGPDFDocumentRef myDocument; 
    NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"pdf"]; 
    NSURL *fileUrl = [NSURL fileURLWithPath:urlAddress]; 
    CFURLRef url = (__bridge CFURLRef)fileUrl; 
    myDocument = CGPDFDocumentCreateWithURL(url); 

    CFRelease (url); 

    if (myDocument == NULL) {// 2 
     NSLog(@"can't open `%@'.", fileUrl); 
    } 
    if (!CGPDFDocumentIsUnlocked (myDocument)) {// 4 
     CGPDFDocumentRelease(myDocument); 
    } 
    else if (CGPDFDocumentGetNumberOfPages(myDocument) == 0) {// 5 
     CGPDFDocumentRelease(myDocument); 
    } 
    else { 
     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); 
     CGPDFOperatorTableSetCallback (myTable, "Tj", &op_TJ); 

     int k; 
     CGPDFPageRef myPage; 
     CGPDFScannerRef myScanner; 
     CGPDFContentStreamRef myContentStream; 

     int numOfPages = CGPDFDocumentGetNumberOfPages (myDocument);// 1 
     for (k = 0; k < numOfPages; k++) { 
      myPage = CGPDFDocumentGetPage (myDocument, k + 1);// 2 
      myContentStream = CGPDFContentStreamCreateWithPage (myPage);// 3 
      myScanner = CGPDFScannerCreate (myContentStream, myTable, NULL);// 4 
      CGPDFScannerScan (myScanner);// 5 
      CGPDFPageRelease (myPage);// 6 
      CGPDFScannerRelease (myScanner);// 7 
      CGPDFContentStreamRelease (myContentStream);// 8 
      NSLog(@"processed page %i",k); 
     } 
     CGPDFOperatorTableRelease(myTable); 
     CGPDFDocumentRelease(myDocument); 
    } 

    return YES; 
} 

ответ

1

Я не запускал код, но первые 5 операторов могут отсутствовать в содержимом вашей страницы. Также некоторые из них имеют операнд имени, некоторые из них не имеют операндов (таких как EMC). Также оператор Tj имеет строковый операнд, а не имя.
Удалите все методы поп-названия и оставьте только журнал, и вы можете получить некоторый результат. Затем посмотрите в спецификации PDF, чтобы увидеть точные операнды для каждого оператора и соответствующим образом обновить свой код.

0

Пока я не могу дать вам решение вашей аварии пример кода, в прошлый раз мы должны сделать это, мы основывали наши синтаксический PDFKitten.

https://github.com/KurtCode/PDFKitten

Если вы заинтересованы в коде разбора, интересный материал находится в Scanner.m:

https://github.com/KurtCode/PDFKitten/blob/master/PDFKitten/Scanner.m

Учитывая сложность PDF разбора я хотел бы предложить, работая с этой библиотекой как база и движется оттуда. Если вам нужна полированная реализация в крайний срок, то PSPDFKit, вероятно, является самым хорошо разработанным (но дорогостоящим) пакетом.

+0

Мне нужно будет искать строки, которые встроены в определенные форматы (например, все строки, которые являются заголовками или полужирным шрифтом). Какую структуру вы бы рекомендовали для этой цели? PSPDFKit слишком дорого для моего дела. – AlexR

0

Речь идет о CFRelease(url). Удалите его, и все будет хорошо.

"(__bridge T) op присваивает операнд типу назначения T. Если T является сохраняемым типом указателя объекта, то op должен иметь не сохраняемый тип указателя."