2009-02-06 180 views
2

我想裁剪包含PDF的NSImage。在打印時,我使用NSImage的drawInRect來讓它只繪製我需要的東西 - 而且這個效果很好。NSImage - 裁剪PDF後模糊

但是,現在我試圖創建一個裁剪區域的新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中是模糊的,不再適用於印刷。有任何想法嗎?

回答

5

lockFocus/unlockFocus執行光柵繪製到圖像的緩存。這就是爲什麼它是「模糊」 - 它的分辨率低,可能註冊不正確。你需要矢量繪圖。

使用PDF工具包。首先,將每個頁面的裁切框設置爲您的矩形。然後,您應該能夠從PDFDocument的dataRepresentation創建裁剪的NSImage。

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]]; 
+1

確保您正式發佈或autoreleasePDF和theCroppedImage。 – 2009-02-07 02:06:55