Categories: Cシャープ

C#で印刷機能を実装する方法|PrintDocumentの基本から応用まで

C#でアプリケーションを開発していると、帳票の印刷やレシート出力など、印刷機能が求められる場面は少なくありません。
本記事では、C#での印刷処理を「PrintDocumentクラス」を使って実装する方法について、基本から応用まで解説します。
印刷プレビューや、プリンタ選択、フォーマットのカスタマイズまで、業務アプリ開発にも役立つ内容を紹介しています。
Windows Formsアプリを前提にしていますが、WPFアプリでも応用可能な知識です。


C#で印刷機能を実装するには?

C#で印刷処理を行うには、主に以下の3つのステップが必要です。

  1. System.Drawing.Printing.PrintDocument クラスを使用
  2. 印刷内容を描画する処理を PrintPage イベントで記述
  3. Print() メソッドを呼び出して印刷実行

印刷はデバイスに依存する処理であり、プレビューやページ設定の対応も必要になることが多いです。


PrintDocumentクラスの基本的な使い方

以下は、PrintDocumentクラスを用いた印刷の最小サンプルです。

using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;

public class PrintExample
{
public void PrintText()
{
PrintDocument pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(this.PrintPage);
pd.Print(); // 印刷実行
}

private void PrintPage(object sender, PrintPageEventArgs ev)
{
string text = "C#での印刷サンプルです";
Font font = new Font("MS UI Gothic", 12);
ev.Graphics.DrawString(text, font, Brushes.Black, 100, 100);
}
}

このコードを実行すると、用紙の左上に指定されたテキストが印刷されます。


印刷プレビューを表示するには?

実際に紙へ出力する前に、ユーザーに内容を確認してもらうのが一般的です。
C#では PrintPreviewDialog を使って簡単にプレビュー画面を表示できます。

PrintPreviewDialog preview = new PrintPreviewDialog();
PrintDocument pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(this.PrintPage);
preview.Document = pd;
preview.ShowDialog(); // プレビューを表示

プレビュー画面から実際に印刷を実行することもできます。


プリンタの選択ダイアログを表示する

プリンタが複数ある環境では、ユーザーにプリンタを選んでもらう必要があります。
その場合は、PrintDialog を使用します。

PrintDialog dialog = new PrintDialog();
PrintDocument pd = new PrintDocument();
dialog.Document = pd;

if (dialog.ShowDialog() == DialogResult.OK)
{
pd.PrintPage += new PrintPageEventHandler(this.PrintPage);
pd.Print(); // 選択されたプリンタで印刷
}

ユーザーが選択したプリンタの設定がそのまま反映されるので便利です。


複数ページの印刷に対応するには?

複数ページを印刷するには、PrintPageEventArgs.HasMorePages を使います。
次のページがある場合は true を設定し、イベントが再度呼び出されるようにします。

private int currentPage = 0;

private void PrintPage(object sender, PrintPageEventArgs e)
{
int itemsPerPage = 20;
int totalItems = 100;

for (int i = 0; i < itemsPerPage; i++)
{
int itemIndex = currentPage * itemsPerPage + i;
if (itemIndex >= totalItems) break;

e.Graphics.DrawString($"Item {itemIndex + 1}", new Font("MS UI Gothic", 10),
Brushes.Black, 100, 100 + i * 20);
}

currentPage++;
e.HasMorePages = (currentPage * itemsPerPage < totalItems);
}

用紙サイズや余白の設定をカスタマイズする

用紙サイズや余白などの設定は、PageSettings プロパティを通じて変更できます。

PrintDocument pd = new PrintDocument();
pd.DefaultPageSettings.Margins = new Margins(50, 50, 50, 50); // 左右上下50px
pd.DefaultPageSettings.Landscape = true; // 横向きに印刷

業務アプリでは、帳票などのレイアウトに合わせた細かな調整が必要になるため、事前設定は重要です。


印刷エラーやキャンセルへの対応

印刷処理中に例外が発生することもあります。ユーザーがキャンセルする可能性も考慮し、例外処理を組み込みましょう。

try
{
pd.Print();
}
catch (Exception ex)
{
MessageBox.Show("印刷エラーが発生しました:" + ex.Message);
}

実用例:請求書やラベルの印刷

実際の業務でよくある印刷パターンとして、以下が挙げられます。

  • 請求書印刷:表形式で金額や品目、顧客名などを描画
  • ラベル印刷:小さな用紙サイズでQRコードやバーコードも印刷
  • 明細印刷:複数ページに渡るテーブル表示

これらはデータバインディングとループ処理の組み合わせで対応可能です。


WPFでの印刷との違い

WPFでは PrintDialogPrintVisual を使って印刷しますが、PrintDocument のような直接描画はやや扱いにくいです。
ただし、GDI+ を利用する方法をとれば、WPFでも同様の印刷処理が可能です。


まとめ

C#で印刷機能を実装するには、PrintDocument クラスを中心に、印刷内容を描画するイベント処理を設計することが基本です。
プレビューやプリンタ選択機能も併用することで、ユーザーにとっても使いやすい印刷体験が実現できます。

帳票や伝票印刷、ラベル出力など、あらゆる業務システムに応用できるため、C#開発者にとっては習得しておくべきスキルです。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。