2009-08-27 18 views
2

私はPDFから来たNSImageを持っています。そのため、NSPDFImageRepという1つの表現があります。私はイメージを行うsetDataRetained:YES;それがNSPDFImageRepのままであることを確認します。後で、私はページを変更したいので、私は担当者を取得し、現在のページを設定します。これは問題ありません。NSImageRep confusion

画像を描画すると、最初のページだけが出てしまうという問題があります。

私の印象は、NSImageを描画するときに、表現を選んでその表現を描くことです。さて、画像には1つの担当者しかいないので、それが描画されています。これがPDFrepです。それで、なぜイメージを描くときに、正しいページを描いていないのですか?

ただし、表現自体を描画すると、正しいページが表示されます。

私には何が欠けていますか?

答えて

1

NSImageは、最初に表示されたときにNSImageRepのキャッシュを行います。 NSPDFImageRepの場合、 "setCacheMode:"メッセージは効果がありません。したがって、表示されるページは常に最初のページになります。詳細については、this guideを参照してください。直接表現を描く

  1. あなたは、2つのソリューションを持っています。

  2. NSImageの "recache"メッセージを呼び出して、選択したページのラスタライズを強制します。
1

PDFを描画する代わりに、CGPDF *関数を使用することもできます。これを行うには、CGPDFDocumentCreateWithURLを使用してCGPDFDocumentRefオブジェクトを作成します。次にCGPDFDocumentGetPageを使用してCGPDFPageRefオブジェクトを取得します。 CGContextDrawPDFPageを使用して、ページをグラフィックスコンテキストに描画できます。

トランスフォームを適用して、ドキュメントのサイズが目的どおりになるようにする必要があります。これを行うには、CGAffineTransformCGContextConcatCTMを使用します。ここで

いくつかのサンプルコードは、私のプロジェクトの1から引き出される:

// use your own constants here 
NSString *path = @"/path/to/my.pdf"; 
NSUInteger pageNumber = 14; 
CGSize size = [self frame].size; 

// if we're drawing into an NSView, then we need to get the current graphics context 
CGContextRef context = (CGContextRef)([[NSGraphicsContext currentContext] graphicsPort]); 

CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)path, kCFURLPOSIXPathStyle, NO); 
CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(url); 
CGPDFPageRef page = CGPDFDocumentGetPage(document, pageNumber); 

// in my case, I wanted the PDF page to fill in the view 
// so we apply a scaling transform to fir the page into the view 
double ratio = size.width/CGPDFPageGetBoxRect(page, kCGPDFTrimBox).size.width; 
CGAffineTransform transform = CGAffineTransformMakeScale(ratio, ratio); 
CGContextConcatCTM(context, transform); 

// now we draw the PDF into the context 
CGContextDrawPDFPage(context, page); 

// don't forget memory management! 
CGPDFDocumentRelease(document);