【入門編】Windows Formsの印刷機能(PrintDocument)の完全制御:複数ページにわたる複雑な請求書や納品書のページ番号付与とプレビュー画面のカスタマイズ – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

帳票印刷の呪縛を解く:VB.NETで実現する「完璧な」印刷制御術

こんにちは。現場の最前線でコードを書き続けてきたエンジニアとして、今日は避けては通れない、けれど多くの人が苦しむ「Windows Formsの印刷」についてお話しします。

「帳票の印字がズレる」「プレビュー画面が使いにくい」「改ページ位置がプリンターによってバラバラ」。そんな悩みを抱えていませんか?

今日は、`PrintDocument`を完全に手懐け、プロ仕様の帳票印刷システムを構築するための極意を伝授します。マクロの記録から一歩先へ、真の自動化エンジニアへの道を歩み始めましょう。

—

1. 印刷の本質:PrintDocumentの「描画サイクル」を理解する

まず、最も重要なルールを一つ。「印刷は、画面への描画と同じ」です。
`PrintDocument`の`PrintPage`イベントは、「1ページずつ、紙というキャンバスにペンで絵を描く作業」だと考えてください。

陥りがちな罠:変数の管理

初心者が最も陥りやすいエラーは、印刷中に「今の行数」や「ページ番号」を管理する変数を、正しくリセットできないことです。

.net
‘ クラスレベルの変数で状態を管理する
Private _currentPage As Integer = 1
Private _currentRowIndex As Integer = 0

Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
‘ ここで描画処理を行う
‘ e.Graphics.DrawString(…) を使用

‘ ページが終わったら _currentRowIndex を保持したまま、
‘ e.HasMorePages = True にして次のページへ飛ばす
End Sub

—

2. 独自の改ページロジック:機種依存からの解放

プリンターの解像度や余白設定によって出力結果がズレる……これは、座標を固定値(ピクセル)で指定しているからです。

極意:描画は「論理座標」で計算し、最後に変換する。

帳票作成の際、以下のステップを徹底してください。

1. データ量の事前計算: `MeasureString`メソッドを使い、文字列が現在の行に収まるかを確認。
2. 改ページ判定: 「現在のY座標 + 行の高さ > 印刷可能領域の高さ」なら、`e.HasMorePages = True`にして描画を終了する。

実装のヒント

.net
‘ 1行の高さ(フォントサイズに合わせて動的に計算すること!)
Dim lineHeight As Single = Font.Height + 5
Dim currentY As Single = 100 ‘ 開始位置

‘ ループ処理の中で行を描画
For i As Integer = _currentRowIndex To dataList.Count – 1
If currentY + lineHeight > e.MarginBounds.Bottom Then
‘ ページがいっぱいになったら中断
_currentRowIndex = i
e.HasMorePages = True
Return
End If

‘ 実際に描画
e.Graphics.DrawString(dataList(i), myFont, Brushes.Black, 100, currentY)
currentY += lineHeight
Next

‘ すべて描き終わったら終了
e.HasMorePages = False
_currentPage = 1 ‘ リセットを忘れずに!

—

3. PrintPreviewDialogのカスタマイズ:ユーザー体験を向上させる

デフォルトのプレビュー画面は質素ですが、`PrintPreviewDialog`の`PrintPreviewControl`プロパティを操作することで、見た目をガラリと変えられます。

さらに、フォームに配置したボタンから制御することで、ダイアログそのものを「自作のウィンドウ」として運用することも可能です。

プレビューの見た目を洗練させる

.net
‘ プレビューダイアログの初期設定
Dim previewDlg As New PrintPreviewDialog()
previewDlg.Document = PrintDocument1

‘ ズーム倍率を最初から全体表示に設定
previewDlg.PrintPreviewControl.Zoom = 1.0
‘ ツールバーの表示設定などを調整
previewDlg.ShowDialog()

—

4. なぜ「手作り」が最強なのか

ExcelやAccessの帳票機能は便利ですが、複雑なビジネス要件(「特定の条件で罫線を変える」「QRコードを動的に埋め込む」など)には限界があります。

VB.NETの`PrintDocument`を掌握すれば:

  • 機種依存からの解放: 常に計算ベースで座標を決めるため、どのプリンターでも同じレイアウトが出力されます。
  • パフォーマンス: 描画プロセスを自前で制御するため、数千ページの請求書でもメモリを効率的に使い、軽快に処理できます。

—

まとめ:ここをクリアすれば、あなたは一人前のエンジニアです

今日のポイントは3つです。

1. 状態管理: 印刷の「今どこ?」を正しく保持する。
2. 動的計算: `MeasureString`と`MarginBounds`を使い、余白を動的に判定する。
3. 抽象化: 描画処理を関数化し、再利用可能なパーツにする。

最初は難しく感じるかもしれません。しかし、この「コードでキャンバスを制御する」感覚が掴めれば、あなたの作るシステムは、一気にプロのクオリティへと昇華します。

分からないことがあれば、いつでも質問してくださいね。あなたのコードが、現場の業務をよりスムーズに、そして美しく変えていくことを応援しています。

それでは、良いコーディングライフを!

タイトルとURLをコピーしました