.NET TIPS

複数ページの印刷を行うには?[C#、VB]

デジタルアドバンテージ 一色 政彦
2006/01/13

 「TIPS:Windowsアプリケーションで印刷を行うには?」では、Windowsアプリケーションなどで印刷を行う方法を紹介した。そこで、実際の印刷を行うにはPrintDocumentコンポーネント(System.Drawing.Printing名前空間)のPrintPageイベントのイベント・ハンドラ内で印刷処理を実装すればよいと説明したが、その方法では1ページしか印刷されない仕様となっている。それでは複数ページを印刷するにはどうすればよいのか。

複数ページの印刷処理

 複数ページを印刷するには、PrintPageイベント・ハンドラの第2パラメータのPrintPageEventArgsオブジェクト(System.Drawing.Printing名前空間)が持つHasMorePagesプロパティを利用する。

 HasMorePagesプロパティは、さらに印刷すべきページがあるかどうかをTrue/Falseで指定するためのものだ。つまりこのプロパティにTrueを設定すれば、2ページ目以降が印刷されるようになるわけである(HasMorePagesプロパティはデフォルトではFalseになっているので、指定しないと1ページで印刷が終わってしまう)。

 実際にHasMorePagesプロパティにTrueを設定すると、PrintPageイベント・ハンドラの印刷処理が完了した後、再びPrintPageイベント・ハンドラが呼び出される。要するに、この2回目の呼び出しのタイミングで2ページ目を印刷すればよいわけだ。そして、さらに3ページ目を印刷したい場合には、またHasMorePagesプロパティにTrueを設定すればよい。逆に、もうこれ以上印刷したくない場合にはFalseを指定すればよい。

 HasMorePagesプロパティの設定を実際に実装したのが、次のサンプル・プログラムである。このサンプル・プログラムでは、全部で2ページを印刷する仕様となっている。

private int curPageNumber;  // 現在のページ番号

private void button1_Click(object sender, System.EventArgs e)
{
  // ページ番号を初期化
  curPageNumber = 1;

  // 印刷処理を実行
  printDocument1.Print();
}

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
  if (curPageNumber == 1)
  {
    // 印刷ページ(1ページ目)の描画を行う
    PrintString(e, "サンプル印刷<1枚目>");

    // 印刷継続を指定
    e.HasMorePages = true;
  }
  else
  {
    // 印刷ページ(2ページ目)の描画を行う
    PrintString(e, "サンプル印刷<2枚目>");

    // 印刷終了を指定
    e.HasMorePages = false;
  }

  // ページ番号を繰り上げる
  curPageNumber++;
}

private void PrintString(System.Drawing.Printing.PrintPageEventArgs e, String strPrint)
{
  // 印刷ページの描画を行う
  e.Graphics.DrawString(strPrint,
    new Font("MS 明朝", 32), Brushes.Black,
    e.MarginBounds.Left, e.MarginBounds.Top,
    new StringFormat());
}
Private curPageNumber As Integer  ' 現在のページ番号

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  ' ページ番号を初期化
  curPageNumber = 1

  ' 印刷処理を実行
  PrintDocument1.Print()
End Sub

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

  If curPageNumber = 1 Then
    ' 印刷ページ(1ページ目)の描画を行う
    PrintString(e, "サンプル印刷<1枚目>")

    ' 印刷継続を指定
    e.HasMorePages = True
  Else
    ' 印刷ページ(2ページ目)の描画を行う
    PrintString(e, "サンプル印刷<2枚目>")

    ' 印刷終了を指定
    e.HasMorePages = False
  End If

  ' ページ番号を繰り上げる
  curPageNumber += 1
End Sub

Private Sub PrintString(ByVal e As System.Drawing.Printing.PrintPageEventArgs, ByVal strPrint As String)
  ' 印刷ページの描画を行う
  e.Graphics.DrawString(strPrint, _
    New Font("MS 明朝", 32), Brushes.Black, _
    e.MarginBounds.Left, e.MarginBounds.Top, _
    New StringFormat)
End Sub
複数ページを印刷するサンプル・プログラム(上:C#、下:VB.NET)

 サンプル・プログラムの内容についてはコード中のコメントを読めばご理解いただけると思うので、詳しい説明は割愛する。なお前掲のTIPSとほぼ同じような実装内容となっている。

 複数ページ印刷の実装時には、同じPrintPageイベント・ハンドラが何度も呼び出されることに注意してほしい。このような仕様になっているため、このイベント・ハンドラ内でさらに印刷すべきものが残っているかを常に計算しながらHasMorePagesプロパティを設定しなければならない。

 本稿のサンプル・プログラムでは、2ページ分だけ印刷することを初めから想定しているので、クラスのフィールドとしてcurPageNumberというint(Integer)型の変数を用意して、それによっていま何ページ目の印刷を行っているかを管理するようにしている。これにより、2ページ目の印刷後に印刷処理を終了できるように(=HasMorePagesプロパティにFalseを指定するように)なっている。End of Article

カテゴリ:Windowsフォーム 処理対象:印刷
カテゴリ:クラス・ライブラリ 処理対象:印刷
使用ライブラリ:PrintDocumentクラス(System.Drawing.Printing名前空間)
使用ライブラリ:PrintPageEventArgsクラス(System.Drawing.Printing名前空間)
関連TIPS:Windowsアプリケーションで印刷を行うには?

この記事と関連性の高い別の.NET TIPS
印刷プレビュー(ダイアログ形式)を表示するには?
Windowsアプリケーションで印刷を行うには?
複数の部数を印刷するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間