NSImage - 裁剪后PDF模糊

时间:2009-02-06 23:18:11

标签: cocoa pdfkit

我正在尝试裁剪包含PDF的NSImage。在打印时我正在使用NSImage的drawInRect来让它只绘制我需要的东西 - 这很有效。

但是,现在我正试图创建一个仅裁剪区域的新NSImage。我玩了一段时间,然后在CocoaBuilder上找到了这段代码:

- (NSImage *) imageFromRect: (NSRect) rect
{
  NSAffineTransform * xform = [NSAffineTransform transform];

  // translate reference frame to map rectangle 'rect' into first quadrant
  [xform translateXBy: -rect.origin.x
                  yBy: -rect.origin.y];

  NSSize canvas_size = [xform transformSize: rect.size];

  NSImage * canvas = [[NSImage alloc] initWithSize: canvas_size];
  [canvas lockFocus];

  [xform concat];

  // Get NSImageRep of image
  NSImageRep * rep = [self bestRepresentationForDevice: nil];

  [rep drawAtPoint: NSZeroPoint];

  [canvas unlockFocus];
  return [canvas autorelease];
}

这样可行,但返回的NSImage模糊,不再适合打印。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

lockFocus / unlockFocus对图片的缓存执行光栅绘制。这就是为什么它“模糊” - 低分辨率和可能错误注册。你需要矢量绘图。

使用PDF工具包。首先,将每页的裁剪框设置为矩形。然后,您应该能够从PDF文档的dataRepresentation创建裁剪的NSImage。

答案 1 :(得分:2)

以下是执行Peter Hosey所回答的代码。谢谢!

PDFDocument *thePDF = [[PDFDocument alloc] initWithData:pdfData];
PDFPage *thePage = [thePDF pageAtIndex:0];
NSRect pageCropRect = NSMakeRect(0, 100, 100, 100);

[thePage setBounds:pageCropRect forBox:kPDFDisplayBoxMediaBox];
NSImage *theCroppedImage = [[NSImage alloc] initWithData:[thePage dataRepresentation]];