前回の 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は良くできてる。毎度感心する。