WPFでの印刷の基本(2) 複数ページの印刷

  • 7
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

複数ページの印刷

前回 のコードを元に複数ページの印刷を行うように修正したコードを以下に示します。

デフォルトプリンターに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();

ページデータの追加

FixedDocumentFixedPageのコレクションを保持します。印刷に必要なページ数分、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を作成・追加しています。

FixedPageFixedDocumentに追加する方法ですが、FixedDocument.Pagesに直接追加することができません。一旦、PageContentオブジェクトでラップしてやる必要があります。

印刷の実行

FixedDocumentの作成が終われば、XpsDocumentWriterWriteメソッドにオブジェクトを渡してやれば印刷が実行されます。

writer.Write(doc, ticket);