Pregunta

Estoy trabajando en un proyecto ahora mismo, que implica la recepción de un mensaje desde otra aplicación, el formato, el contenido de ese mensaje, y enviarlo a una impresora.La tecnología de elección es C# servicio de windows.La salida podría ser llamado un informe, supongo, pero un motor de generación de informes no es necesario.Un simple motor de plantillas, como StringTemplate, o incluso XSLT salida de HTML iba a estar bien.El problema que estoy teniendo es encontrar un camino libre para imprimir este tipo de salida de un servicio.Ya que parece que va a trabajar, estoy trabajando en un prototipo utilizando Microsoft RDLC, llenar un local de informe y, a continuación, la representación como una imagen de una secuencia de memoria, la que yo a continuación, imprimir.Los problemas con que son:

  • Impresión de varias páginas va a ser un gran dolor de cabeza.
  • Todavía tiene que usar PrintDocument para imprimir la secuencia de memoria, que no es compatible en un Servicio de Windows (aunque puede que el trabajo no ha conseguido que, de momento, con el prototipo todavía)
  • Si los datos que llegan a través de los cambios, tengo que cambiar el conjunto de datos y la clase que los datos que se deserializa en.malo malo malo.

Alguien ha tenido que hacer algo remotamente parecido a esto?Algún consejo?Ya he publicado una pregunta acerca de la impresión de HTML sin intervención del usuario, y después de perder alrededor de 3 días en que, he llegado a la conclusión de que no se puede hacer, al menos no con cualquier herramienta gratuita.

Toda la ayuda es apreciada.

EDITAR:Estamos en la versión 2.0 de .NET framework.

¿Fue útil?

Solución

Confía en mí, usted va a gastar más dinero tratando de buscar y desarrollar una solución para esto en comparación con la compra de un componente de terceros.No reinventar la rueda y para el pago de la solución.

La impresión es un problema complejo y me gustaría ver el día en que mejor marco se añade soporte para este.

Otros consejos

La impresión de un servicio de Windows es realmente doloroso.Parece que funciona...a veces...pero finalmente craches o lanza una excepción de vez en cuando, sin ninguna razón clara.Es realmente desesperado.Oficialmente, es aún no se admite, sin ninguna explicación, ni ninguna propuesta para una solución alternativa.

Recientemente, he sido confrontado con el problema y después de varios intentos fracasados y experimentaciones, me llegó finalmente con dos soluciones viables:

  • Escribir su propia impresión de DLL utilizando la API de Win32 (en C/C++ por ejemplo), entonces el uso de su servicio, con P/Invoke (funciona bien)
  • Escribir su propia impresión de componentes COM+, luego la usa de su servicio.He elegido esta solución con éxito recientemente (pero fue el tercero de componentes COM+, no propios escritos) Que funciona muy bien también.

Yo lo he hecho.Es un dolor en el*s.El problema es que la impresión requiere que GDI motor a estar en su lugar, lo que normalmente significa que usted tiene que tener el escritorio, que sólo se carga cuando está conectado.Si usted está tratando de hacer esto desde un Servicio en un Servidor, a continuación, que normalmente no estás conectado.

Así que en primer lugar no se puede ejecutar el usuario del servicio, sino como un usuario real que tiene el inicio de sesión interactivo de derechos.Entonces se tiene que modificar las entradas del registro del servicio (se me olvida cómo en el momento, tendría que buscar el código que puedo hacer esta noche si usted está realmente interesado).Por último, usted tiene que orar.

Su mayor largo plazo dolor de cabeza va a ser con los controladores de impresión.Si se ejecuta como un servicio sin que un usuario ha iniciado la sesión, algunos controladores de impresión como emergente de los diálogos de vez en cuando.¿Qué sucede cuando la impresora está fuera de tóner?O de papel?El conductor puede aparecer un cuadro de diálogo que nunca se ve, y levantar la cola de la impresora, porque nadie se registra en!

La impresión de un servicio es una mala idea.Las impresoras de la red están conectados "por usuario".Usted puede marcar el servicio para que se ejecute como un usuario en particular, pero me gustaría considerar la posibilidad de que una mala práctica de seguridad.Usted puede ser capaz de conectarse a una impresora local, pero me gustaría vacilan antes de ir por esta ruta.

La mejor opción es contar con el servicio de almacenar los datos y tener un usuario-aplicación lanzada la impresión pidiendo el servicio para los datos.O una ubicación en la que se almacenan los datos, como una base de datos.

Si usted necesita tener los datos impresos como intervalos regulares, la configuración de una Tarea de evento a través del Programador de Tareas.El lanzamiento de un proceso de un servicio se requiere saber el nombre de usuario y contraseña, que a su vez es una mala práctica de seguridad.

