如何将PDF转换为NSImage并更改DPI?

我试图将PDF页面转换成NSImage并成功保存到JPG文件。 但是输出结果是正常的72 DPI。 我想将DPI更改为300 DPI但失败。 以下是代码:

- (IBAction)TestButton:(id)sender { NSString* localDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0]; NSString* pdfPath = [localDocuments stringByAppendingPathComponent:@"1.pdf"]; NSData *pdfData = [NSData dataWithContentsOfFile:pdfPath]; NSPDFImageRep *pdfImg = [NSPDFImageRep imageRepWithData:pdfData]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSInteger pageCount = [pdfImg pageCount]; for(int i = 0 ; i < pageCount ; i++) { [pdfImg setCurrentPage:i]; NSImage *temp = [[NSImage alloc] init]; [temp addRepresentation:pdfImg]; CGFloat factor = 300/72; // Scale from 72 DPI to 300 DPI //NSImage *img; // Source image NSSize newSize = NSMakeSize(temp.size.width*factor, temp.size.height*factor); NSImage *scaledImg = [[NSImage alloc] initWithSize:newSize]; [scaledImg lockFocus]; [[NSColor whiteColor] set]; [NSBezierPath fillRect:NSMakeRect(0, 0, newSize.width, newSize.height)]; NSAffineTransform *transform = [NSAffineTransform transform]; [transform scaleBy:factor]; [transform concat]; [temp drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; [scaledImg unlockFocus]; NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[temp TIFFRepresentation]]; NSData *finalData = [rep representationUsingType:NSJPEGFileType properties:nil]; NSString *pageName = [NSString stringWithFormat:@"Page_%ld.jpg", (long)[pdfImg currentPage]]; [fileManager createFileAtPath:[NSString stringWithFormat:@"%@%@", pdfPath, pageName] contents:finalData attributes:nil]; } } 

由于OS X 10.8, NSImage有一个基于块的初始化工具,可以将基于vector的内容绘制到位图中。
这个想法是提供一个绘图处理程序,只要图像的表示被请求就被调用。
点和像素之间的关系通过将NSSize(以点为单位)传递给初始化器来显示,并明确设置表示的像素尺寸:

 NSString* localDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0]; NSString* pdfPath = [localDocuments stringByAppendingPathComponent:@"1.pdf"]; NSData* pdfData = [NSData dataWithContentsOfFile:pdfPath]; NSPDFImageRep* pdfImageRep = [NSPDFImageRep imageRepWithData:pdfData]; CGFloat factor = 300/72; NSInteger pageCount = [pdfImageRep pageCount]; for(int i = 0 ; i < pageCount ; i++) { [pdfImageRep setCurrentPage:i]; NSImage* scaledImage = [NSImage imageWithSize:pdfImageRep.size flipped:NO drawingHandler:^BOOL(NSRect dstRect) { [pdfImageRep drawInRect:dstRect]; return YES; }]; NSImageRep* scaledImageRep = [[scaledImage representations] firstObject]; /* * The sizes of the PDF Image Rep and the [NSImage imageWithSize: drawingHandler:]-context * are defined in terms of points. * By explicitly setting the size of the scaled representation in Pixels, you * define the relation between points & pixels. */ scaledImageRep.pixelsWide = pdfImageRep.size.width * factor; scaledImageRep.pixelsHigh = pdfImageRep.size.height * factor; NSBitmapImageRep* pngImageRep = [NSBitmapImageRep imageRepWithData:[scaledImage TIFFRepresentation]]; NSData* finalData = [pngImageRep representationUsingType:NSJPEGFileType properties:nil]; NSString* pageName = [NSString stringWithFormat:@"Page_%ld.jpg", (long)[pdfImageRep currentPage]]; [[NSFileManager defaultManager] createFileAtPath:[NSString stringWithFormat:@"%@%@", pdfPath, pageName] contents:finalData attributes:nil]; } 

您可以通过将NSImageRep的大小设置为图像大小之外的其他值来设置保存在图像文件元数据中的分辨率

 [pngImageRep setSize:NSMakeSize(targetWith, targetHeight)] 

你必须将targetWidth和targetHeight初始化为你想要的值

编辑:我想你想写“缩图”,而不是“温度”

 NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[scaledImg TIFFRepresentation]]; 

编辑2:一想到这将让你一个更大的形象,但只是作为一个较小的延伸版本。 weichsel在下面的修改中回答的方法可能是您真正想要的(但上面的代码对于设置元数据仍然有效)

 NSSize newSize = NSMakeSize(pdfImageRep.size.width * factor,pdfImageRep.size.height * factor); NSImage* scaledImage = [NSImage imageWithSize:newSize flipped:NO drawingHandler:^BOOL(NSRect dstRect) { [pdfImageRep drawInRect:dstRect]; return YES; }];