Вам потребуется создать контекст устройства принтера и визуализировать ваши страницы, используя этот контекст устройства в качестве эталонного контроллера домена, сохраняя при этом количество отображаемых страниц.Это должно быть сделано за пределами инфраструктуры .NET Printing.
- Получение эталонного принтера DC
- Создание растрового изображения на основе эталонного принтера DC
- Создание графикиобъект для рисования на растровом изображении
- Отображение страницы в растровое изображение с использованием графического объекта (счетчик страниц здесь)
- Дополнительные данные для печати?Перейти к 4
Вот шаг на шаге 1, предполагается, что вы работаете в 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
Шаг 2 «просто» с использованием возвращенного эталонного графического объекта сваш уже реализованный код события PagePrint для отображения страниц в соответствующем растровом изображении, отслеживая количество отображаемых страниц.Не забудьте реорганизовать событие PagePrint в отдельную подпрограмму, которая принимает объект Graphics, чтобы его можно было использовать для печати, предварительного просмотра и нумерации страниц.Не забудьте избавиться от объекта Graphics и 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