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.
- Obtener referencia de la impresora DC
- Crear mapa de bits basado en referencia de la impresora DC
- crear gráficos de objeto para dibujar en mapa de bits
- Render página de mapa de bits utilizando objetos gráficos (Count páginas aquí)
- 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