2011-08-19 31 views
6

...印刷前に総ページ数を計算するためにPrintDocumentを前処理する方法はありますか?この質問への答えで

Printing page x of y in .Net

受け入れ答えは、この文を含め...

あなたは二度それを印刷する必要はありません、あなただけシミュレートする必要があります初めて を印刷します。

これで、プリンタや画面に何も出力せずにドキュメントを一度通過させることはできますか?

答えて

3

プリンタデバイスコンテキストを作成し、レンダリングしたページ数を記録しながら、そのデバイスコンテキストを参照DCとして使用してページをレンダリングする必要があります。これは、.NET印刷インフラストラクチャの範囲外で行う必要があります。

  1. DC
  2. リファレンスプリンターを取得リファレンスプリンタに基づいてビットマップを作成DC
  3. グラフィックス(ここではページ数)Graphicsオブジェクトを使用してビットマップに
  4. より多くのデータをページをレンダリングビットマップ
  5. に描画するオブジェクトを作成します。印刷する?後藤4

はここでステップ1でのショットです、あなたはリサイズで作業していると仮定し...

Private Function GetHighResolutionGraphics() As Graphics 

     Try 

      Dim HighestResolution As Printing.PrinterResolution = Nothing 
      Dim HighestResolutionPrinter As String = "" 
      Dim XResolution As Integer = Integer.MinValue 

      Using dlg As New PrintDialog 

       For Each Printer As String In Printing.PrinterSettings.InstalledPrinters 
        dlg.PrinterSettings.PrinterName = Printer 
        For Each Resolution As Printing.PrinterResolution In dlg.PrinterSettings.PrinterResolutions 
         Using gr As Graphics = dlg.PrinterSettings.CreateMeasurementGraphics() 
          If gr.DpiX > XResolution Then 
           HighestResolution = Resolution 
           HighestResolutionPrinter = Printer 
           XResolution = gr.DpiX 
          End If 
         End Using 
        Next 
       Next 

       dlg.PrinterSettings.PrinterName = HighestResolutionPrinter 
       dlg.PrinterSettings.DefaultPageSettings.PrinterResolution = HighestResolution 

       Return dlg.PrinterSettings.CreateMeasurementGraphics() 

      End Using 

     Catch ex As Exception 
      ' handle or ignore .NET AccessViolation for certain network printers that are turned off, etc... 
     End Try 

     Return Me.CreateGraphics() 

    End Function 

ステップ2「を単に」あなたすでに実装PagePrintイベントで返さ参考Graphicsオブジェクトを使用していますレンダリング中のページ数を記録しながら、ページを適切なビットマップにレンダリングするコード。 PagePrintイベントをGraphicsオブジェクトを受け付ける別のルーチンにリファクタリングすることを忘れないでください。そうすれば、印刷、プレビュー、ページ番号付けに使用できます。 Graphicsオブジェクトとビットマップを処分することを忘れないでください。

using gfxReference as Graphics = GetHighResolutionGraphics() 
    using bmpPage as new Bitmap(gfxReference.DpiX * 8.5, gfxReference.DpiY * 11) 
    using gfxRender as Graphics = Graphics.FromImage(bmpPage) 
     gfxRender.Clear(Color.White) 
     // Existing PagePrint event logic goes here (uses gfxRender) 
     // Track Number of pages printed 
    end using 
    end using 
end using 
関連する問題