■VB.Netで印刷(基本)
VB6の時はPrinterオブジェクトで印刷していたのですがVB.Netになって
印刷方法がかなり変わってしまいました。
●VB.Net印刷するにはPrintDocumentコントロールを使います。
●PrintDocumentコントロールに対し、プロパティを設定します。
印刷するプリンタ
用紙サイズ
印刷する向、両面印刷設定
印刷ドキュメント名
●PrintDocumentコントロールに対しPrintメソッドを発行する(PrintDocument1.Print())
発行するとPrintDocumentコントロールのPrintPageイベントが実行されます。
●印刷はPrintPageイベント内に書く
改ページはルーチンを抜ける時にe.HasMorePages
=
Trueとする事で
再度PrintPageイベントが呼び出される仕組みになっています。
●サンプル
●印刷設定、印刷開始
Dim pPaperSz As
System.Drawing.Printing.PaperKind
Dim pkSize As
System.Drawing.Printing.PaperSize
'### プリンター名を直接指定して印刷
############################################
PrintDocument1.PrinterSettings.PrinterName =
"PrimoPDF"
'PrintDocument1.PrinterSettings.PrinterName = "Canon MP640 series Printer"
'###
印刷用紙サイズ設定
#######################################################
pPaperSz =
Printing.PaperKind.A4
'A4 サイズの定数
'サポートされている用紙サイズの一覧を取得
For Each
pkSize In
PrintDocument1.PrinterSettings.PaperSizes
'指定の用紙サイズがサポートされているか
If pkSize.Kind = pPaperSz
Then
'指定の用紙サイズが見つかったら用紙サイズを設定する
PrintDocument1.DefaultPageSettings.PaperSize =
pkSize
End
If
Next
'### 用紙方向横向き/縦向きで印刷
################################################
'PrintDocument1.DefaultPageSettings.Landscape =
True
'横向き
PrintDocument1.DefaultPageSettings.Landscape =
False '縦向き
'### 両面
※ドライバによっては無視される
################################################
'PrintDocument1.PrinterSettings.Duplex = Printing.Duplex.Horizontal
'水平方向のページの回転を使用して両面印刷。(縦めくり)
PrintDocument1.PrinterSettings.Duplex =
Printing.Duplex.Vertical ' 垂直方向のページの回転を使用して両面印刷。(横めくり)
'###
印刷ドキュメント名設定
######################################################
PrintDocument1.DocumentName = DateTime.Now.ToString("yyyyMMdd_HHmmss") &
"_TestPrint" '印刷ドキュメント名設定
'### 印刷
####################################################################
PrintDocument1.Print()
●印刷処理部(PrintDocument_PrintPageイベント)
'### 印刷処理
#################################################################
Static W_Page As
Integer = 0
'印刷サンプル・ミリメートル単位での印刷を行う
e.Graphics.PageUnit = GraphicsUnit.Millimeter
'印刷出来る大きさを取得
Dim PrTop_X As Single =
PrintDocument1.DefaultPageSettings.HardMarginX
'始点X座標はハードウェアマージンで取得(1/100インチ単位)
Dim PrTop_Y As
Single = PrintDocument1.DefaultPageSettings.HardMarginY
'始点Y座標はハードウェアマージンで取得(1/100インチ単位)
'HardMarginは1/100インチ単位なのでミリ単位に直す
If PrTop_X <> 0
Then
PrTop_X = PrTop_X * 0.254
End
If
If PrTop_Y <> 0
Then
PrTop_Y = PrTop_Y * 0.254
End
If
'印刷始点を紙の頂点に
e.Graphics.TranslateTransform(PrTop_X * -1, PrTop_Y * -1)
'ここまで行うと座標がミリメートルで紙の左上が0,0として印刷出来る
Dim
Pr_Size_Width As Single = e.Graphics.VisibleClipBounds.Width
'印刷できる「幅」をクリッピング領域を利用して取得
Dim
Pr_Size_Height As Single = e.Graphics.VisibleClipBounds.Height
'印刷できる「高さ」をクリッピング領域を利用して取得
'左上を頂点とし、上・左から1センチ空いた場所に横10cm縦5cmの四角形を印刷する
e.Graphics.DrawLine(New Pen(Color.Black, 0.1), New Point(10, 10), New Point(110,
60))
e.Graphics.DrawRectangle(New Pen(Color.Black, 0.1), New Rectangle(10, 10, 100,
50))
'四角形を描画し、その中に納まる最大の大きさの文字で印刷を行う
e.Graphics.DrawRectangle(New Pen(Color.Black, 0.1), New Rectangle(10, 100, 100,
20))
Dim W_Font As
Font
Dim w10 As
Long
Dim W_SizeF As
SizeF
'StringFormatオブジェクトの作成
Dim sf As
New StringFormat
w10 =
50
Do
W_Font
= New Font("MS ゴシック",
w10)
W_SizeF = e.Graphics.MeasureString("テスト文字列を印刷します", W_Font, 1000,
sf)
If
W_SizeF.Width < 100 And W_SizeF.Height < 20
Then
Exit Do
End If
w10
= w10 - 1
Loop
e.Graphics.DrawString("テスト文字列を印刷します", W_Font, Brushes.Black, New Point(10,
100))
'ページ
W_Page = W_Page +
1
e.Graphics.DrawString(W_Page.ToString & "ページ", W_Font, Brushes.Black, New
Point(10, 200))
'2ページ印刷するので1ページ目は印刷継続、2ページ目で終わり
If
W_Page = 1
Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
W_Font.Dispose()
●簡単なサンプルですが一通り色々な事をしています。
●利点・欠点
色々調べたりテストしたのですが領域を指定して印刷する等楽に出来る事がある反面
座標を指定して印刷しても勝手に余白が空く(詳しくはグリフの突出で調べてください)
上記のように改ページするには一旦プロシージャから抜け出さなくてはならないので
自分には流れがつかみにくい、等結構こまりました。
特に文字に余白がつくのには参りました。
結局自前の補正用クラスを作って対処しましたがそれは次回に回そうと思います。
トップへ戻る