DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ページ範囲を指定して印刷する

プリンタ選択ダイアログを表示して印刷する」で紹介したように、PrintDialogクラスを使って印刷ダイアログを表示する時AllowSomePagesプロパティをTrueにすると、印刷ダイアログでユーザーが印刷範囲を指定できるようになります。しかしこれだけで指定されたページのみが印刷されるようになるわけではありません。実際に指定されたページのみ印刷されるようにするには、そうなるように自分でコーディングする必要があります。

方法としては、PrintDialog.PrinterSettingsプロパティからPrinterSettingsオブジェクトを取得して、そのPrinterSettings.PrintRangeプロパティがPrintRange.SomePagesになっている時(つまり、「ページ指定」が指定された時)にPrinterSettings.FromPageプロパティPrinterSettings.ToPageプロパティを調べて、その範囲のページだけを印刷します。

次に具体的なサンプルを示します。ここではButton1がクリックされた時に印刷ダイアログを表示し、「OK」ボタンがクリックされた時に印刷が開始されるようにしています。印刷されるページは10ページあります。「ページ指定」が指定されていると、指定されたページのみが印刷されます。

VB.NET
コードを隠すコードを選択
'Imports System.Windows.Forms
'Imports System.Drawing

'現在のページ
Private currentPage As Integer = 1

'Button1のクリックイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    'PrintDocumentオブジェクトの作成
    Dim pd As New System.Drawing.Printing.PrintDocument
    'PrintPageイベントハンドラの追加
    AddHandler pd.PrintPage, AddressOf pd_PrintPage

    'PrintDialogクラスの作成
    Dim pdlg As New PrintDialog
    'PrintDocumentを指定
    pdlg.Document = pd

    'ページ指定できるようにする
    pdlg.AllowSomePages = True
    'ページ指定の最小値と最大値を指定する
    pdlg.PrinterSettings.MinimumPage = 1
    pdlg.PrinterSettings.MaximumPage = 10
    '印刷開始と終了ページを指定する
    pdlg.PrinterSettings.FromPage = pdlg.PrinterSettings.MinimumPage
    pdlg.PrinterSettings.ToPage = pdlg.PrinterSettings.MaximumPage

    '印刷の選択ダイアログを表示する
    If pdlg.ShowDialog() = DialogResult.OK Then
        'OKがクリックされた時は印刷する
        pd.Print()
    End If
End Sub

Private Sub pd_PrintPage(ByVal sender As Object, _
    ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    'ページ範囲が指定されており、始めのページのときは、
    '印刷開始ページまで飛ばす
    If e.PageSettings.PrinterSettings.PrintRange = _
        System.Drawing.Printing.PrintRange.SomePages AndAlso _
        currentPage = 1 Then
        currentPage = e.PageSettings.PrinterSettings.FromPage
    End If

    'currentPageで指定されたページを描画する
    Dim f As New Font("Arial", 100)
    e.Graphics.DrawString(currentPage.ToString(), f, Brushes.Black, 0, 0)
    f.Dispose()

    '次のページがあるか調べる
    If currentPage >= 10 OrElse _
        (e.PageSettings.PrinterSettings.PrintRange = _
        System.Drawing.Printing.PrintRange.SomePages AndAlso _
        e.PageSettings.PrinterSettings.ToPage <= currentPage) Then
        '次のページがないことを通知する
        e.HasMorePages = False
        currentPage = 1
    Else
        e.HasMorePages = True
        currentPage += 1
    End If
End Sub
C#
コードを隠すコードを選択
//using System.Windows.Forms;
//using System.Drawing;

//現在のページ
private int currentPage = 1;

//Button1のクリックイベントハンドラ
private void Button1_Click(object sender, System.EventArgs e)
{
    //PrintDocumentオブジェクトの作成
    System.Drawing.Printing.PrintDocument pd =
        new System.Drawing.Printing.PrintDocument();
    //PrintPageイベントハンドラの追加
    pd.PrintPage +=
        new System.Drawing.Printing.PrintPageEventHandler(pd_PrintPage);

    //PrintDialogクラスの作成
    PrintDialog pdlg = new PrintDialog();
    //PrintDocumentを指定
    pdlg.Document = pd;

    //ページ指定できるようにする
    pdlg.AllowSomePages = true;
    //ページ指定の最小値と最大値を指定する
    pdlg.PrinterSettings.MinimumPage = 1;
    pdlg.PrinterSettings.MaximumPage = 10;
    //印刷開始と終了ページを指定する
    pdlg.PrinterSettings.FromPage = pdlg.PrinterSettings.MinimumPage;
    pdlg.PrinterSettings.ToPage = pdlg.PrinterSettings.MaximumPage;

    //印刷の選択ダイアログを表示する
    if (pdlg.ShowDialog() == DialogResult.OK)
    {
        //OKがクリックされた時は印刷する
        pd.Print();
    }
}

private void pd_PrintPage(object sender,
    System.Drawing.Printing.PrintPageEventArgs e)
{
    //ページ範囲が指定されており、始めのページのときは、
    //印刷開始ページまで飛ばす
    if (e.PageSettings.PrinterSettings.PrintRange ==
        System.Drawing.Printing.PrintRange.SomePages &&
        currentPage == 1)
    {
        currentPage = e.PageSettings.PrinterSettings.FromPage;
    }

    //currentPageで指定されたページを描画する
    Font f = new Font("Arial", 100);
    e.Graphics.DrawString(currentPage.ToString(),
        f, Brushes.Black, 0, 0);
    f.Dispose();

    //次のページがあるか調べる
    if (currentPage >= 10 ||
        (e.PageSettings.PrinterSettings.PrintRange ==
        System.Drawing.Printing.PrintRange.SomePages &&
        e.PageSettings.PrinterSettings.ToPage <= currentPage))
    {
        //次のページがないことを通知する
        e.HasMorePages = false;
        currentPage = 1;
    }
    else
    {
        e.HasMorePages = true;
        currentPage++;
    }
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。