2016-01-31 10 views
6

मैं मैक ऐप का आकार बदलने वाली छवि अपडेट कर रहा हूं। मैं जो करने में सक्षम होना चाहता हूं वह यह है कि यदि उपयोगकर्ता एक छवि को आकार देने के लिए आयात करता है जिसमें पीडीएफ इमेज रीप है, तो मेरी पसंद के एक प्रस्ताव के साथ एक नई पीडीएफ फ़ाइल को सहेजें।पीडीएफ का आकार बदलें एनएसआईएमएज ओएसएक्स

अब तक मैं एक नया आकार में छवि आकर्षित करने के लिए, के रूप में की कोशिश की है:

- (NSImage*)imageAtSize:(NSSize)newSize 
{ 
    NSImage *resizedImage = [[NSImage alloc] initWithSize:newSize]; 

    [resizedImage lockFocus]; 
    [self drawInRect:NSMakeRect(0, 0, newSize.width, newSize.height) 
      fromRect:NSMakeRect(0, 0, self.size.width, self.size.height) 
      operation:NSCompositeSourceOver fraction:1.0]; 
    [resizedImage unlockFocus]; 

    return resizedImage; 
} 

लेकिन इस पीडीएफ छवि प्रतिनिधि खो देता है, और इसलिए मेरी बचत कोड असफल बनाता है।

- (void)saveAsPDFWithOutputDirectory:(NSURL *)outputDirectory size:(NSSize)newSize 
{ 
    NSPDFImageRep *pdfRep = [self PDFImageRep]; 
    [pdfRep setSize:newSize]; 

    NSError *error = nil; 
    [pdfRep.PDFRepresentation writeToURL:outputDirectory options:NSDataWritingAtomic error:&error]; 
    if (error) 
    { 
     CLS_LOG(@"Error saving image: %@", error); 
    } 
} 

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

उत्तर

1

निम्नलिखित दृष्टिकोण की कोशिश करो। यह एक नई पीडीएफ डेटा ऑब्जेक्ट बनाता है जिसे आप फ़ाइल में सहेज सकते हैं।

// pdfData is a CFMutableDataRef 
// auxInfo is a CFDictionary 
// bounds is your new size in points! 
CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(pdfData); 
CGContextRef context = CGPDFContextCreate(consumer, &bounds, auxInfo); 
CGPDFContextBeginPage(context, NULL); 
NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO]; 
[NSGraphicsContext saveGraphicsState]; 
[NSGraphicsContext setCurrentContext:gc]; 

// Your drawing code here 
// You probably want to draw your NSImage here in the bounds 

[NSGraphicsContext restoreGraphicsState]; 
CGPDFContextEndPage(context); 
CGPDFContextClose(context); 
CGContextRelease(context); 
CGDataConsumerRelease(consumer); 

तो सही जवाब की आपूर्ति के लिए

0

धन्यवाद याकूब दायर करने के लिए pdfData सहेजें। अगर कोई रुचि है पूरा श्रेणी मैं याकूब की तकनीक के साथ लिखा है:

@implementation NSImage (MKBSaveAsPDF) 

- (BOOL)isPDF 
{ 
    return ([self PDFImageRep] != nil); 
} 

- (NSPDFImageRep * _Nullable)PDFImageRep 
{ 
    for (NSImageRep *imageRep in self.representations) 
    { 
     if ([imageRep isKindOfClass:[NSPDFImageRep class]]){ 
      return (NSPDFImageRep*)imageRep; 
     } 
    } 

    return nil; 
} 

- (void)saveAsPDFWithOutputDirectory:(NSURL *)outputDirectory size:(NSSize)newSize 
{ 
    NSPDFImageRep *pdfRep = self.PDFImageRep; 

    NSMutableData *mutablePDFRef = [[NSMutableData alloc]initWithData:pdfRep.PDFRepresentation]; 

    CFMutableDataRef pdfDataRef = (__bridge CFMutableDataRef)(mutablePDFRef); 
    CGRect bounds = CGRectMake(0, 0, newSize.width, newSize.height); 

    CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(pdfDataRef); 
    CGContextRef context = CGPDFContextCreate(consumer, &bounds, nil); 
    CGPDFContextBeginPage(context, NULL); 
    NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO]; 
    [NSGraphicsContext saveGraphicsState]; 
    [NSGraphicsContext setCurrentContext:gc]; 

    [self drawInRect:NSMakeRect(0, 0, newSize.width, newSize.height)]; 

    [NSGraphicsContext restoreGraphicsState]; 
    CGPDFContextEndPage(context); 
    CGPDFContextClose(context); 
    CGContextRelease(context); 
    CGDataConsumerRelease(consumer); 


    NSError *error = nil; 

    NSData *pdfData = (__bridge NSData *)(pdfDataRef); 
    [pdfData writeToURL:outputDirectory options:NSDataWritingAtomic error:&error]; 
    if (error) 
    { 
     NSLog(@"Error saving image: %@", error); 
    } 
} 
संबंधित मुद्दे