调整PDF NSImage OSX的大小

时间:2016-01-31 18:47:05

标签: macos pdf image-resizing nsimage

我正在更新调整Mac App的图像。我希望能够做的是,如果用户导入要调整大小的具有PDFImageRep的图像,请保存一个具有我选择的分辨率的新PDF文件。

到目前为止,我已尝试以新尺寸绘制图像,如:

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

但是这会丢失PDF图像代表,因此使我的保存代码失败。

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

那我该怎么办呢。我将要使用的图像应该是基于矢量的,那么我是否可以通过某种方式更新PDF上的属性以指定新的分辨率?

2 个答案:

答案 0 :(得分:1)

尝试以下方法。这将创建一个新的PDF数据对象,您可以将其保存到文件中。

{{1}}

然后将pdfData保存到文件

答案 1 :(得分:0)

感谢Jacob提供正确的答案。如果有人对我用雅各布技术写的完整类别感兴趣的话是:

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