2010-09-09 11 views
5

Estoy tratando de usar un control WebBrowser invisible para imprimir un documento HTML muy simple. Nuestra aplicación requiere que podamos imprimir varios documentos de esta manera, y que todos puedan enviarse a diferentes impresoras. Lamentablemente, no he tenido mucho éxito en hacer que la salida vaya a la impresora correcta.Programando el cambio de la impresora de destino para un control WinForms WebBrowser

La forma en que funciona ahora es que, antes de imprimir un documento, la aplicación determina qué impresora va a recibirlo y configura la impresora predeterminada en consecuencia. Para hacer esto, usa SetDefaultPrinter() importado de WinSpool.drv. Si paso el código en el modo de depuración puedo ver claramente que la impresora predeterminada cambia (y este cambio se refleja en la interfaz de usuario del panel de control), pero WebBrowser aún insiste en usar la impresora predeterminada original.

La documentación de MSDN, por lo que he visto, realmente no proporciona una solución para este escenario. Agradecería enormemente algunos comentarios sobre cómo puedo lograr esto programáticamente.

+0

Por curiosidad: aceptaste mi respuesta, pero hice unos 6 sugerencias diferentes. ¿Qué solución eligió? ¿Cuál funcionó para usted? – ChrisW

+1

@ChrisW: Perdón por no ser claro acerca de esto. El uso de las API de ActiveX finalmente resolvió el problema. Básicamente, tomo el objeto WebBrowser.ActiveXInstance, registro un controlador para el evento PrintTemplateTeardown y espero a que ocurra antes de considerar la impresión de una página. Curiosamente, esto resolvió todos los problemas de destino de impresión que tuvimos con el control de envoltura de WebBrowser administrado. ¡Gracias por tu consejo! –

Respuesta

1

Dado lo que ha dicho, quizás si reinicia el proceso que contiene el control del navegador web (o el proceso que es el control del navegador web), ¿después de cambiar la impresora predeterminada? Eso es the kind of thing I see happening here, por ejemplo.


supongo que sería posible a la mesa de un proceso de fondo que hace la impresión real, pero estoy realmente esperando una solución más simple.

Bifurcando fue mi primer pensamiento hacia una solución más simple probablemente-.

Algunas otras alternativas son las siguientes.

1). IE, que el control del webbrowser está ajustando, expone las API a través de ActiveX. Una de sus API podría permitirle especificar la impresora de destino.

2). Algunos ejecutables (no sé sobre IE) tienen entradas printto en el registro. Por ejemplo, Acrobat Reader tiene una entrada cuyo valor es el siguiente:

""C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"" /t "%1" "%2" "%3" "%4" 

que se utiliza para especificar la sintaxis de la línea de comandos que puede utilizar para imprimir y especificar una impresora (no predeterminada). También puede buscar en Google printto, ver p. PrintTo command in the ShellExecute.

3). He implementado un HTML control for .NET propio, que no depende de IE. Usted dice que su HTML (y CSS supongo) son simples, así que tal vez I can render it, ya sea de fábrica o con solo un pequeño esfuerzo de desarrollo adicional. No soporto la impresión, pero la impresión es bastante fácil de implementar por un usuario. Hacerme implementar eso para ti te costaría varios cientos pero, quién sabe, quizás valga la pena para ti. Sería una solución bastante ligera, y tal vez bien respaldada. Podrías enviarme un correo electrónico si quieres hablar más sobre eso.

4). También puede encontrar otros controles, similares al mío, más o menos famosos/caros; u otras aplicaciones, p. OpenOffice, etc.

5). Podría considerar convertir el HTML (de alguna manera) a otro formato (por ejemplo, PDF) para el que tenga una aplicación que le brinde un mejor soporte para la impresión.

+0

Desafortunadamente, la aplicación en cuestión es un servidor crítico para la empresa que no puede reiniciarse cada vez que necesita imprimir un documento. Supongo que sería posible organizar un proceso en segundo plano que haga la impresión real, pero realmente espero una solución más simple. –

+0

@Martin Törnwall - Agregué otras posibles soluciones a mi respuesta. – ChrisW

+0

Quizás esta publicación pueda ser útil: http://stackoverflow.com/questions/714507/how-do-i-programatically-change-printer-settings-with-the-webbrowser-control –

0

He tenido exactamente el mismo problema e incorporé this control en lugar del explorador web .NET estándar para solucionarlo.

-1

Esto funciona en .NET 3.5, si no antes

this.webBrowser1.ShowPrintDialog(); 
Cuestiones relacionadas