我最近花了很多时间试图弄清楚为什么我正在开发的应用程序(.Net 4.0,WPF前端)打印速度如此之慢,而且我完全没有想法( 25分钟以上打印150页。)
我已经尝试了各种打印方法(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等。
干杯,
萨姆。
答案 0 :(得分:0)
这就是我所做的,这对我来说真的很快:
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);
}
我不使用您使用的循环,因为我从来不需要它。我只是放手,并在他们稍后到达时处理任何错误(也就是在我之前已经检查过打印机状态之后)。要检查打印机状态,只需查看您正在使用的打印机队列上的状态属性。
我希望这会有所帮助。