2011-08-19 28 views

Respuesta

3

Tendrá que crear un contexto de dispositivo de impresora y presentar sus páginas utilizando el contexto de ese dispositivo como DC de referencia mientras realiza un seguimiento del número de páginas que ha procesado. Esto tendrá que hacerse fuera del alcance de la infraestructura de impresión .NET.

  1. Obtener referencia de la impresora DC
  2. Crear mapa de bits basado en referencia de la impresora DC
  3. crear gráficos de objeto para dibujar en mapa de bits
  4. Render página de mapa de bits utilizando objetos gráficos (Count páginas aquí)
  5. Más datos ¿imprimir? Goto 4

Aquí hay una foto en el paso 1, se asume está trabajando en winforms ...

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 

Paso 2 es "simplemente" utilizando el objeto gráfico de referencia vuelto con su evento PagePrint ya implementada código para procesar las páginas en un mapa de bits apropiado mientras realiza un seguimiento del número de páginas que está representando. No se olvide de refactorizar su evento PagePrint a una rutina separada que acepte un objeto Graphics para que pueda usarse para imprimir, previsualizar y numerar páginas. No se olvide de deshacerse del objeto Graphics y el Bitmap

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 
Cuestiones relacionadas