複数ページの画像を返す 【QuickLook Plug-inの開発:実践的Macintoshプログラミング解説】

印刷用表示 |テキストサイズ 小 |中 |大 |

クイックルックプラグインの開発

実践的 Macintosh プログラミング解説

QuickLook Cover Flow.png

| HOME | 最初の一歩 | 複数ページの画像を返す |

更新日 2011-10-02 | 作成日 2008-01-04

複数ページの画像を返す

PDFを描く場所を提供してもらう

 プレビュー画像が複数ページになる場合は、PDFのグラフィクスコンテキストにする必要があります。
 その場合はQLPreviewRequestCreatePDFContext()で、描画する場所であるグラフィクスコンテキストを入手する事ができます。

QL_EXPORT CGContextRef QLPreviewRequestCreatePDFContext(
    QLPreviewRequestRef preview,
    const CGRect * mediaBox,
    CFDictionaryRef auxiliaryInfo,
    CFDictionaryRef properties);
);

 第一引数のpreviewで、どのプレビューリクエストにグラフィクスコンテキストを作ってもらうのかを指定します。
 mediaBoxでPDFページの位置とサイズを定義します。CGSizeではなくCGRectなので注意。
 auxiliaryInfoはPDFファイルの作成者、タイトル、コピー・印刷を許可するかどうかなどの情報を指定する辞書です。
 最後のpropertiesはこれまでに出てきたものと同じ追加情報用の辞書です。


サンプルコード

 サンプルとして日の丸を三つ描いてみました。QLPreviewRequestCreatePDFContextの第三引数auxiliaryInfoはPDFファイルを作成するわけではないので、指定する必要のない情報ばかりです。したがってNULLを渡しています。

 ページの始まりでCGPDFContextBeginPage()を、ページの終わりで CGPDFContextEndPage()を呼ぶ必要があります。それ以外は変わりません。

 CGPDFContextBeginPage()の第二引数にNULLを渡していますが、ここにページ情報に関する追加情報を入れて渡す事ができます。これについて説明しているドキュメントを見つけられませんでしたが、多分これを使うとページ毎にサイズを変えたりする事ができるのでしょう。

OSStatus GeneratePreviewForURL(
    void *thisInterface,
    QLPreviewRequestRef preview,
    CFURLRef url,
    CFStringRef contentTypeUTI,
    CFDictionaryRef options)
{
    int i;
    NSAutoreleasePool   *pool = [[NSAutoreleasePool alloc] init];
    NSBezierPath        *bp;
    CGRect  mediaBox = CGRectMake(0,0,300,200);
    NSDictionary    *dict = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithInt:300],kQLPreviewPropertyWidthKey,
        [NSNumber numberWithInt:600],kQLPreviewPropertyHeightKey,
        nil];
    CGContextRef cgContext = QLPreviewRequestCreatePDFContext(
        preview,&mediaBox,NULL,(CFDictionaryRef)dict);
    if(cgContext)
    {
        NSGraphicsContext* context =
            [NSGraphicsContext
                graphicsContextWithGraphicsPort:(void *)cgContext
                                        flipped:YES];
        if(context)
        {
            [NSGraphicsContext saveGraphicsState];
            [NSGraphicsContext setCurrentContext:context];

            for(i=0;i<3;i++)
            {
                CGPDFContextBeginPage(cgContext,NULL);
                [[NSColor whiteColor] set];
                [NSBezierPath fillRect:NSMakeRect(0,0,300,200)];
                bp = [NSBezierPath bezierPathWithOvalInRect:
                      NSMakeRect(90,40,120,120)];
                [[NSColor redColor] set];
                [bp fill];
                CGPDFContextEndPage(cgContext);
            }

            [NSGraphicsContext restoreGraphicsState];
        }
        QLPreviewRequestFlushContext(preview,cgContext);
        CFRelease(cgContext);
    }

    [pool release];
    return noErr;
}


 ビルドして実行すると、以下のウィンドウが表示されました。

hinomaru3.png