Como para la impresión en sí, el uso de una herramienta de terceros para generar el informe será más fácil.

Para responder a su primera pregunta, esto puede ser bastante recta hacia adelante en función de los datos.Tenemos una gran variedad de Servicios basados en aplicaciones que hacen exactamente lo que están pidiendo.Normalmente, se analiza el archivo entrante y envolver nuestro propio Postscript o PCL a su alrededor.Si el diseño es bastante simple, entonces hay algunas muy básicas códigos PCL usted puede envolver con proporcionar la fuente/impresión de la bandeja que desee (yo estaría más que feliz de darle algunos consejos fuera de línea).

Uno tiene un archivo de impresión listo se puede enviar a una ruta UNC de la impresora compartida, directamente a una impresora instalada localmente, o incluso a la IP del dispositivo (RAW o LPR tipo de datos).

Sin embargo, si se va hacia abajo el PDF de la ruta, el método más simple es enviar el archivo PDF de salida a una impresora compatible con impresión directa de PDF (muchos lo hacen ahora).En este caso, usted sólo tiene que enviar el PDF con el dispositivo y lejos de que se imprime.

La otra opción es lanzar Ghostscript que debe ser libre para sus necesidades (verificación de la concesión de licencias, ya que tienen un par de versión diferente, algunos de GNU, algunos GPL, etc.) y utilizar el construido en función de impresión o simplemente convertir Postscript y enviar al dispositivo.He usado Ghostscript muchas veces en el Servicio de aplicaciones, pero no es un gran fan de como será, básicamente, los bombardeos a cabo y ejecutar una aplicación de línea de comandos para realizar la conversión.Que siendo dicho, es una estable app que no tienden a fallar con gracia

Esto no puede ser lo que estás buscando, pero si yo tenía que hacer esto rápido y sucio, me gustaría:

  1. Crear una aplicación WPF (lo que podría utilizar el construido-en el manejo de documentos)
  2. Dar el servicio de la habilidad para interactuar con el escritorio (nota que en realidad no tiene que demostrar nada en el escritorio, o estar conectado para que esto funcione)
  3. Tienen el servicio se ejecute la aplicación, y dar los datos para la impresión.

Usted podría probablemente también jigger para imprimir desde un navegador web que se puede ejecutar desde el servicio (aunque me gustaría recomendar la construcción de su propio shell es decir, en lugar de utilizar un navegador completo).

Para una información más detallada (también gratis) de la solución, su mejor apuesta es probablemente manualmente formato del documento mismo (utilizando GDI+ para hacer el diseño para usted).Esto es tedioso, propenso a errores, mucho tiempo, y se desperdicia mucho papel durante el desarrollo, pero también le da más control sobre lo que va a la impresora.

Si usted puede dar salida a post script algunas impresoras pueden imprimir cualquier cosa que se interponga FTPed a un directorio determinado en ellos.

Hemos utilizado este para conseguir más allá de la impresión de los créditos de que nuestra universidad se expone en nosotros, pero si su servicio de salidas a ps a continuación, puedes ftp el archivo ps a la impresora.

Estamos utilizando DevExpress' XtraReports para imprimir desde un servicio sin problemas.Su modelo de informe es similar a la de Windows Forms, por lo que podría insertar dinámicamente los elementos de texto y, a continuación, emitir el comando de impresión.

Creo que va a ir la tercera parte de la ruta.Me gusta el XSL -> HTML -> PDF -> Impresora de flujo de...Winnovative del HTML a PDF se ve bien para la primera parte, pero me estoy quedando en un bloque de encontrar una buena impresión en PDF de la solución...alguna sugerencia?Lo ideal es que la licencia es de un desarrollador de base, no en un desplegado de tiempo de ejecución de base.

En respuesta a tu pregunta acerca de la impresión en PDF, no he encontrado una solución elegante.Yo era "shell" ing a Adobe que era poco fiable y requiere de un usuario a estar conectado en todo momento.Para solucionar este problema específico, me pidió que los archivos de proceso (facturas) formato de archivos Tiff de varias páginas, el cual puede separarse y se imprimen con los nativos .NET las funciones de impresión.Adobe posición parece ser el de "conseguir que el usuario vea el archivo en Adobe Reader y pueden hacer clic en imprimir".Inútil.

Todavía estoy deseoso de encontrar una buena manera de producir informes de calidad que puede ser la salida desde el servidor web...

Impresión uso del Sistema.De dibujo.La impresión no es compatible con MS, como por Yann Trevin la respuesta.Sin embargo, usted podría ser capaz de utilizar el nuevo, basado en WPF, Sistema.De Impresión (I creo)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top