hylomの日記: WebViewで印刷時にheader/footerを付ける・完結編
さんざん悩んだ、WebViewでの印刷時にheader/footerを付ける方法、適切と思われる解決法が分かった。
まず、WebUIDelegeteの「webView:drawHeaderInRect:」や「webViewFooterHeight:」を適当なクラスに実装する(例:下記のソースコード1)。厳密にMVCに沿うならコントローラに実装するのがよいのかな?
webViewHeaderHeight:はヘッダの高さを計算してreturnするメソッド。このメソッドの戻り値がヘッダの高さになる。webView:drawHeaderInRect:は描画ルーチン。引数のNSRectが描画エリア。
続いて、実装したクラスのインスタンスを生成してWebViewのsetUIDelegate:メソッドを使ってDelegateとして登録する。
以上。下記のソースコード1はヘッダにWebViewで開いているページのタイトル、フッタにページ番号を入れる例。これだけだとヘッダ/フッタとHTML本文の間隔がないので適当にヘッダ/フッタサイズを調整しよう。
(ソースコード1)
- (void)webView:(WebView *)sender drawHeaderInRect:(NSRect)rect {
NSString* str = [sender mainFrameTitle];
NSMutableAttributedString* aStr = [[[NSMutableAttributedString alloc] init] autorelease];
NSAttributedString *tmpAttrStr;
NSMutableDictionary* attributes = [NSMutableDictionary dictionary];
[attributes setObject:[NSFont fontWithName:@"HiraKakuPro-W3" size:7.0f] forKey:NSFontAttributeName];
tmpAttrStr = [[[NSAttributedString alloc] initWithString:str attributes: attributes] autorelease];
[aStr appendAttributedString:tmpAttrStr];
[self lockFocus];
[aStr drawInRect: rect];
[self unlockFocus];
}
- (void)webView:(WebView *)sender drawFooterInRect:(NSRect)rect {
int pageNum;
pageNum = [[NSPrintOperation currentOperation] currentPage];
NSString* strPage = [[[NSString alloc] initWithFormat:@"-%d-", pageNum] autorelease];
NSMutableAttributedString* aStr = [[[NSMutableAttributedString alloc] init] autorelease];
NSAttributedString *tmpAttrStr;
NSMutableDictionary* attributes = [NSMutableDictionary dictionary];
NSMutableParagraphStyle* style = [[[NSMutableParagraphStyle alloc] init] autorelease];
[style setAlignment:NSCenterTextAlignment];
[attributes setObject:[NSFont fontWithName:@"HiraKakuPro-W3" size:7.0f] forKey:NSFontAttributeName];
[attributes setObject:style forKey:NSParagraphStyleAttributeName];
tmpAttrStr = [[[NSAttributedString alloc] initWithString:strPage attributes: attributes] autorelease];
[aStr appendAttributedString:tmpAttrStr];
[self lockFocus];
[aStr drawInRect: rect];
[self unlockFocus];
}
- (float)webViewHeaderHeight:(WebView *)sender {
NSString* str = [sender mainFrameTitle];
NSMutableAttributedString* aStr = [[[NSMutableAttributedString alloc] init] autorelease];
NSAttributedString *tmpAttrStr;
NSMutableDictionary* attributes = [NSMutableDictionary dictionary];
[attributes setObject:[NSFont fontWithName:@"HiraKakuPro-W3" size:7.0f] forKey:NSFontAttributeName];
tmpAttrStr = [[[NSAttributedString alloc] initWithString:str attributes: attributes] autorelease];
[aStr appendAttributedString:tmpAttrStr];
return [aStr size].height;
}
- (float)webViewFooterHeight:(WebView *)sender {
int pageNum;
pageNum = [[NSPrintOperation currentOperation] currentPage];
NSString* strPage = [[[NSString alloc] initWithFormat:@"-%d-", pageNum] autorelease];
NSMutableAttributedString* aStr = [[[NSMutableAttributedString alloc] init] autorelease];
NSAttributedString *tmpAttrStr;
NSMutableDictionary* attributes = [NSMutableDictionary dictionary];
NSMutableParagraphStyle* style = [[[NSMutableParagraphStyle alloc] init] autorelease];
[style setAlignment:NSCenterTextAlignment];
[attributes setObject:[NSFont fontWithName:@"HiraKakuPro-W3" size:7.0f] forKey:NSFontAttributeName];
[attributes setObject:style forKey:NSParagraphStyleAttributeName];
tmpAttrStr = [[[NSAttributedString alloc] initWithString:strPage attributes: attributes] autorelease];
[aStr appendAttributedString:tmpAttrStr];
return [aStr size].height;
}
WebViewで印刷時にheader/footerを付ける・完結編 More ログイン