2008-10-29 100 views
8

Estoy tratando de imprimir en impresoras Dot Matrix (varios modelos) de C#, actualmente estoy usando Win32 API (puede encontrar muchos ejemplos en línea) para enviar códigos de escape directamente a la impresora fuera de mi aplicación C# . Esto funciona genial, pero ...Impresión con matriz de puntos en C#?

Mi problema es que estoy generando los códigos de escape y no confiando en el sistema de impresión de Windows, las impresiones no pueden enviarse a impresoras "normales" ni a cosas como PDF print conductores. (Esto ahora está causando un problema ya que estamos tratando de usar la aplicación en un Terminal Server 2008 utilizando Easy Print [que está basado en XPS])

La pregunta es: ¿Cómo puedo imprimir documentos formateados (facturas en pre -impreso impreso) a las impresoras Dot Matrix (Epson, Oki y Panasonic ... varios modelos) de C# que no utilizan impresión directa, códigos de escape, etc.

** Solo para aclarar, estoy probando cosas como GDI + (System.Drawing.Printing) pero el problema es que es muy difícil, hacer que las cosas se alineen como lo hizo el código anterior. (El código anterior enviaba los caracteres directamente a la impresora sin pasar por el controlador de Windows). ¿Alguna sugerencia de cómo podrían mejorarse las cosas para que puedan usar GDI + pero seguir alineándose como lo hizo el código anterior?

+0

¿Puede dar nos une a los ejemplos para imprimir en impresoras de matriz de puntos. –

Respuesta

10

Probablemente deba utilizar una herramienta de informes para crear plantillas que le permitan a usted o a los usuarios ubicar correctamente los campos con respecto a los artículos de papelería preimpresos.

El uso de impresoras de matriz de puntos, que básicamente tienen que trabajar en cualquiera de los 2 modos:

  • modo simple máquina de escribir del texto de la línea/columna en la que se envía secuencias de escape para gestionar un pequeño número de fuentes que están incluidos en el hardware de la impresora y tienen que gestionar los retornos de línea, etc.
  • salida gráfica donde la página está rasterizada y el controlador de impresora solo conduce el cabezal de impresión y los pines para imprimir los puntos.

El primer uso es obsoleto sobre todo en Windows, ya que no ofrece mucho en la forma de controlar la salida, y cada impresora que tiene sus propias características que se convierte en difícil de manejar y difícil para el software para predecir y cosas de posición sobre la página (no WYSIWYG).

El segundo solo usa un paradigma de página gráfica que hace que el texto y los gráficos de posicionamiento sean independientes de las capacidades reales de la impresora.
Al usar material de escritorio preimpreso, su trabajo es para colocar correctamente los datos en la página.
Hacer esto a mano consume muchos recursos y no se recomienda crear el diseño en el código ya que te quedarás atrapado con el código para cambiar en caso de que tu impresora, formato de página o papelería impresa cambie.

Lo mejor es utilizar el modelo de impresión estándar que ofrece .Net y una herramienta de informes que le permite definir modelos y plantillas donde se colocarán el texto y los gráficos correctos, y luego guiarlos desde el código.

Visual Studio viene con una versión de Crystal Reports, pero hay otros sistemas de informes mejores (yo uso el de developer express por ejemplo), algunos de ellos son incluso free.

+0

Gracias, no estoy seguro si esto resolverá mi problema exacto, pero es probablemente la mejor respuesta/solución que he tenido hasta ahora. Además, no sabía sobre FYIReporting. – Dale

0

Si su impresora tiene un controlador para instalar, puede usar el sistema de impresión normal de Windows. La mayoría de las impresoras, incluidos los POS, tienen disponibles controladores de Windows. (La mayoría de las impresoras matriciales son compatibles con Epson). Algunos controladores de impresora POS también permiten enviar códigos de escape directamente a la impresora (utilizando fuentes especiales); probablemente no necesites tal funcionalidad.

Si este no es el caso, puede agregar una impresora genérica/de sólo texto (controlador) con la ayuda del Asistente para agregar impresoras. Una vez hecho esto, puede configurar ciertos comandos (secuencias de escape) para ello - Tamaño de fuente 10/12/17, Activar/desactivar negrita, Activar/desactivar subrayado, Inicio/Parada de trabajo, avance de papel y selección de tamaño.

