दिलचस्प पोस्ट
एक एक्सेल सेल में स्वरूपित पाठ के लिए टैग के साथ एचटीएमएल पाठ मैं Android पर एक पारदर्शी गतिविधि कैसे बनाऊं? जावा: एआरएम्स जैसे PHP के शामिल होने के लिए फ़ंक्शन ()? कमांड लाइन पैरामीटर पार्स करने के लिए जावा लाइब्रेरी? विजुअल स्टूडियो 2010 के लिए क्यूटी कैसे तैयार करें सर्वर पीएचपी के रूप में एचटीएमएल नहीं है PHP में कर्ल क्या है? IFrame के DOM को jQuery का उपयोग कैसे करें? Git फोर्क वास्तव में git क्लोन हैं? यूआरएल मैट्रिक्स पैरामीटर बनाम अनुरोध पैरामीटर जावा कोड बाइट को हेक्साडेसिमल में कनवर्ट करने के लिए मैं स्थिर विधि और गैर-स्थिर विधि के बीच के अंतर को जानना चाहता हूं वेबसाइट स्क्रीनशॉट बनाने के लिए कमांड लाइन प्रोग्राम (लिनक्स पर) कार्ड शफ़्लिंग सी # आईडी () के द्वारा ऑब्जेक्ट प्राप्त करें?

आईओएस एसडीके – प्रोग्रामेटिक रूप से एक पीडीएफ फाइल उत्पन्न करती है

CoreGraphics ढांचे का उपयोग करना कठिन काम है, मेरी ईमानदार राय में, जब प्रोग्रामिंग एक पीडीएफ फाइल ड्राइंग की बात आती है

मैं अपने ऐप के विभिन्न तरीकों से विभिन्न ऑब्जेक्ट्स का उपयोग करके एक पीडीएफ प्रोग्राम करना चाहता हूं।

मुझे यह जानने में दिलचस्पी है कि आईओएस एसडीके के लिए कोई अच्छा पीडीएफ ट्यूटोरियल है, शायद लाइब्रेरी में एक बूंद है।

मैंने इस ट्यूटोरियल को देखा है, पीडीएफ रचना ट्यूटोरियल , लेकिन यह ज्यादातर सी में लिखा गया था। अधिक उद्देश्य-सी शैली की तलाश में यह भी एक पीडीएफ फाइल को लिखने के लिए एक हास्यास्पद तरीका की तरह लगता है, जहां गणना करने के लिए जहां लाइनों और अन्य वस्तुओं रखा जाएगा।

