LoginSignup
11
11

More than 5 years have passed since last update.

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

Posted at

複数ページの印刷

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11