Estoy usando una impresora genérica asociada con el puerto FILE para probar varios informes para impresoras POS: es fácil ver el archivo de texto para validar los números impresos. Por supuesto, es necesario formatear un controlador de impresora específico.

+0

Estoy tratando de ... usar el material de impresión GDI + en C# (System.Drawing.Printing) pero el problema es que todavía no es lo mismo (tan bueno) como enviar el texto directamente a la impresora ... Por ejemplo ¿Qué tipo de letra necesito usar? – Dale

+0

Creo que esta es la respuesta correcta: no desea orientar solo una impresora, desea orientarlas a todas, de modo que es mejor que imprima como lo hace cualquier otra persona en estos días, en lugar de simplemente enviar los caracteres a la impresora de líneas. (LPT). De esta manera, su impresora se convierte en un dispositivo de gráficos. –

+0

Creo que el controlador de impresora de texto es su mejor opción. También debe considerar la velocidad, la impresión en modo gráfico en una impresora matricial es mucho más lenta que el uso de códigos de escape. La desventaja es la incompatibilidad con las impresoras gráficas, pero con las formas preimpresas, el uso de otra impresora no es muy útil. – Glenner003

0

Parece que lo que me gustaría hacer no es posible.

Mis elecciones de impresión no se administran directamente a la impresión de la impresora (usando winspool.drv) lo que me permite hacer lo que quiera con la impresora y me permite alinear fácilmente las cosas. VB.NET Example O puedo usar GDI + (System.Drawing.Printing), que es complicado para alinear las cosas, pero funcionará con impresoras de matriz que no sean puntos, como las impresoras XPS y PDF.

5

Desde mi experiencia, es más fácil de usar dos tipos de informes para los mismos datos:

se requiere
  • un informe para impresoras matriciales utilizando códigos de escape y cualquier otra cosa, que se guarda en un archivo de texto y luego se imprime usando varios métodos (type file.txt > lpt1 o seleccionando en código la impresora predeterminada y usando NOTEPAD /P file.txt) - vea this page para más métodos de impresión.
  • otro informe para impresoras láser/inyección de tinta utilizando una herramienta Generador de informes (Crystal Reports, Report Manager, RLIB ni nada disponible)

Dado que no es poco común para comprar el tipo correcto de la impresora para el tipo de informe Este enfoque tiene la ventaja de dejar que el cliente decida: impresora de matriz de puntos para informes de texto en formato de papel A3/A4 (generalmente para el departamento de contabilidad) o impresora láser/de inyección de tinta para informes gráficos.

4

no sé cómo usar la secuencia de escape en C#. Pero tengo todas las Secuencias de escape para impresora genérica/solo de texto. Espero eso ayude.

impresión genérica secuencia de escape 1) Establecer espacios entre líneas a) 1/8 pulgadas - 27,48 b) 1/6 pulgadas - 27,50

2) Seleccionar Proyecto de Calidad a) 27.120, 0/27,120,48

3) Letter Quality una) 27,120,1/27,120,49

4) de doble altura a) 27 119, n i) n = 1 En ii) n = 0 Off

5) la impresión bidireccional a) 27,85, n i) 0 - Tanto manera ii) 1 - One Way

6) Aumentar espacio de carácter a) 27,32, n (Aumento por n/12 pulgadas)

7) Seleccionar Bold una) 27,69

8) Cancelar Bold una) 27,70

9) Seleccionar Fuentes una) 27,52

10) Cancelar Fuentes una) 27,53

11) Seleccionar a) 10cpi 27,8 b) 12cpi 27,77 c) 15cpi 27103 d) 18cpi 27.103

12) Conjunto Margen derecho a) 27,81, n

13) Ajuste Margen izquierdo a) 27 108, n

14) de avance de hoja una) 12

15) Impresión condensada a) 0F En b) 12 Apagado

16) Impresión de dañar dos veces una) 27,71

17) Cancelar Impresión de huelga una) 27,72

18) Bajo la línea a) 27,45,0 Off b) En 27,45,1

19) Doble Ancho a) 27,84,0 Off b) 27,84,1 EN

4

primer convertido ordena la secuencia en el personaje después pasar a la impresora

Ejemplo Fuentes 27,69

string.Format ("{0} {1}", Convert.ToChar (27), Convert.ToChar (69));

Tal vez un poco más corto que:

cadena.Formato ("{0} {1}", (char) (27), (char) (69));

Cuestiones relacionadas