Bạn cần tạo ngữ cảnh thiết bị máy in và hiển thị các trang của mình bằng ngữ cảnh thiết bị đó làm DC tham chiếu trong khi theo dõi số trang bạn đã hiển thị. Điều này sẽ phải được thực hiện bên ngoài phạm vi của cơ sở hạ tầng .NET Printing.
- Lấy tham chiếu Máy in DC
- Tạo Bitmap dựa trên máy in tham khảo DC
- Tạo đối tượng Graphics để vẽ trên bitmap
- Render Trang bitmap sử dụng đồ họa Object (Đếm Trang đây)
- dữ liệu khác để in? Chuyển đến 4
Dưới đây là một shot tại bước 1, giả sử bạn đang làm việc trong 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
Bước 2 là "đơn giản là" sử dụng trở lại đối tượng với sự kiện PagePrint đã thực hiện của bạn tham khảo Graphics mã để hiển thị các trang đến một bitmap thích hợp trong khi vẫn theo dõi số trang bạn đang hiển thị. Đừng quên cấu trúc lại sự kiện PagePrint của bạn thành một thường trình riêng biệt chấp nhận một đối tượng đồ họa để nó có thể được sử dụng cho việc in ấn, xem trước và đánh số trang. Đừng quên vứt bỏ đối tượng Đồ họa và 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