2011-10-30 8 views
8

मैंने UIView से पीडीएफ उत्पन्न करने के लिए निम्न विधियों का उपयोग किया है। वे सब के सब PDF बनाने लेकिन गुणवत्ता खो देता है:आईओएस - प्रतिपादन द्वारा UIView से पीडीएफ जेनरेट करना गुणवत्ता खो देता है

विधि 1:

@implementation UIView(PDFWritingAdditions) 

- (void)renderInPDFFile:(NSString*)path 
{ 
    CGRect mediaBox = self.bounds; 
    CGContextRef ctx = CGPDFContextCreateWithURL((__bridge_retained CFURLRef)[NSURL fileURLWithPath:path], &mediaBox, NULL); 
    CGPDFPageRef page; 
    CGContextDrawPDFPage(ctx, page); 

    CGPDFContextBeginPage(ctx, NULL); 

    // Also tried following commented lines but no luck 
    // CGContextSetFlatness(ctx, 0.1); 
    // CGContextSetAllowsAntialiasing(ctx, YES); 
    // CGContextSetAllowsFontSmoothing(ctx, YES); 
    // CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -mediaBox.size.height); 
    [self.layer renderInContext:ctx]; 
    CGPDFContextEndPage(ctx); 
    CFRelease(ctx); 
} 

@end 

विधि 2:

- (void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename 
{ 
    // Creates a mutable data object for updating with binary data, like a byte array 
    NSMutableData *pdfData = [NSMutableData data]; 

    // Points the pdf converter to the mutable data object and to the UIView to be converted 
    UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); 
    UIGraphicsBeginPDFPage(); 
    CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 


    // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData 

    [aView.layer renderInContext:pdfContext]; 

    // remove PDF rendering context 
    UIGraphicsEndPDFContext(); 

    // Retrieves the document directories from the iOS device 
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename]; 

    // instructs the mutable data object to write its context to a file on disk 
    [pdfData writeToFile:documentDirectoryFilename atomically:YES]; 
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); 
} 

मुझे लगता है कि मुझे यकीन है नहीं पीडीएफ संदर्भ के लिए कुछ सेटिंग्स गायब हो सकता है। इसके अलावा, मैं विधि है जो ठीक उसी गुणवत्ता है निम्नलिखित के साथ UIView से png छवि बनाने है:

- (UIImage *)imageFromView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 
    // Retrieves the document directories from the iOS device 
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:@"pdf.png"]; 

    // instructs the mutable data object to write its context to a file on disk 
    [UIImagePNGRepresentation(img) writeToFile:documentDirectoryFilename atomically:YES]; 
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); 
    return img; 
} 

कोई देख सकता हूँ मैं गलत क्या कर रहा हूँ? धन्यवाद।

+0

यह गुणवत्ता कैसे खो देता है? –

+0

यहां मूल दृश्य लिंक है: और पीडीएफ लिंक के बाद: iEamin

+0

