■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()

 ●簡単なサンプルですが一通り色々な事をしています。

 ●利点・欠点
  色々調べたりテストしたのですが領域を指定して印刷する等楽に出来る事がある反面
  座標を指定して印刷しても勝手に余白が空く(詳しくはグリフの突出で調べてください)
  上記のように改ページするには一旦プロシージャから抜け出さなくてはならないので
  自分には流れがつかみにくい、等結構こまりました。
  特に文字に余白がつくのには参りました。
  結局自前の補正用クラスを作って対処しましたがそれは次回に回そうと思います。

トップへ戻る