2,377 バイト追加,
2020年3月6日 (金) 02:52 [[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]]