2011-08-19 24 views
6

Trong một câu trả lời cho câu hỏi này ...Cách xử lý trước PrintDocument để tính tổng số trang trước khi in?

Printing page x of y in .Net

Câu trả lời được chấp nhận bao gồm tuyên bố này ...

Bạn không cần phải in nó hai lần, bạn chỉ cần để mô phỏng in lần đầu tiên.

Vì vậy, làm cách nào bạn có thể vượt qua tài liệu một lần đầu tiên mà không có bất kỳ đầu ra nào tới máy in hoặc màn hình?

Trả lời

3

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.

  1. Lấy tham chiếu Máy in DC
  2. Tạo Bitmap dựa trên máy in tham khảo DC
  3. Tạo đối tượng Graphics để vẽ trên bitmap
  4. Render Trang bitmap sử dụng đồ họa Object (Đếm Trang đây)
  5. 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 
Các vấn đề liên quan