WebViewで印刷時にheader/footerを付ける・完結編

2008年7月15日 18:14

さんざん悩んだ、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;

}

Permalink | コメントを読む | hylomの日記