Как предварительно обработать PrintDocument для вычисления общего количества страниц перед печатью? - PullRequest
6 голосов
/ 19 августа 2011

В ответ на этот вопрос ...

Печать страницы x of y в .Net

Принятый ответ включал это утверждение ...

Вам не нужно печатать его дважды, вам просто нужно смоделировать печать в первый раз.

Итак, как вы можете сначала пройти документ без вывода на принтер или на экран?

1 Ответ

3 голосов
/ 22 августа 2011

Вам потребуется создать контекст устройства принтера и визуализировать ваши страницы, используя этот контекст устройства в качестве эталонного контроллера домена, сохраняя при этом количество отображаемых страниц.Это должно быть сделано за пределами инфраструктуры .NET Printing.

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...