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.
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. –