void CreatePDFFile (CGRect pageRect, const char *filename) { // This code block sets up our PDF Context so that we can draw to it CGContextRef pdfContext; CFStringRef path; CFURLRef url; CFMutableDictionaryRef myDictionary = NULL; // Create a CFString from the filename we provide to this method when we call it path = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8); // Create a CFURL using the CFString we just defined url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0); CFRelease (path); // This dictionary contains extra options mostly for 'signing' the PDF myDictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File")); CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name")); // Create our PDF Context with the CFURL, the CGRect we provide, and the above defined dictionary pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary); // Cleanup our mess CFRelease(myDictionary); CFRelease(url); // Done creating our PDF Context, now it's time to draw to it // Starts our first page CGContextBeginPage (pdfContext, &pageRect); // Draws a black rectangle around the page inset by 50 on all sides CGContextStrokeRect(pdfContext, CGRectMake(50, 50, pageRect.size.width - 100, pageRect.size.height - 100)); // This code block will create an image that we then draw to the page const char *picture = "Picture"; CGImageRef image; CGDataProviderRef provider; CFStringRef picturePath; CFURLRef pictureURL; picturePath = CFStringCreateWithCString (NULL, picture, kCFStringEncodingUTF8); pictureURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), picturePath, CFSTR("png"), NULL); CFRelease(picturePath); provider = CGDataProviderCreateWithURL (pictureURL); CFRelease (pictureURL); image = CGImageCreateWithPNGDataProvider (provider, NULL, true, kCGRenderingIntentDefault); CGDataProviderRelease (provider); CGContextDrawImage (pdfContext, CGRectMake(200, 200, 207, 385),image); CGImageRelease (image); // End image code // Adding some text on top of the image we just added CGContextSelectFont (pdfContext, "Helvetica", 16, kCGEncodingMacRoman); CGContextSetTextDrawingMode (pdfContext, kCGTextFill); CGContextSetRGBFillColor (pdfContext, 0, 0, 0, 1); const char *text = "Hello World!"; CGContextShowTextAtPoint (pdfContext, 260, 390, text, strlen(text)); // End text // We are done drawing to this page, let's end it // We could add as many pages as we wanted using CGContextBeginPage/CGContextEndPage CGContextEndPage (pdfContext); // We are done with our context now, so we release it CGContextRelease (pdfContext); } 

संपादित करें: यहां एक आईफोन प्रोजेक्ट में लिब्हारू का उपयोग करते हुए गीथहब पर एक उदाहरण है।

वेब के समाधान से एकत्रित समाधान "आईओएस एसडीके – प्रोग्रामेटिक रूप से एक पीडीएफ फाइल उत्पन्न करती है"

कुछ चीजें …

सबसे पहले, IOS में CoreGraphics पीडीएफ पीढ़ी के साथ एक बग है जो भ्रष्ट पीडीएफ में परिणाम मुझे पता है कि यह समस्या आईओएस 4.1 तक और आईओएस सहित (मैं आईओएस 4.2 का परीक्षण नहीं किया है) मौजूद है। यह मुद्दा फोंट से संबंधित है और केवल तभी दिखाई देता है जब आप अपने पीडीएफ में पाठ शामिल करते हैं। लक्षण यह है कि, पीडीएफ जेनरेट करते समय, आपको डिबग कंसोल में त्रुटियाँ दिखाई देंगी जो इस तरह दिखेंगी:

 <Error>: can't get CIDs for glyphs for 'TimesNewRomanPSMT' 

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

http://www.iphonedevsdk.com/forum/iphone-sdk-development/15505-pdf-font-problem-cant-get-cids-glyphs.html#post97854

एक वैकल्पिक हल के रूप में, मैंने कोफ़रीफिक्स पीडीएफ पीढ़ी के लिए प्रतिस्थापन के रूप में आईफ़ोन पर सफलतापूर्वक libHaru का उपयोग किया है I यह शुरू में मेरी परियोजना के साथ निर्माण करने के लिए थोड़ा मुश्किल हो रहा था, लेकिन एक बार मुझे मेरी परियोजना को ठीक से मिला, यह मेरी आवश्यकताओं के लिए ठीक काम करता था

दूसरा, आपके पीडीएफ के प्रारूप / लेआउट के आधार पर, आप एक पीडीएफ आउटपुट के लिए "टेम्पलेट" के रूप में कार्य करने वाले इंटरफेस बिल्डर का उपयोग करने पर विचार कर सकते हैं फिर आप दृश्य को लोड करने के लिए कोड लिखेंगे, किसी भी डेटा को भरें (जैसे, यूआईएलएब्लेल्स आदि के लिए सेट टेक्स्ट), फिर पीडीएफ में व्यू के व्यक्तिगत तत्व प्रस्तुत करें। दूसरे शब्दों में, निर्देशांक, फोंट, चित्र इत्यादि को निर्दिष्ट करने के लिए आईबी का उपयोग करें और एक सामान्य तरीके से विभिन्न तत्वों (जैसे, UILabel , UIImageView , इत्यादि) को प्रस्तुत करने के लिए कोड लिखें ताकि आपको हार्ड-कोड सब कुछ न हो। मैंने इस दृष्टिकोण का इस्तेमाल किया और यह मेरी आवश्यकताओं के लिए महान काम किया फिर से, यह आपकी पीडीएफ के स्वरूपण / लेआउट की जरूरतों के आधार पर आपकी स्थिति के लिए या नहीं समझ सकता है।

संपादित करें: (1 टिप्पणी का जवाब)

मेरा कार्यान्वयन एक वाणिज्यिक उत्पाद का हिस्सा है जिसका अर्थ है कि मैं पूर्ण कोड साझा नहीं कर सकता, लेकिन मैं एक सामान्य रूपरेखा दे सकता हूं:

मैंने एक दृश्य के साथ एक .xib फ़ाइल बनाया और दृश्य को 850 x 1100 (मेरी पीडीएफ 8.5 x 11 इंच लक्ष्यित कर रहा था, इसलिए इसे डिजाइन करने के समय निर्देशांक में / अनुवाद करने में आसान बनाता है) के आकार के आकार में बनाया।

कोड में, मैं दृश्य को लोड करता हूं:

 - (UIView *)loadTemplate { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ReportTemplate" owner:self options:nil]; for (id view in nib) { if ([view isKindOfClass: [UIView class]]) { return view; } } return nil; } 

मैं फिर विभिन्न तत्वों को भरता हूँ मैंने उपयुक्त तत्व खोजने के लिए टैग का उपयोग किया था, लेकिन आप यह अन्य तरीकों से कर सकते हैं। उदाहरण:

 UILabel *label = (UILabel *)[templateView viewWithTag:TAG_FIRST_NAME]; if (label != nil) { label.text = (firstName != nil) ? firstName : @"None"; 

तब मैं पीडीएफ फाइल को देखने के लिए एक फ़ंक्शन बुलाता हूं। यह फ़ंक्शन पुनरावर्ती दृश्य पदानुक्रम को चलता है और प्रत्येक उपदृश्य को प्रस्तुत करता है। मेरी परियोजना के लिए, मुझे केवल लेबल, छवि दृश्य, और देखें (नेस्टेड दृश्यों के लिए) का समर्थन करने की आवश्यकता है:

 - (void)addObject:(UIView *)view { if (view != nil && !view.hidden) { if ([view isKindOfClass:[UILabel class]]) { [self addLabel:(UILabel *)view]; } else if ([view isKindOfClass:[UIImageView class]]) { [self addImageView:(UIImageView *)view]; } else if ([view isKindOfClass:[UIView class]]) { [self addContainer:view]; } } } 

एक उदाहरण के रूप में, यहां मेरा addImageView कार्यान्वयन है (एचपीडीएफ_ फ़ंक्शन libHaru से हैं):

 - (void)addImageView:(UIImageView *)imageView { NSData *pngData = UIImagePNGRepresentation(imageView.image); if (pngData != nil) { HPDF_Image image = HPDF_LoadPngImageFromMem(_pdf, [pngData bytes], [pngData length]); if (image != NULL) { CGRect destRect = [self rectToPDF:imageView.frame]; float x = destRect.origin.x; float y = destRect.origin.y - destRect.size.height; float width = destRect.size.width; float height = destRect.size.height; HPDF_Page page = HPDF_GetCurrentPage(_pdf); HPDF_Page_DrawImage(page, image, x, y, width, height); } } } 

उम्मीद है कि आप इस विचार को देते हैं।

यह एक देर से उत्तर है, लेकिन जैसा कि मैंने पीडीएफ पीढ़ी के साथ बहुत संघर्ष किया है, मैंने अपने विचारों को साझा करने के लिए इसे उचित माना। कोर ग्राफिक्स के बजाय, एक संदर्भ बनाने के लिए, आप एक पीडीएफ जेनरेट करने के लिए UIKit विधियों का उपयोग भी कर सकते हैं।

ऐप्पल ने इसे ड्राइंग और प्रिंटिंग गाइड में अच्छी तरह से दर्ज़ किया है ।

आईओएस पर पीडीएफ फ़ंक्शंस सभी कोर ग्राफिक्स आधारित हैं, जो समझ में आता है, क्योंकि आईओएस में आकर्षित प्रिमिटीव्स भी CoreGraphics आधारित हैं I यदि आप सीधे 2 डी पीढ़ी को पीडीएफ में प्रस्तुत करना चाहते हैं, तो आपको कोर ग्राफिक्स का प्रयोग करना होगा।

ऐसी छवियों के लिए कुछ शॉर्टकट हैं जो UIKit में रहते हैं, जैसे छवियों। पीडीएफ संदर्भ में पीएनजी को आकर्षित करने के लिए अब भी CGContextDrawImage को कॉल की आवश्यकता है, लेकिन आप इसे CGImage के साथ कर सकते हैं कि आप UIImage से प्राप्त कर सकते हैं, जैसे:

 UIImage * myPNG = [UIImage imageNamed:@"mypng.png"]; CGContextDrawImage (pdfContext, CGRectMake(200, 200, 207, 385), [myPNG CGImage]); 

अगर आप समग्र डिजाइन पर अधिक मार्गदर्शन चाहते हैं, तो कृपया "अपने ऐप में विभिन्न ऑब्जेक्ट्स" से क्या मतलब है और आप क्या हासिल करने का प्रयास कर रहे हैं, इसके बारे में अधिक स्पष्ट रहें।

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