2016-01-31 15 views
6

Ich aktualisiere ein Bild, das die Größe der Mac App ändert. Was ich will, ist zu tun, um der Lage sein, wenn der Benutzer ein Bild importiert werden verkleinert, die eine PDFImageRep hat, speichern Sie eine neue PDF-Datei mit einer Auflösung von meiner Wahl.Größe ändern PDF NSImage OSX

Bisher habe ich versucht, das Bild mit einer neuen Größe zu ziehen, wie in:

- (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; 
} 

aber verliert das PDF-Bild rep, und deshalb macht meinen Sparcode fehlschlagen.

- (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); 
    } 
} 

So wie ich es tun. Die Bilder, die ich verwenden werde, sollten vektorbasiert sein. Gibt es also eine Möglichkeit, eine Eigenschaft in der PDF-Datei zu aktualisieren, um eine neue Auflösung anzugeben?

Antwort

1

Versuchen Sie den folgenden Ansatz. Dadurch wird ein neues PDF-Datenobjekt erstellt, das Sie in einer Datei speichern können.

// 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); 

Dann sparen pdfData zur Versorgung der richtigen Antwort

0

Dank Jacob einzureichen. Wenn jemand interessiert ich die komplette Kategorie mit Jakobs Technik geschrieben hat, ist:

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