Xamarin.MacでWebKitViewを印刷する
2020年3月6日 (金) 02:52時点におけるAdministrator (トーク | 投稿記録)による版 (ページの作成:「Xamarin.Macに限らずCocoaではNSPrintOperationにNSViewをぶち込めば簡単に印刷できる。 NSViewはPDFのレンダリングエンジンその…」)
Xamarin.Macに限らずCocoaではNSPrintOperationにNSViewをぶち込めば簡単に印刷できる。 NSViewはPDFのレンダリングエンジンそのものなので「改ページ」などの紙特有の処理部分だけを実装するだけでよい。
ただWebKitViewに限っては普通にNSPrintOperationにぶち込んだだけでは全ページが白紙になる。 改ページなどは正常に動くのだが何も印刷されない。
解決策[編集 | ソースを編集]
stackoverflowでswiftでの解決策を発見した。 「_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();
}