2010-08-10 8 views
7

पृष्ठभूमि का एक छोटा सा हिस्सा: मैं पहले से मौजूद पीडीएफ फ़ाइल में एक छवि जोड़ रहा हूं। मुझे पता चला कि इसमें कोई पृष्ठ जोड़ने का कोई तरीका नहीं है, आपको पूरे पीडीएफ को फिर से बनाना होगा, फिर पुराने को हटा दें और फिर नया स्थानांतरित करें। (यदि यह गलत है कृपया मुझे बताएं, और यह मुझे बहुत सारे सिरदर्द बचाएगा।) मैंने उस भाग को पूरा कर लिया है, लेकिन अब मैं सहायक जानकारी (शीर्षक, लेखक, कुंजी, आदि) की प्रतिलिपि बनाने की कोशिश कर रहा हूं। । समस्या यह है कि इतनी सारी प्रकार की समस्याएं हैं कि मैं जिस मौजूदा विधि का उपयोग कर रहा हूं वह है CGGDFDocumentRef के CGPDFDictionaryRef को प्राप्त करने के लिए, फिर CGPDFDictionaryApplierFunction को कॉल करें। सी फ़ंक्शन में मैं इसे पास करता हूं, मैं प्रत्येक कुंजी को एनएसएमयूटेबल डिक्शनरी में निकाल रहा हूं ताकि मैं मूल्यों के साथ कुछ कर सकूं और उन्हें इस भयानक CGPDF प्रारूप में लॉक न कर सकूं।CGPDFDictionaryRef कुछ उपयोगी

तो मूल रूप से मेरा प्रश्न होगा: क्या ऐसा करने का कोई बेहतर तरीका है? मैंने इतनी सारी प्रलेखन फाइलों पर देखा है कि मैं कुछ भी याद करने की कल्पना नहीं कर सकता था, लेकिन वास्तव में उम्मीद है कि मेरे पास ऐसा है क्योंकि मुझे जो कामकाज करना है वह बेतुका हो रहा है।

+0

मैं आज भी इस समस्या में भाग गया। अभी भी एक समाधान पर काम कर रहे हैं। यह जांच करेगा और अगर मुझे कुछ मिल जाए तो पोस्ट भी करेगा। –

+1

धन्यवाद। जब मैं समाप्त हो जाता हूं तो मैं अपना कामकाज पोस्ट करूंगा। मैं वास्तव में इसे नफरत करता हूं क्योंकि यह अविश्वसनीय रूप से अक्षम है। एसडीके में अंतर्निहित विधि के बिना शायद उतना ही अच्छा होगा, लेकिन इसकी बदसूरत। – alunsford3

+0

हाँ यह बुरा लग रहा है। मैं व्यक्तिगत रूप से पीडीएफ ऑब्जेक्ट को पीडीएफएआरई या पीडीएफ डिक्शनरी में जोड़ने की कोशिश कर रहा हूं, और एक सीडीपीडीएफ ऑब्जेक्ट के लिए किसी ऐड को एक्सेस या बनाने या संपादित करने या डालने में सक्षम नहीं होने की एक ही समस्या में भाग लेता हूं। यह वास्तव में एक मजाक है कि एपीआई कितनी खराब है। –

उत्तर

0

आप CGPDFContext में ड्राइंग करके जो वर्णन कर रहे हैं उसे पूरा कर सकते हैं, लेकिन यदि आपके पास जटिल पीडीएफ है, तो आप एपीआई के इरादे से परे कुछ करने का प्रयास कर रहे हैं। आप PDF spec की धारा 3.4 पर एक नज़र डाल सकते हैं और देख सकते हैं कि आप क्या प्राप्त कर रहे हैं।

+0

