2011-03-18 28 views
5

पर स्पर्श करता हूं तो पीडीएफ एनोटेशन कैसे प्राप्त करें मैंने एक ऐसा एप्लीकेशन विकसित किया है जो कैटिल्ड परत का उपयोग करके आईपैड पर पीडीएफ प्रदर्शित करता है। अब तक, बहुत अच्छा & लेकिन एक समस्या है जो वास्तव में मुझे अपने आखिरी बाल कटौती करता है। मेरे पास एम्बेडेड एनोटेशन के साथ एक पीडीएफ है। प्रत्येक एनोटेशन में एक यूआरएल है। मैं टच एरिया के निर्देशांक पा सकता हूं लेकिन प्रश्न यह है कि अगर मैं अपनी उंगली के नीचे एनोटेशन करता हूं और ब्राउजर में इसे खोलने के लिए यूआरएल कैसे निकाला जाता हूं तो मैं कैसे पा सकता हूं?जब मैं आईपैड स्क्रीन

यदि कोई भी इस बारे में कोई विचार साझा कर सकता है कि यह कैसे किया जा सकता है, तो मैं वास्तव में आपकी मदद की सराहना करता हूं!

अग्रिम

+0

समाधान: http://stackoverflow.com/questions/4080373/get-pdf-hyperlinks-on-ios-with-quartz आशा इस विस्तृत उत्तर के लिए – AmineG

उत्तर

6

धन्यवाद एनोटेशन हो रही CGPDF के साथ बहुत मुश्किल नहीं है, हालांकि यह एक छोटे से पहली बार में मेरे लिए लगभग नगण्य की आवश्यकता है।

//Get the current page ref 
CGPDFPageRef currentPdfPage = CGPDFDocumentGetPage(pdfDocumentRef, page); 

//Get the page dictionary 
CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(currentPdfPage); 
CGPDFArrayRef annotsArray; 

//Get the Annots array 
if(!CGPDFDictionaryGetArray(pageDictionary, "Annots", &annotsArray)) { 
    //DLog(@"No Annots found for page %d", page); 
    [self updateProgress]; 
    return; 
} 

int annotsArrayCount = CGPDFArrayGetCount(annotsArray); 
//DLog(@"%d annots found for page %d in file %@", annotsArrayCount, page, _fileName); 
NSMutableArray* touchRectsArray = [[NSMutableArray alloc] initWithCapacity:annotsArrayCount]; 
for (int j=annotsArrayCount; j >= 0; j--) { 
    int destPageNumber = 0; 
    NSString* uri = nil; 

    //DLog(@"%d/%d", j+1, annotsArrayCount); 

    CGPDFObjectRef aDictObj; 
    if(!CGPDFArrayGetObject(annotsArray, j, &aDictObj)) { 
     //DLog(@"%@", @"can't get dictionary object"); 
     continue; 
    } 

    CGPDFDictionaryRef annotDict; 
    if(!CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict)) { 
     //DLog(@"%@", @"can't get annotDict"); 
     continue; 
    } 

    //------------ 
    CGPDFDictionaryRef aDict; 
    CGPDFArrayRef destArray; 
    if(CGPDFDictionaryGetDictionary(annotDict, "A", &aDict)) { 
     CGPDFStringRef uriStringRef; 
     if(CGPDFDictionaryGetString(aDict, "URI", &uriStringRef)) { 
      char* uriString = (char *)CGPDFStringGetBytePtr(uriStringRef); 
      uri = [NSString stringWithCString:uriString encoding:NSUTF8StringEncoding]; 
     } 
    } else { 
     continue; 
    } 

यह आपको यूआरएल मिलेगा। हो रही rects:

