Windorws Form に比べてWPFでの印刷はかなり複雑になったという印象。その分融通は効くようになった感じですが慣れるまでがなかなか大変かも。
まず一番シンプルな単一のページを印刷する方法をまとめてみます。
単一ページの印刷
まず最初にコードを示します。
デフォルトプリンターにA4縦で左上隅から100x100ピクセルの位置に24ピクセルサイズで「TEST」の文字列を印刷するサンプルです。
コンパイルするためにはWPFアプリケーションのプロジェクトに「System.Printing」と「ReachFramework」の参照設定を加える必要があります。WPFアプリケーションで印刷を行うにはこれらの参照設定が必要になります。
// 単一ページの印刷
private void PrintSinglePage()
{
// 1.各種オブジェクトの生成
LocalPrintServer lps = new LocalPrintServer();
PrintQueue queue = lps.DefaultPrintQueue;
XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(queue);
// 2. 用紙サイズの設定
PrintTicket ticket = queue.DefaultPrintTicket;
ticket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
ticket.PageOrientation = PageOrientation.Portrait;
// 3. FixedPage の生成
FixedPage page = new FixedPage();
// 4. 印字データの作成
Canvas canvas = new Canvas();
TextBlock tb = new TextBlock();
tb.Text = "TEST";
tb.FontSize = 24;
Canvas.SetTop(tb, 100);
Canvas.SetLeft(tb, 100);
canvas.Children.Add(tb);
page.Children.Add(canvas);
// 5. 印刷の実行
writer.Write(page, ticket);
}
1. 各種オブジェクトの生成・取得
まず初めに印刷処理を行うための各種オブジェクトの生成と取得を行う必要があります。
まず最初にLocalPrintServerのオブジェクトを生成します。読んで字のごとくローカルコンピューターのプリントサーバーを扱うためのクラスでWPFの印刷処理の起点となります。
LocalPrintServer lps = new LocalPrintServer();
次にLocalPrintServerから印刷を行うプリントキューを取得します。デフォルトプリンターのキューはLocalPrintServer.DefaultPrintQueueというプロパティから取得することができます。
PrintQueue queue = lps.DefaultPrintQueue;
キューが取得できたら、さらにそのキューに印刷データを書き込むためのXpsDocumentWriterクラスのオブジェクトを取得します。これPrintQueueクラスの静的メソッドであるPrintQueue.CreateXpsDocumentWriterに書き込みを行うキューを渡すことで取得できます。
XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(queue);
これで印刷を行うために必要なオブジェクトの生成と取得は完了です。
2. 用紙サイズ等の設定を行う
印刷を行う場合、普通はまずどのサイズの用紙に印刷を行うか指定するのが普通でしょう。用紙サイズの設定にはPrintTicketクラスのオブジェクトを利用します。
PrintTicketクラスは用紙サイズや部数など印刷ジョブに関する各種設定を行うためのクラスです。オブジェクトは印刷を行うPrintQueueオブジェクトのPrintQueue.DefaultPrintTicketプロパティから取得できます。
PrintTicket ticket = queue.DefaultPrintTicket;
PrintTicketオブジェクトを取得したら、用紙の設定を行えます。
用紙のサイズはPageMediaSizeプロパティにPageMediaSizeクラスのオブジェクトを指定することで行います。用紙の向きはPageOrientationプロパティで指定します。
ticket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
ticket.PageOrientation = PageOrientation.Portrait;
3. FixedPage オブジェクトの生成
ここまでは印刷の準備で、ここからが印刷処理の本体になります。
WPFの印刷処理では、キューに印刷データを書き込むXpsDocumentWriterに直接、印刷を行う文字列だのイメージだのを渡す訳ではなく、印刷を行う文書をまずオブジェクトとして生成し、印刷したい情報をすべて設定して完成させた後、その文章オブジェクトをXpsDocumentWriterに渡してまとめてキューに書き込む形式になります。
そのXpsDocumentWriterに渡す、印刷文書オブジェクトとなるクラスはいくつか用意されているのですが、今回はもっとも単純な単一のページを表す`FixedPage`クラスを利用します。
FixedPageクラスのオブジェクトを生成するには、普通にnewするだけでOKです。
FixedPage page = new FixedPage();
4.印刷データの作成
生成されたFixedPageのオブジェクトは一枚の用紙を表すので、そこに印刷したい文字列やイメージなどを指定していきます。
FixedPageに印刷する要素を指定するには、その子要素にUIElementのオブジェクトを追加していくことで行います。要するにWindowオブジェクトに様々なコントロールを配置して画面を作成するのと同じ方法で印刷紙面を作成していくことができます。通常XAMLで記述する画面をコードで記述した場合をイメージしてもらうとOKです。
今回は極単純に、左上隅から100x100ピクセルの位置に24ピクセルサイズで「TEST」の文字列を印刷してみます。
Canvas canvas = new Canvas();
TextBlock tb = new TextBlock();
tb.Text = "TEST";
tb.FontSize = 24;
Canvas.SetTop(tb, 100);
Canvas.SetLeft(tb, 100);
canvas.Children.Add(tb);
page.Children.Add(canvas);
Canvasオブジェクトを作成し、TextBlockを配置します。
すべての印刷要素の配置が完了したら、CanvasオブジェクトをFixedPageオブジェクトのChildrenにAddします。
5.印刷の実行
作成したFixedPageオブジェクトをPrintTicketオブジェクトと共にXpsDocumentWriterのWriteメソッドに渡してキューに書き込むことで印刷を実行します。
writer.Write(page, ticket);
問題がなければデフォルトプリンターで印刷が開始される筈です。