【发布时间】:2011-06-11 17:33:42
【问题描述】:
我最近花了很多时间试图弄清楚为什么我正在处理的应用程序(.Net 4.0,WPF 前端)的打印速度如此之慢,而且我完全没有想法(打印 150 页需要 25 分钟以上)。
我已经尝试了各种打印方法(PrintDialog、XpsDocumentWriter、VisualsToXpsDocument),既可以使用直接来自控件的矢量数据,也可以先渲染控件(RenderTargetBitmap)并发送图像,但每种方法给出的结果大致相同.
有趣的是,当使用 VisualsToXpsDocument 进行批量写入时,我可以在打印框架处理 21 页的时间内创建 186 页的内容。这里确实有问题。
为了确保这不仅仅是应用程序中某些控件的复杂性问题,我创建了一个独立的演示应用程序,其中仅包含一个数据网格,其中填充了 4000 行静态数据和大约 8 列。数据网格本身没有性能问题,只是打印。这是我一直在使用的最被接受的方法,但效果不佳。
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);
或者,如果我使用以下代码,对 EndBatchWrite() 的调用将很快被命中,而其余的打印过程需要更长的时间。
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();
那么我在这里做错了什么?我是否向打印机发送了错误的数据?有什么我没看到的秘密吗?
编辑 - 这适用于物理打印机以及文件打印机,即 XPS 打印机、PDF 等。
干杯,
山姆。
【问题讨论】:
标签: .net wpf performance printing