メインメニューを開く

差分

Xamarin.MacでWebKitViewを印刷する

2,377 バイト追加, 2020年3月6日 (金) 02:52
ページの作成:「Xamarin.Macに限らずCocoaではNSPrintOperationにNSViewをぶち込めば簡単に印刷できる。 NSViewはPDFのレンダリングエンジンその…」
[[Xamarin.Mac]]に限らず[[Cocoa]]ではNSPrintOperationにNSViewをぶち込めば簡単に印刷できる。
NSViewは[[PDF]]のレンダリングエンジンそのものなので「改ページ」などの紙特有の処理部分だけを実装するだけでよい。

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

== 解決策 ==
[[stackoverflow]]で[[swift]]での解決策を発見した。
「_printOperationWithPrintInfo:」というセレクターでNSPrintOperationを生成するといいらしい。
* https://stackoverflow.com/questions/27127919/wkwebkit-mac-os-nsprintoperation

さっそく拡張メソッドにしてみた。
<source lang="csharp">
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);
}
}
</source>

印刷してみる。
<source lang="csharp">
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();
}
</source>

== 関連項目 ==
* [[WebKit]]
* [[GeckoFX]]

[[category: Xamarin.Mac]]