2

PDFから取得したNSImageがあるため、NSPDFImageRepタイプの表現が1つあります。画像 setDataRetained:YES; を実行します。NSPDFImageRep のままであることを確認します。後でページを変更したいので、担当者を取得し、現在のページを設定します。これで問題ありません。

問題は、画像を描画すると1ページ目しか出てこないことです。

私の印象では、NSImage を描画すると、表現が選択され、その表現が描画されます。現在、画像にはレップが 1 つしかないため、それが描画されているレップであり、それが PDFrep です。では、画像を描画すると、正しいページが描画されないのはなぜですか?

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

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

4

2 に答える 2

1

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

次に、2 つの解決策があります。

  1. 表現を直接描画します。
  2. NSImage で「再キャッシュ」メッセージを呼び出して、選択したページのラスタライズを強制します。
于 2009-12-16T12:52:07.693 に答える
1

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

ドキュメントが希望どおりのサイズになるように、変換を適用する必要がある場合があります。CGAffineTransformこれを行うには、とを使用CGContextConcatCTMします。

これは、私のプロジェクトの 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);
于 2009-12-17T18:36:57.773 に答える