आप किस पीडीएफ स्पेक का जिक्र कर रहे हैं? पूरक आईएसओ 32000, अनुपूरक आईएसओ 32000-1, या डॉक्टर प्रबंधन? उनमें से कोई भी वास्तव में उपयोगी प्रतीत होता है। सीजीपीडीएफसीएन्टेक्स्ट के लिए, जहां तक ​​मैं कह सकता हूं, ड्राइंग के लिए है, जो मैं उपयोग करता हूं। लेकिन एक पीडीएफ की प्रतिलिपि बनाने के लिए, मुझे एक CGPDFDocumentRef का उपयोग करके एक से पढ़ना होगा, फिर एप्पल क्वार्ट्ज 2 डी प्रोग्रामिंग गाइड के अनुसार, CGPDFContext पर जाएं। (http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_pdf/dq_pdf.html) – alunsford3

+0

सादा "spec" पर्याप्त होगा, जैसा कि मैंने संदर्भित अनुभाग हाल ही में नहीं बदला है, जहां तक ​​xref को पुनः लिखना है, आदि .: http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf – jbm

+0

आह धन्यवाद। मुझे लगता है कि मैं जो खोज रहा हूं उससे थोड़ा अधिक स्तर कम है। मैं इसे अपने नियोक्ता के बारे में बताउंगा और इसे छोड़ दूंगा। Haha। – alunsford3

10

मैंने अपना कामकाज पूरा कर लिया है। मैं अभी भी जानना चाहूंगा कि ऐसा करने का कोई बेहतर तरीका है, इसलिए यदि आप एक के बारे में जानते हैं या कोई सुझाव है तो मैं उन्हें आज़माने के लिए तैयार हूं।

नोट्स: मैं केवल बूल, स्याही, तार और सरणी की जांच करता हूं क्योंकि ऐप्पल के दस्तावेज के मुताबिक पीडीएफ में सहायक जानकारी में होना चाहिए। सरणी बिट अनचाहे है, क्योंकि मेरे पास Aux जानकारी में एक सरणी वाला पीडीएफ नहीं है। अगर कोई मेरे लिए यह जांचना चाहेगा या पीडीएफ से लिंक करेगा तो मैं खुशी से इसका परीक्षण करूंगा।

सबसे पहले, कक्षा शीर्षलेख में @interface टैग के बाहर बनाएँ ताकि CGPDFDictionaryApplyFunction द्वारा सी सी फ़ंक्शंस वर्तमान कक्षा तक पहुंच सकें। जानकारी संग्रहीत करने के लिए NSDictionary *auxInfo भी जोड़ें। एक बार निकाले, एन एस प्रकार आसानी से इस तरह ढाला जा सकता है:

CFDictionaryRef newDictionary = (CFDictionaryRef)[self auxInfo]; 

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

- (void)extractPDFDictionary:(CGPDFDocumentRef)pdf{ 
    NSLog(@"extractingPDFDictionary"); 
    CGPDFDictionaryRef oldDict = CGPDFDocumentGetInfo(pdf); 
    CGPDFDictionaryApplyFunction(oldDict, copyDictionaryValues, NULL); 
} 

void copyDictionaryValues (const char *key, CGPDFObjectRef object, void *info) { 
    NSLog(@"key: %s", key); 
    CGPDFObjectType type = CGPDFObjectGetType(object); 
    switch (type) { 
     case kCGPDFObjectTypeString: { 
      CGPDFStringRef objectString; 
      if (CGPDFObjectGetValue(object, kCGPDFObjectTypeString, &objectString)) { 
       NSString *tempStr = (NSString *)CGPDFStringCopyTextString(objectString); 
       [[selfClass auxInfo] setObject:tempStr 
             forKey:[NSString stringWithCString:key encoding:NSUTF8StringEncoding]]; 
       [tempStr release]; 
       NSLog(@"set string value"); 
      } 
     } 
     case kCGPDFObjectTypeInteger: { 
      CGPDFInteger objectInteger; 
      if (CGPDFObjectGetValue(object, kCGPDFObjectTypeInteger, &objectInteger)) { 
       [[selfClass auxInfo] setObject:[NSNumber numberWithInt:objectInteger] 
             forKey:[NSString stringWithCString:key encoding:NSUTF8StringEncoding]]; 
       NSLog(@"set int value"); 
      } 
     } 
     case kCGPDFObjectTypeBoolean: { 
      CGPDFBoolean objectBool; 
      if (CGPDFObjectGetValue(object, kCGPDFObjectTypeBoolean, &objectBool)) { 
       [[selfClass auxInfo] setObject:[NSNumber numberWithBool:objectBool] 
             forKey:[NSString stringWithCString:key encoding:NSUTF8StringEncoding]]; 
       NSLog(@"set boolean value"); 
      } 
     } 
     case kCGPDFObjectTypeArray : { 
      CGPDFArrayRef objectArray; 
      if (CGPDFObjectGetValue(object, kCGPDFObjectTypeArray, &objectArray)) { 
       NSArray *tempArr = [selfClass copyPDFArray:objectArray]; 
       [[selfClass auxInfo] setObject:tempArr 
             forKey:[NSString stringWithCString:key encoding:NSUTF8StringEncoding]]; 
       [tempArr release]; 
       NSLog(@"set array value"); 
      } 
     } 

    } 
} 

