2010-07-27 41 views
12

Aşağıdaki kodu kullanıyorum. eğer her zaman hedef dizeye girer. sayfa numarası döngüsünü almaya gitmiyor. pdf, hedef dizgeyi bulduysa, başka bir kısma gitmeyecektir. sayfa numarasını hedef dizeden nasıl alabilirim. Aşağıdaki kodun bir örneğini görebilirsiniz. Şimdiden teşekkürler.Pdf ayrıştırma sırasında hedef dizeden sayfa numarası nasıl alınır

- (OutlineItem*)recursiveUpdateOutlines: (CGPDFDictionaryRef) outlineDic parent:(OutlineItem*) parentItem level:(NSUInteger) level; 
{ 
    // update outline count 
    outlineCount++; 
    OutlineItem* item = [[OutlineItem alloc] init]; 
    // Level 
    item.level = level; 
    // Title 
    CGPDFStringRef title; 
    if(CGPDFDictionaryGetString(outlineDic, "Title", &title)) { 
     const char* pchTitle = CGPDFStringGetBytePtr(title); 
     item.title = [NSString stringWithUTF8String:pchTitle]; 
     // DEBUG 
     //NSLog(item.title); 
    } 
    if (parentItem != nil) { 
     // Add to parent 
     [parentItem.children addObject:item]; 
     // Next 
     CGPDFDictionaryRef nextDic; 
     if (CGPDFDictionaryGetDictionary(outlineDic, "Next", &nextDic)) { 
      [self recursiveUpdateOutlines:nextDic parent:parentItem level: level]; 
     } 
    } 
    // First child 
    CGPDFDictionaryRef firstDic; 
    if (CGPDFDictionaryGetDictionary(outlineDic, "First", &firstDic)) { 
     [self recursiveUpdateOutlines:firstDic parent:item level: level + 1]; 
    } 
    // Dest 
    CGPDFStringRef destString; 
    if(CGPDFDictionaryGetString(outlineDic, "Dest", &destString)) { 
     const char* pchDest = CGPDFStringGetBytePtr(destString); 
     CGPDFDictionaryRef destDic; 
     if(CGPDFDictionaryGetDictionary(dests, pchDest, &destDic)) { 
      NSLog(@""); 
     } 
     else { 

      item.destString = [NSString stringWithUTF8String:pchDest]; 
     } 


    } else { 
     CGPDFDictionaryRef ADic; 
     if (CGPDFDictionaryGetDictionary(outlineDic, "A", &ADic)) { 
      const char* pchS; 
      if (CGPDFDictionaryGetName(ADic, "S", &pchS)) { 
       CGPDFArrayRef destArray; 
       if (CGPDFDictionaryGetArray(ADic, "D", &destArray)) { 
        int count = CGPDFArrayGetCount(destArray); 
        switch (count) { 
         case 5: 
         { 
          // dest page 
          CGPDFDictionaryRef destPageDic; 
          if (CGPDFArrayGetDictionary(destArray, 0, &destPageDic)) { 
           int pageNumber = [self.pages indexOfObjectIdenticalTo:destPageDic]; 
           item.page = pageNumber; 
          } 
          // x 
          CGPDFInteger x; 
          if (CGPDFArrayGetInteger(destArray, 2, &x)) { 
           item.x = x; 
          } 
          // y 
          CGPDFInteger y; 
          if (CGPDFArrayGetInteger(destArray, 3, &y)) { 
           item.y = y; 
          } 
          // z 
         } 
          break; 
         default: 
          NSLog(@""); 
          break; 
        } 
       } 
      } 
     } 
    } 


    return item; 
} 

cevap

1

PDF'yi ilk açtığınızda ve sayfaları aldığınızda, tüm sayfa başvurularını bir dizide saklayabilirsiniz. Daha sonra bir Dest referansı aldığınızda, dizideki öğelere göre eşleştirmeniz yeterlidir ve sayfa numarasını bileceksiniz.

CGPDFDocumentRef docRef = CGPDFDocumentCreateWithURL(fileURL); 
int numberOfPages = CGPDFDocumentGetNumberOfPages(docRef); 
pagePointers = [[NSMutableArray alloc] initWithCapacity:numberOfPages]; 
if (0<numberOfPages) for (int i=1; i<numberOfPages; i++) { 
    [pagePointers addObject:[NSValue valueWithPointer:CGPDFPageGetDictionary(CGPDFDocumentGetPage(docRef, i))]]; 
} 

Eğer bir kez yapmanız ve docRef TUTUN Eğer "Annots" dizi okurken Hedef başvuran gibi, sayfa Sözlük referanslar aynı olacaktır. PagePointers dizinizdeki nesnenin indeksi sayfa numarasıdır (0 ile başlayarak doğal olarak 1 eklersiniz).

İlgili konular