CGPDFArrayRef rectArray; 
    if(!CGPDFDictionaryGetArray(annotDict, "Rect", &rectArray)) { 
     DLog(@"%@", @"can't get Rect"); 
    } 

    int arrayCount = CGPDFArrayGetCount(rectArray); 
    CGPDFReal coords[4]; 
    for (int k = 0; k < arrayCount; k++) { 
     CGPDFObjectRef rectObj; 
     if(!CGPDFArrayGetObject(rectArray, k, &rectObj)) { 
      DLog(@"%@", @"can't get rect data"); 
     } 

     CGPDFReal coord; 
     if(!CGPDFObjectGetValue(rectObj, kCGPDFObjectTypeReal, &coord)) { 
      DLog(@"%@", @"can't get coords"); 
     } 

     coords[k] = coord; 
    } 

    CGRect drawRect = [[SharedConfig valueForKey:@"screenSize"] CGRectValue]; 
    BOOL drawBoxIsLandscape = NO; 
    if (1 < drawRect.size.width/drawRect.size.height) { 
     drawBoxIsLandscape = YES; 
    } 

    CGRect pageRect = CGRectIntegral(CGPDFPageGetBoxRect(currentPdfPage, kCGPDFMediaBox)); 
    landscape = NO; 
    if (1 < pageRect.size.width/pageRect.size.height) { 
     landscape = YES; 
    } 

    float ratio = 0.0; 

    //Get the rect of the clickable area 
    //CGRect coordsRect = CGRectMake(coords[0], coords[1], coords[2], coords[3]); 
    //Transform to new coordinate system 
    CGRect originalRect = CGRectMake(coords[0], (pageRect.size.height-(coords[3]-coords[1]))-coords[1], coords[2]-coords[0], coords[3]-coords[1]); 

    CGPDFInteger pageRotate = 0; 
    CGPDFDictionaryGetInteger(pageDictionary, "Rotate", &pageRotate); 

    if (pageRotate == 90 || pageRotate == 270) { 
     CGFloat temp = pageRect.size.width; 
     pageRect.size.width = pageRect.size.height; 
     pageRect.size.height = temp; 
     ratio = drawRect.size.height/pageRect.size.height; 
    }  

    if (drawBoxIsLandscape) { 
     ratio = landscape ? (drawRect.size.height/pageRect.size.height) : (drawRect.size.height/pageRect.size.width); 

     if (landscape && drawRect.size.width < pageRect.size.width*ratio) { 
      ratio = drawRect.size.width/pageRect.size.width; 
     } else if (!landscape && drawRect.size.height < pageRect.size.width*ratio) { 
      ratio = drawRect.size.height/pageRect.size.width; 
     } 
    } else { 
     ratio = landscape ? (drawRect.size.height/pageRect.size.width) : (drawRect.size.height/pageRect.size.height); 

     if (landscape && drawRect.size.width < pageRect.size.height*ratio) { 
      ratio = drawRect.size.width/pageRect.size.height; 
     } else if (!landscape && drawRect.size.height < pageRect.size.height*ratio) { 
      ratio = drawRect.size.height/pageRect.size.height; 
     } 
    } 

    CGRect calculatedRect = CGRectMake(originalRect.origin.x*ratio, originalRect.origin.y*ratio, originalRect.size.width*ratio, originalRect.size.height*ratio); 

    if ((landscape && !drawBoxIsLandscape) || (!landscape && drawBoxIsLandscape)) { 
     CGFloat width = calculatedRect.size.width; 
     calculatedRect.size.width = calculatedRect.size.height; 
     calculatedRect.size.height = width; 

     CGFloat yModifier = drawRect.size.height-(pageRect.size.width*ratio); 

     CGFloat x = calculatedRect.origin.x; 
     calculatedRect.origin.x = calculatedRect.origin.y; 
     calculatedRect.origin.y = drawRect.size.height-(x+calculatedRect.size.height)-yModifier; 

    } 

    if (nil != uri) { 
     [touchRectsArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithCGRect:calculatedRect], @"rect", uri, @"targetUrl", nil]]; 
    } 

आप पहली बार, एनोटेशन की आयत हो जाता है डिवाइस पर बदल देती है समन्वय प्रणाली है, तो कुछ पुनर्गणना करता है, आकार और पुनः स्थिति, स्क्रीन करने के लिए पेज के आधार पर कोड के इस बिट देख सकते हैं अनुपात, रोटेशन कारक इत्यादि। अंत में आपके पास उस पृष्ठ के स्पर्श-सक्रिय क्षेत्रों की एक सरणी होगी। अंतिम रूप से निपटने के लिए निम्नलिखित सरल समाधान किया जा सकता है: क्वार्ट्ज का उपयोग कर

- (void) tapGesture:(UIGestureRecognizer*)sender 
{ 
if (UIGestureRecognizerStateEnded == sender.state) { 
    CGPoint touchPoint = [sender locationInView:self.view]; 

    if (nil != self.touchRects) for (int i=0; i<[self.touchRects count]; i++) { 
     if (CGRectContainsPoint([[[self.touchRects objectAtIndex:i] objectForKey:@"rect"] CGRectValue], touchPoint)) { 
      if ([[self.touchRects objectAtIndex:i] objectForKey:@"targetUrl"]) { 
       NSString* targetUrl = [[self.touchRects objectAtIndex:i] objectForKey:@"targetUrl"]; 
       DLog(@"Hit found for target url: %@", targetUrl); 
       NSURL* url = [NSURL URLWithString:targetUrl]; 
       [[UIApplication sharedApplication] openURL:url]; 
      }    return; 
     }  
    } 
    DLog(@"No hit found for touch at %@", NSStringFromCGPoint(touchPoint)); 
} 
} 
+0

धन्यवाद, मैंने पहले से ही अपनी समस्या का समाधान करने में कामयाब रहा है। मैंने देखा है कि आप पीडीएफ पेज प्राप्त करने के लिए मीडियाबॉक्स का उपयोग कर रहे हैं। मैं क्रॉपबॉक्स का उपयोग कर रहा हूं और यह चीजों को थोड़ा जटिल बनाता है ... – Adviser2010

संबंधित मुद्दे