2016-01-31 10 views
6

Aktualizuję obraz zmieniający rozmiar aplikacji Mac. Co mogę zrobić, to jeśli użytkownik importuje obraz, który ma zostać zmieniony, a który ma PDFImageRep, zapisz nowy plik PDF z wybraną przeze mnie rozdzielczością.Zmiana rozmiaru pliku PDF NSImage OSX

Do tej pory starałem się rysować obraz w nowym rozmiarze, jak w:

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

ale traci PDF obrazu rep, a zatem sprawia, że ​​mój kod oszczędność niepowodzeniem.

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

Jak to zrobić. Obrazy, które będę używał powinny być oparte na wektorach, więc czy jest jakiś sposób, aby zaktualizować właściwość w pliku PDF, aby określić nową rozdzielczość?

Odpowiedz

1

Spróbuj zastosować następujące podejście. Spowoduje to utworzenie nowego obiektu danych PDF, który można zapisać w pliku.

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

Następnie zapisz pdfData złożyć

0

Thanks Jacoba za dostarczanie poprawną odpowiedź. Jeśli ktoś jest zainteresowany, to cała kategoria, którą napisałem techniką Jacoba to:

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