WPF アプリケーションにおける XPS ドキュメントの印刷方法

こんにちは、Visual Studio サポート チームです。

今回は、XPS (XML Paper Specification) ドキュメントの印刷方法のひとつをご紹介します。

WPF アプリケーションから XPS ドキュメントを印刷すると、Windows の XPS Viewer ツールで印刷した場合に比べて印刷結果が異なるケースがあることをご存知でしょうか。

実は XPS Viewer ツール内部では、WPF のクラスではなく Win32 の StartXpsPrintJob API を使用して、XPS ドキュメントの印刷を行っています。

WPF と Win32 API では、XPS ドキュメントを印刷する際の内部ロジックやフォントの描画時に参照するキャッシュが異なるため、XPS ドキュメントの構造やフォントキャッシュの状態によっては、印刷結果に若干の違いが生じるケースがあるのです。

WPF アプリケーションから印刷した結果よりも、XPS Viewer ツールから印刷した結果の方が望ましい場合には、思い切って Win32 API を使用するというのもひとつの方法かと思います。

もしも「WPF アプリケーションから Win32 API を呼び出すとなると、プラットフォーム呼び出しが必要になるし、何だか面倒だなあ・・・」という場合には、下記の方法を是非お試しください!

 

WPF アプリケーションから、Win32 API を使用して XPS ドキュメントを印刷する方法

XPS ドキュメントの印刷処理部分を、Win32 API を使用する アンマネージ DLL にまとめて実装し、これを WPF アプリケーションから呼び出すという方法をご紹介します。

処理の流れとしては、以下のようになります。

  1. WPF アプリケーションから、アンマネージ コードで記述された DLL を呼び出します。
  2. アンマネージ DLL のインターフェース用関数に、引数を渡します。
  3. StartXpsPrintJob API を使用して、XPS ドキュメントの印刷を行います。
  4. WPF アプリケーションに処理を返します。

 

サンプル

上記対応方法のサンプルプログラムをご用意しました。
Visual Studio 2010 + .NET Framework 4.0 の環境で作成しており、WPF アプリケーションは C# で記述しています。

"Select Printer" ボタン押下でプリンターを、"Select XPS file" ボタン押下で印刷する XPS ファイルを選択し、"Print" ボタン押下で印刷を実行するプログラムです。

お手元の環境で、印刷結果を確認してみてくださいね!

参考情報

上記対応方法で使用されている API 等の詳細については、下記の公開情報をご参照ください。

How To: Print with the XPS Print API
<https://msdn.microsoft.com/en-us/library/windows/desktop/ff728890(v=vs.85).aspx>

dllexport、dllimport
<https://msdn.microsoft.com/ja-jp/library/3y1sfaz2.aspx>

extern (C# リファレンス)
<https://msdn.microsoft.com/ja-jp/library/e59b22c5.aspx>

StartXpsPrintJob function
<https://msdn.microsoft.com/en-us/library/windows/desktop/dd374437(v=vs.85).aspx>

 

※ ご注意事項 ※

サンプル プログラムは説明の為の部分コードであり、エラー処理などは実装されておらず弊社にてその動作を保証するものではありません。
ご使用の際には、ご利用の環境に合わせて適宜修正し、十分なテストを実施してくださいますようお願い致します。
サンプル内で使用しております API などの詳細な情報に関しては、MSDN 、PlatformSDK などをご参照ください。 HybridXpsPrint.zip