【问题标题】:How to preprocess PrintDocument to calculate the total number of pages before printing?如何预处理 PrintDocument 以计算打印前的总页数?
【发布时间】:2011-08-19 02:44:58
【问题描述】:

在回答这个问题时...

Printing page x of y in .Net

接受的答案包括此声明...

你不必打印两次,你只需要模拟打印 第一次。

那么,如何在没有任何输出进入打印机或屏幕的情况下先通过文档一次?

【问题讨论】:

    标签: .net printing


    【解决方案1】:

    您将需要创建一个打印机设备上下文并使用该设备上下文作为参考 DC 呈现您的页面,同时跟踪您已呈现的页面数量。这必须在 .NET 打印基础结构范围之外完成。

    1. 获取参考打印机 DC
    2. 根据参考打印机 DC 创建位图
    3. 创建图形对象以在位图上绘制
    4. 使用图形对象将页面渲染为位图(此处计算页面)
    5. 要打印更多数据?转到 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多