2010-03-02 11 views
19

के माध्यम से स्ट्रिंग के रूप में पीडीएफ फाइलें पढ़ना मुझे "पीडीएफ पढ़ने" के लिए आईफोन अनुप्रयोग विकास में कुछ समस्या का सामना करना पड़ रहा है। मैंने कोड का पालन करने का प्रयास किया है। मुझे पता है कि मैंने पार्सिंग के लिए गलत तरीके का उपयोग किया है - पार्सिंग विधियों का उपयोग उद्देश्य के उद्देश्य के लिए किया जाता है। लेकिन मैं पूरे पीडीएफ पाठ को एक स्ट्रिंग में कनवर्ट करना चाहता हूं। उदाहरण के लिए कहें ऐप्पल के मोबाइल एचआईजीपीडीएफ - मैंने इस कोड में उपयोग किया है।आईफोन एप्लिकेशन

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

लेकिन मुझे पीडीएफ दस्तावेज़ से भी एक पंक्ति पढ़ने में सफलता नहीं मिली। अभी भी क्या गुम है?

+0

इस लिंक http://www.iphonedevsdk.com/forum/iphone-sdk-development/29770-pdf-title- देखें कीवर्ड-लेबल.html - इसमें विवरण हैं जो पीडीएफ फ़ाइल पढ़ते हैं और इससे स्ट्रिंग निष्कर्ष निकालते हैं। लिंक ने विवरण दिया है - सामग्री की तालिका निकालने –

+0

अगर किसी को वास्तव में क्या करना है, इसके बारे में अधिक सहायता की आवश्यकता है - इस लिंक के लिए जा सकते हैं "http://www.random-ideas.net/posts/42" –

उत्तर

4

देखें कि QuartzDemo नमूना एप्लिकेशन यह करता है, विशेष रूप से QuartzPmFView क्लास QuartzImages.h और QuartzImages.m फ़ाइलों में करता है। यह क्वार्ट्ज के माध्यम से एक पीडीएफ लोड करने का एक उदाहरण दिखाता है।

+0

हां! मैंने ऐसा करने की कोशिश की है, मैंने अपने प्रश्न में और संपादित किया है। कृपया जांच लें। मैं सिर्फ पीडीएफ और क्वार्ट्ज से स्ट्रिंग चाहता हूं छवि दे रहा है। –

14

आप एक pdf फ़ाइल से कुछ सामग्री को निकालने के लिए चाहते हैं, तो आप निम्नलिखित पढ़ सकते हैं:

Parsing PDF Content

क्वार्ट्ज 2 डी प्रोग्रामिंग गाइड से

असल में, आप सामग्री को पार्स करने के लिए CGPDFScanner ऑब्जेक्ट का उपयोग करेंगे, जो निम्नानुसार कार्य करता है। आप कुछ कॉलबैक पंजीकृत करते हैं जिन्हें पीडीएफ स्ट्रीम में कुछ पीडीएफ ऑपरेटरों का सामना करने पर क्वार्ट्ज 2 डी द्वारा स्वचालित रूप से बुलाया जाएगा। इस प्रारंभिक चरण के बाद, आप वास्तव में पीडीएफ स्ट्रीम को पार्स करना शुरू कर देते हैं।

अपने कोड पर एक संक्षिप्त नज़र डालने पर, ऐसा प्रतीत होता है कि आप CGPDFDocumentGetPage() के माध्यम से प्राप्त पृष्ठ की पीडीएफ सामग्री को पार्स करने के लिए आवश्यक चरणों का पालन नहीं कर रहे हैं। आपको पहले CGPDFOperatorTableCreate() और CGPDFOperatorTableSetCallback() का उपयोग करके कॉलबैक सेट अप करने की आवश्यकता है, फिर आपको पृष्ठ मिल जाएगा, आपको उस पृष्ठ का उपयोग करके सामग्री स्ट्रीम बनाने की आवश्यकता है (CGPDFContentStreamCreateWithPage() का उपयोग करके) और फिर CGPDFScannerCGPDFScannerCreate() के माध्यम से तुरंत चालू करें और वास्तव में CGPDFScannerScan() के माध्यम से स्कैनिंग प्रारंभ करें।

उपर्युक्त यूआरएल द्वारा इंगित दस्तावेज़ के "पार्सिंग पीडीएफ सामग्री" अनुभाग में आपको पीडीएफ पार्सिंग को लागू करने के लिए आवश्यक सभी जानकारी मिलती है।

उम्मीद है कि इससे मदद मिलती है।

+0

मैंने अपना प्रश्न संपादित किया है। - देखें, मैंने इसके लिए पहले ही विधियां जोड़ दी हैं। और मैंने लोड होने पर प्रत्येक पृष्ठ को स्कैन करने का भी प्रयास किया है। लेकिन CGPDFDictionary कुंजी - कैसे रनटाइम जानने के लिए कोई आ सकता है? –

+0

मैंने आपका पीछा किया है लेकिन मैं स्कैन किए गए डेटा को कैसे प्राप्त कर सकता हूं? – jongbanaag

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