【发布时间】:2011-08-19 02:44:58
【问题描述】:
在回答这个问题时...
接受的答案包括此声明...
你不必打印两次,你只需要模拟打印 第一次。
那么,如何在没有任何输出进入打印机或屏幕的情况下先通过文档一次?
【问题讨论】:
在回答这个问题时...
接受的答案包括此声明...
你不必打印两次,你只需要模拟打印 第一次。
那么,如何在没有任何输出进入打印机或屏幕的情况下先通过文档一次?
【问题讨论】:
您将需要创建一个打印机设备上下文并使用该设备上下文作为参考 DC 呈现您的页面,同时跟踪您已呈现的页面数量。这必须在 .NET 打印基础结构范围之外完成。
这是第 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
【讨论】: