Xamarin.MacでWebKitViewを印刷する

提供: MonoBook
ナビゲーションに移動 検索に移動

Xamarin.Macに限らずCocoaではNSPrintOperationにNSViewをぶち込めば簡単に印刷できる。 NSViewはPDFのレンダリングエンジンそのものなので「改ページ」などの紙特有の処理部分だけを実装するだけでよい。

ただWebKitViewに限っては普通にNSPrintOperationにぶち込んだだけでは全ページが白紙になる。 改ページなどは正常に動くのだが何も印刷されない。

解決策[編集 | ソースを編集]

stackoverflowswiftでの解決策を発見した。 「_printOperationWithPrintInfo:」というセレクターでNSPrintOperationを生成するといいらしい。

さっそく拡張メソッドにしてみた。

public static class WebKitViewExtensins
{
    public static NSPrintOperation GetPrintOperation(this WebKit.WKWebView webKitView, NSPrintInfo printInfo)
    {
        // WebKitViewからNSPrintOperationを引き出すセレクター
        var printSelector = new ObjCRuntime.Selector("_printOperationWithPrintInfo:");

        // セレクターがあるか確認する
        if (!webKitView.RespondsToSelector(printSelector))
        {
            return null;
        }

        // セレクターを実行する
        return (NSPrintOperation)webKitView.PerformSelector(printSelector, printInfo);
    }
}

印刷してみる。

public override void ViewDidLoad()
{
    base.ViewDidLoad();

    // WebKitViewはUTF-8を含むURLを扱えないのでURLエンコードしてやる必要がある。
    var uri = new Uri("https://monobook.org/wiki/クソゲー・オブ・ザ・イヤー");
    var nsurl = new NSUrl(uri.GetComponents(UriComponents.HttpRequestUrl, UriFormat.UriEscaped));
    var request = new NSUrlRequest(nsurl);
    _webKitView.LoadRequest(request);
}

public void Print()
{
    //
    var pi = NSPrintInfo.SharedPrintInfo;
    pi.HorizontalPagination = NSPrintingPaginationMode.Auto;
    pi.VerticalPagination = NSPrintingPaginationMode.Auto;
    pi.VerticallyCentered = false;

    // これ
    var po = _webKitView.GetPrintOperation(pi);
    po.ShowsPrintPanel = true;

    // 印刷実行
    po.RunOperation();
}

関連項目[編集 | ソースを編集]