複数ページの印刷
前回 のコードを元に複数ページの印刷を行うように修正したコードを以下に示します。
デフォルトプリンターにA4縦で3ページ分、左上隅から100x100ピクセルの位置にページ番号を印刷するサンプルです。
// 複数ページの印刷
private void PrintMultiPage()
{
LocalPrintServer lps = new LocalPrintServer();
PrintQueue queue = lps.DefaultPrintQueue;
XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(queue);
PrintTicket ticket = queue.DefaultPrintTicket;
// 用紙サイズの設定
ticket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
ticket.PageOrientation = PageOrientation.Portrait;
// FixedDocument の生成
FixedDocument doc = new FixedDocument();
for (int i = 0; i < 3; i++)
{
FixedPage page = new FixedPage();
Canvas canvas = new Canvas();
TextBlock tb = new TextBlock();
tb.Text = string.Format("{0}ページ", i + 1);
tb.FontSize = 24;
Canvas.SetTop(tb, 100);
Canvas.SetLeft(tb, 100);
canvas.Children.Add(tb);
page.Children.Add(canvas);
PageContent pc = new PageContent();
pc.Child = page;
doc.Pages.Add(pc);
}
writer.Write(doc, ticket);
}
LocalPrintServer
を生成し、PrintQueue
およびXpsDocumentWriter
を取得、PrintTicket
で用紙サイズ等を設定し、印刷データをXpsDocumentWriter
を利用してキューの書き込むというプログラムの構造は単一ページの場合と同一です。
単一ページの印刷と異なるのは、XpsDocumentWriter
を利用して書き込む印刷データの部分のみとなります。
共通部分の説明は前回を参照してください。
FixedDocumentの生成
単一ページの印刷の場合、ページを表すFixedPage
オブジェクトを生成、そのままプリントキューに書き込んでいましたが、複数ページにまたがる印刷を行う場合、ページの集合である文書を表す`FixedDocument`というクラスを利用します。
インスタンスの生成は普通にnew
するだけです。
FixedDocument doc = new FixedDocument();
ページデータの追加
FixedDocument
はFixedPage
のコレクションを保持します。印刷に必要なページ数分、FixedPage
オブジェクトを作成、FixedDocument
の追加してやります。
for (int i = 0; i < 3; i++)
{
FixedPage page = new FixedPage();
Canvas canvas = new Canvas();
TextBlock tb = new TextBlock();
tb.Text = string.Format("{0}ページ", i + 1);
tb.FontSize = 24;
Canvas.SetTop(tb, 100);
Canvas.SetLeft(tb, 100);
canvas.Children.Add(tb);
page.Children.Add(canvas);
PageContent pc = new PageContent();
pc.Child = page;
doc.Pages.Add(pc);
}
このサンプルでは単純にfor
で3回ループさせて3ページ分のFixedPage
を作成・追加しています。
FixedPage
をFixedDocument
に追加する方法ですが、FixedDocument.Pages
に直接追加することができません。一旦、PageContent
オブジェクトでラップしてやる必要があります。
印刷の実行
FixedDocument
の作成が終われば、XpsDocumentWriter
のWrite
メソッドにオブジェクトを渡してやれば印刷が実行されます。
writer.Write(doc, ticket);