2011-01-19 32 views
5

Tôi đã dành rất nhiều thời gian gần đây để cố gắng tìm ra lý do tại sao quá trình in chậm như vậy trong ứng dụng tôi đang làm việc (.Net 4.0, WPF front-end) và tôi tất cả các ý tưởng (25 phút để in 150 trang).In rất chậm từ WPF

Tôi đã thử các phương pháp in khác nhau (PrintDialog, XpsDocumentWriter, VisualsToXpsDocument) cả với dữ liệu vectơ trực tiếp từ các điều khiển và cũng bằng cách hiển thị các điều khiển (RenderTargetBitmap) đầu tiên và chỉ gửi hình ảnh ra. các kết quả.

Điều thú vị là khi sử dụng VisualsToXpsDocument để thực hiện ghi lô, tôi có thể tạo nội dung cho 186 trang trong thời gian cần khuôn khổ in để xử lý 21 trang. Một cái gì đó thực sự sai ở đây. Để đảm bảo điều này không chỉ là vấn đề phức tạp của một số điều khiển trong ứng dụng, tôi đã tạo một ứng dụng demo độc lập chỉ chứa một lưới dữ liệu chứa 4000 hàng dữ liệu tĩnh và khoảng 8 cột. Không có vấn đề về hiệu suất với chính lưới dữ liệu, chỉ với in ấn. Đây là cách tiếp cận được chấp nhận nhiều nhất mà tôi đã sử dụng để mang lại kết quả kém.

 this.writer 
      = PrintQueue.CreateXpsDocumentWriter(this.SelectedPrinter.PrintQueue); 

     PrintingDocumentPaginator paginator 
      = new PrintingDocumentPaginator(this.PrintConfiguration, 
       contentSize, pageSize, contentRect, this.printSource, false); 

     this.writer.WritingProgressChanged += this.OnPrintingProgressChanged; 
     this.writer.WritingCompleted += this.OnPrintingCompleted; 
     this.writer.WritingCancelled += this.OnPrintingCanceled; 

     this.writer.WriteAsync(paginator, 
       this.PrintConfiguration.PrintTicket, paginator.PageCount); 

Hoặc nếu tôi sử dụng mã sau, lệnh gọi EndBatchWrite() sẽ được nhấn rất nhanh, với phần còn lại của quá trình in mất nhiều thời gian hơn.

 this.writer 
      = PrintQueue.CreateXpsDocumentWriter(this.SelectedPrinter.PrintQueue); 

     PrintingDocumentPaginator paginator 
      = new PrintingDocumentPaginator(this.PrintConfiguration, 
        contentSize, pageSize, contentRect, 
        this.printSource, this.useVectorData); 

     this.writer.WritingProgressChanged += this.OnPrintingProgressChanged; 
     this.writer.WritingCompleted += this.OnPrintingCompleted; 
     this.writer.WritingCancelled += this.OnPrintingCanceled; 

     VisualsToXpsDocument sdf 
      = (VisualsToXpsDocument)this.writer.CreateVisualsCollator(); 

     for (int i = 0; i < paginator.PageCount; i++) 
     { 
      sdf.WriteAsync(paginator.GetPageVisual(i)); 
     } 

     sdf.EndBatchWrite(); 

Vì vậy, tôi đang làm gì sai ở đây? Tôi có gửi sai dữ liệu đến máy in không? Có một số bí mật tôi không nhìn thấy?

EDIT - này áp dụng cho máy in vật lý cũng như máy in tập tin ví dụ: máy in XPS, PDF, vv

Chúc mừng,

Sam.

Trả lời

0

này là khá nhiều những gì tôi làm, đó là thực sự nhanh chóng cho tôi:

 LocalPrintServer localPrintServer = new LocalPrintServer(); 
     System.Printing.PrintQueue pq = new System.Printing.PrintQueue(localPrintServer, localPrintServer.DefaultPrintQueue.FullName); 

     System.Windows.Xps.XpsDocumentWriter docWriter = System.Printing.PrintQueue.CreateXpsDocumentWriter(pq); 
     PrintCapabilities pc = pq.GetPrintCapabilities(); 

     PageImageableArea pia = pc.PageImageableArea; 

     if (docWriter != null) 
     { 
      DocumentPaginator paginator = ((IDocumentPaginatorSource)copy).DocumentPaginator; 

      // Change the PageSize and PagePadding for the document to match the CanvasSize for the printer device. 
      paginator.PageSize = new System.Windows.Size(pia.ExtentWidth, pia.ExtentHeight); 

      // Send content to the printer. 
      docWriter.Write(paginator); 
     } 

tôi không sử dụng vòng lặp mà bạn sử dụng như tôi đã không bao giờ cần đến nó. Tôi chỉ để cho nó đi, và đối phó với bất kỳ lỗi nào khi chúng đến sau (đó là sau khi tôi đã kiểm tra tình trạng máy in trước khi tay). Để kiểm tra trạng thái máy in, bạn chỉ cần xem các thuộc tính trạng thái trên hàng đợi máy in mà bạn đang sử dụng.

Tôi hy vọng điều đó sẽ giúp ích theo bất kỳ cách nào.

+0

Máy in có xuất hiện trong bản in lớn không? Tôi đã có vấn đề này 3 năm trước và tôi chỉ có thể nhớ làm thế nào tôi giải quyết nó. Nó phải làm với thực tế là trong một số trường hợp, hệ thống in WPF sẽ rasterize nội dung thay vì tạo ra nội dung có thể được chuyển trực tiếp sang postscript. –