He pasado mucho tiempo tratando de descubrir por qué la impresión es tan lenta en la aplicación en la que estoy trabajando (.Net 4.0, front-end WPF) y estoy todo sin ideas (más de 25 minutos para imprimir 150 páginas).Impresión muy lenta de WPF
He intentado varios métodos de impresión (PrintDialog, XpsDocumentWriter, VisualsToXpsDocument), ambos con datos vectoriales directamente desde los controles y también la prestación de los controles (RenderTargetBitmap) primero y simplemente enviar imágenes, pero cada método da aproximadamente la misma resultados.
Curiosamente, cuando uso el VisualsToXpsDocument para hacer una escritura por lotes, puedo crear el contenido para 186 páginas en el tiempo que le toma al marco de impresión procesar 21 páginas. Algo está realmente mal aquí.
Para asegurarme de que esto no era solo un problema con la complejidad de algunos controles en la aplicación, creé una aplicación de demostración independiente que contiene solo una cuadrícula de datos llena de 4000 filas de datos estáticos y alrededor de 8 columnas. No hay problemas de rendimiento con la cuadrícula de datos en sí, solo con la impresión. Este es el enfoque más aceptado que he estado usando y que da resultados pobres.
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);
Alternativamente si uso el siguiente código, la llamada a EndBatchWrite() serán golpeados con gran rapidez, con el resto del proceso de impresión de tomar mucho más tiempo.
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();
¿Qué estoy haciendo mal aquí? ¿Estoy enviando los datos incorrectos a la impresora? ¿Hay algún secreto que no estoy viendo?
EDITAR - Esto se aplica a las impresoras físicas, así como las impresoras de archivos es decir, la impresora XPS, PDF, etc.
Cheers,
Sam.
¿El trabajo de impresión que aparece en la cola de impresión es bastante grande? Tuve este problema hace 3 años y apenas puedo recordar cómo lo resolví. Tiene que ver con el hecho de que bajo ciertas circunstancias, el sistema de impresión WPF rasterizará el contenido en lugar de generar contenido que pueda convertirse directamente en postscript. –