- (NSArray *)copyPDFArray:(CGPDFArrayRef)arr{ 
    int i = 0; 
    NSMutableArray *temp = [[NSMutableArray alloc] init]; 
    for(i=0; i<CGPDFArrayGetCount(arr); i++){ 
     CGPDFObjectRef object; 
     CGPDFArrayGetObject(arr, i, &object); 
     CGPDFObjectType type = CGPDFObjectGetType(object); 
     switch(type){ 
      case kCGPDFObjectTypeString: { 
       CGPDFStringRef objectString; 
       if (CGPDFObjectGetValue(object, kCGPDFObjectTypeString, &objectString)) { 
        NSString *tempStr = (NSString *)CGPDFStringCopyTextString(objectString); 
        [temp addObject:tempStr]; 
        [tempStr release]; 
       } 
      } 
      case kCGPDFObjectTypeInteger: { 
       CGPDFInteger objectInteger; 
       if (CGPDFObjectGetValue(object, kCGPDFObjectTypeInteger, &objectInteger)) { 
        [temp addObject:[NSNumber numberWithInt:objectInteger]]; 
       } 
      } 
      case kCGPDFObjectTypeBoolean: { 
       CGPDFBoolean objectBool; 
       if (CGPDFObjectGetValue(object, kCGPDFObjectTypeBoolean, &objectBool)) { 
        [temp addObject:[NSNumber numberWithBool:objectBool]]; 
       } 
      } 
      case kCGPDFObjectTypeArray : { 
       CGPDFArrayRef objectArray; 
       if (CGPDFObjectGetValue(object, kCGPDFObjectTypeArray, &objectArray)) { 
        NSArray *tempArr = [selfClass copyPDFArray:objectArray]; 
        [temp addObject:tempArr]; 
        [tempArr release]; 
       } 
      } 
     } 
    } 
    return temp; 
} 
+0

+1: वाह महान काम, मेरे संशोधनों के साथ इसे आज़माने के लिए जा रहा है (क्योंकि मैं वास्तव में केवल ऑक्स जानकारी को पार्स करने के लिए इसका उपयोग नहीं कर रहा हूं।) यदि सरणी बिट भी काम करता है तो मैं आपको बता दूंगा। एक बार फिर धन्यवाद। –

+0

कोई समस्या नहीं है। हालांकि कोड के लिए बस एक छोटा सा अपडेट, मैं प्रत्येक मामले के अंत में 'ब्रेक' रखना भूल गया। यह अभी भी वही काम करता है जो मुझे लगता है, लेकिन यह स्विच को ठीक से चलाता है। मैंने थोड़ा और परीक्षण किया और मुझे लगता है कि यह किसी भी तरह की कीवर्ड और विषय कुंजी गायब है। मुझे कुछ देखना है। – alunsford3

+0

एक समस्या जिसमें मैं अन्य कोडों को शामिल करने के लिए अपना कोड विस्तारित कर रहा हूं, क्या कोई सीडीपीडीएफ में पीडीएफ नाम प्रकार के बराबर नहीं है, इस पर कोई दिशानिर्देश नहीं है, मैं स्ट्रिंग केस के लिए एक CGPDFStringRef का उपयोग करने का प्रयास करता हूं, और यह पूरी तरह से Wacko चला जाता है। विचार? –

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