[उच्च गुणवत्ता का संभावित डुप्लिकेट पीडीएफ से यूआईएममेज] (http://stackoverflow.com/questions/14152477/high-quality-uiimage-from-pdf) – nielsbot

उत्तर

2

क्या यह रेटिना डिस्प्ले का उपयोग कर रहा है? यह एक सामग्री हो सकता है स्केल चीज। अब , ठीक है पर this SO post

संपादित एक नज़र है कि आप से पहले & तस्वीरें के बाद, मुझे लगता है कि आप क्या चाहते हैं अच्छा, उच्च गुणवत्ता, अपने PDF में प्रिंट करने योग्य वेक्टर डेटा के रूप में प्रदान किए जाने की चालान UIView पोस्ट किया है ।

मैं बहुत यकीन है कि [CALayer renderInContext] हमेशा रास्टर डेटा का उत्पादन कर रहा हूँ, तो आप शायद बंद पीडीएफ मैन्युअल निर्माण बेहतर कर रहे हैं। और यदि आप कर चालान के बारे में बात कर रहे हैं, तो क्या आप वाकई अगले आईओएस अपडेट के साथ लेआउट बदलना चाहते हैं?

हालांकि, अगर आप look at this answer कर सकता है, जो अनिच्छा से अपने पीडीएफ लेआउट के लिए एक टेम्पलेट प्रणाली के रूप में UIView का उपयोग कर पता चलता है।

+0

नहीं, यह सामान्य प्रदर्शन के साथ होता है। – iEamin

+0

मैंने पहले ही पीडीएफ के लिए मैन्युअल रूप से दृश्य बनाया है [चूंकि कोई समाधान अभी तक नहीं मिला है] और संदर्भों के रूप में अंक और रंग प्राप्त करने के लिए UIView का उपयोग किया [ताकि यदि मैं दृश्य में कुछ भी बदलूं तो मुझे कोड को बदलने की आवश्यकता नहीं है]। लेकिन मैंने जो मूल छवि लिंक जोड़ा है वह "imageFromView" विधि और एक रास्टर छवि का उपयोग करके उत्पन्न होता है। तो, मेरा मुद्दा है "renderInContext" एक ही गुणवत्ता पीडीएफ उत्पन्न करने में सक्षम होना चाहिए। इसके अलावा मैंने उस छवि से पीडीएफ बनाने की कोशिश की, लेकिन कोई भाग्य नहीं। । । एक ही समस्या है। – iEamin

+0

आपको कॉल से पीडीएफ बनाने की आवश्यकता है CGContextFillRect, CTFontDrawGlyphs इत्यादि। RenderInContext हमेशा लुसी दिखने वाले स्क्रीन रिज़ॉल्यूशन रास्टर पीडीएफ बनाएगा। –

0

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

हालांकि, आप वास्तव में क्या करना चाहते हैं, बस अपने बिटमैप UIView को पीडीएफ संदर्भ में प्रस्तुत न करें, बल्कि इसके बजाय कोरग्राफिक्स ड्राइंग और लेआउट सीधे पीडीएफ संदर्भ में करें। उदाहरण के लिए इस ट्यूटोरियल http://www.raywenderlich.com/6818/how-to-create-a-pdf-with-quartz-2d-in-ios-5-tutorial-part-2 देखें। यह सुनिश्चित करेगा कि ज़ूम इन होने पर आपका टेक्स्ट और लाइन कुरकुरा रहेगी, और कागज पर मुद्रित होने पर गुणवत्ता वाले उत्पाद को सुनिश्चित करें। Quartz2D वेक्टर ग्राफिक्स अपने दोस्त यहाँ,

0

संपादित ठीक है, यह नहीं बिल्कुल एक ही मुद्दा है, है के रूप में आप एक बिटमैप साथ एक उच्च गुणवत्ता एक बड़ी पीडीएफ फाइल बनाने के बिना कभी नहीं मिलेगा, कम से कम नहीं ... लेकिन मुझे लगता है कि समाधान समान होगा

मुझे लगता है कि इस High quality UIImage from PDF

का एक शिकार है मेरा उत्तर वहाँ देखें:

https://stackoverflow.com/a/14152516/210171

जब आप पीडीएफ के पेज आकार के लिए पूछते हैं, तो आपको 72 पीपीआई के लिए चौड़ाई/ऊंचाई मिल रही है। आप स्केल ट्रांसफॉर्म का उपयोग करके एक संदर्भ बनाने का प्रयास कर सकते हैं। उदाहरण के लिए, यदि आप 300 डीपीआई पर प्रस्तुत करना चाहते हैं, तो जोड़ें 300.0/72.0 द्वारा स्केल में स्केल ट्रांसफॉर्म करें।

यदि आप टीआईएफएफ के रूप में निर्यात करते हैं, तो आप जेनरेट की गई छवि के अंतिम पीपीआई (300) को समाहित करने में सक्षम होंगे।

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