ページ

2009年4月20日月曜日

WebKit検証(9) - PDF形式で保存(その2)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

前回の PDF生成の方法は簡易ではあったものの、ページ制御ができなかった(大きなサイズも1ページの PDF書類になっていた)。

そこで WebKitと少し離れるが、PDF形式をページ付きで保存できないかどうか、もう少し調べてみた。

(1時間程度)いろいろ調べた結果、とりあえず2つの方法があることが分かった。
一つはカスタムビューを作り NSView#knowsPageRange:NSView#rectForPage: をオーバーライドした上で、前回の NSView#dataWithPDFInsideRect: と組み合わせてページ制御する方法。

これは今回の様に他から与えられた NSView を扱う場合、少々面倒(カスタムビューを用意した上で、そちらへ描画内容をコピーしなければならない)。


もう一つは NSPrintOperation を使い印刷の仕組みを借りる方法。

通常印刷する時に印刷ダイアログを開き PDF保存することができるが、それと同じ仕組み(多分)。


今回はこの方法を試してみた。

参考にしたページ:
Printing Dicrectly To PDF Without Dialog

コードはこんな感じ。

- (IBAction)savePDF:(id)sender
{
// (1) setup filename
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDesktopDirectory, NSUserDomainMask, YES);
NSString* path = [NSString stringWithFormat:@"%@/test.pdf",
[paths objectAtIndex:0], nil];

// (2) setup WebView
NSView* view = [[[_web_view mainFrame] frameView] documentView];

// (3) setup NSDictionary for NSPrintInfo
NSMutableDictionary* p_dict = [NSMutableDictionary
dictionaryWithDictionary:[[NSPrintInfo sharedPrintInfo] dictionary]];
[p_dict setObject:NSPrintSaveJob forKey:NSPrintJobDisposition];
[p_dict setObject:path forKey:NSPrintSavePath];

// (4) setup NSPrintInfo
NSPrintInfo* p_info = [[NSPrintInfo alloc] initWithDictionary:p_dict];
[p_info setHorizontalPagination:NSAutoPagination];
[p_info setVerticalPagination:NSAutoPagination];
[p_info setVerticallyCentered:NO];

// (5) setup NSPrintOperation
NSPrintOperation* p_ope =
[NSPrintOperation printOperationWithView:view
printInfo:p_info];
[p_ope setShowPanels:NO];

// (6) print it
[p_ope runOperation];
}


NSPrintOperation が印刷(今回はPDF保存)のジョブを制御しており、NSPrintInfoが用紙やページなどの情報を管理している。これらを用意するだけで簡単に印刷が行える。

さて実行してみよう。

まずページを表示し PDFボタンを押す。



それっぽい(?)ファイルが出来た。



開いてみるとちゃんとページに分割されている。


- - - -
たったこれだけのコーディングで PDFファイルが作れるなんて cocoaは良くできてる。毎度感心する。