2010-05-14 202 views
6

Mi aplicación necesita imprimir facturas, luego obtener la factura de la base de datos, insertar información en la factura en una cadena grande (diciendo la línea, columna, etc.) después de esto tengo el cadena lista para ser enviada a una impresora.Enviar comandos ESC a una impresora en C#

Mi problema es: Tengo que poner algunos comandos ESC/P/personajes de mi cadena grande

yo tratamos de hacer algo como esto:

 char formFeed = (char)12; 
     Convert.ToChar(12); 

     MyBigString.Insert(10, formFeed); 

Poco Con esto, la línea 10 va a hacer un FormFeed, pero esto no funciona

NOTA: Envío el MybigString todo de una vez a la impresora.

Para que mi código funcione, ¿necesito enviar los datos línea por línea a una impresora?

Gracias por la ayuda.

PD: Lo siento, por mi inglés, soy un desarrollador brasileño que no habla inglés (todavía).

+0

La impresora es una EPSON FX-1170 (impresora de matriz de puntos) – Ewerton

+2

¿Qué es 'MyBigString'? – SLaks

Respuesta

5

Omitir el controlador de la impresora y controlar la impresora directamente, utilizando su lenguaje de comandos nativo, es un escenario admitido. La P/Invoke se explica bien en este KB article.

¿Seguro que quieres hacer esto? No es común, por decirlo suavemente, generalmente solo se intenta con impresoras térmicas o matriciales de punto de venta de bajo costo. Si no te gustan los mecanismos de PrintDocument.PrintPage, nadie lo hace, podrías considerar mi código en this thread. Tenga en cuenta el método FormFeed.

+0

lee e implementa el artículo de KB y funciona bien para mí. Gracias – Ewerton

+0

El artículo KB abre la impresora en el modo "' RAW' ", lo que significa que se espera que emita bytes que el controlador de la impresora aceptará. Intentar enviar 0xFF a una impresora XPS hará que no haga nada. Tienes que cambiar el modo a "' TEXT' "(http://social.msdn.microsoft.com/forums/en-US/windowsxps/thread/6280ebb0-61ad-4c42-a870-7f022fcdfbfe/) –

5

I've blogged about this before after having to do it myself. No tocar la bocina demasiado fuerte, pero le recomiendo que lea esa entrada, ya que hablo de un comando de imagen complejo con la impresora. Si puedes entender eso, puedes imprimir cualquier cosa!

(hablo de ESC/POS, que se utiliza en impresoras de recibos de venta, pero la semántica de la discusión se aplica a ESC/P, el lenguaje de matriz de puntos mayores, también.)

En resumen, utilizar una BinaryWriter en lugar de string o se confundirá irremediablemente (como yo lo hice) cuando ciertos caracteres se "cocinan" en la codificación incorrecta en el camino a la impresora. (Confía en mí en este caso! No utilice un StringBuilder cuando se trata de hablar de ESC/POS.)

Tenga cuidado de no utilizar la sobrecarga de Write(string) del BinaryWriter ya que anteponer la longitud de la cadena como un byte en la transmisión, que no es lo que quieres. (I also blogged about that después de saber que la manera más difícil, también, en el mismo proyecto.)

Luego uso un poco de código para enviar la matriz byte, como se obtiene de la BinaryWriter, directamente a la impresora por P/Invocación:

private static void Print(string printerName, byte[] document) 
{ 
    NativeMethods.DOC_INFO_1 documentInfo; 
    IntPtr printerHandle; 

    documentInfo = new NativeMethods.DOC_INFO_1(); 
    documentInfo.pDataType = "RAW"; 
    documentInfo.pDocName = "Bit Image Test"; 

    printerHandle = new IntPtr(0); 

    if (NativeMethods.OpenPrinter(printerName.Normalize(), out printerHandle, IntPtr.Zero)) 
    { 
     if (NativeMethods.StartDocPrinter(printerHandle, 1, documentInfo)) 
     { 
      int bytesWritten; 
      byte[] managedData; 
      IntPtr unmanagedData; 

      managedData = document; 
      unmanagedData = Marshal.AllocCoTaskMem(managedData.Length); 
      Marshal.Copy(managedData, 0, unmanagedData, managedData.Length); 

      if (NativeMethods.StartPagePrinter(printerHandle)) 
      { 
       NativeMethods.WritePrinter(
        printerHandle, 
        unmanagedData, 
        managedData.Length, 
        out bytesWritten); 
       NativeMethods.EndPagePrinter(printerHandle); 
      } 
      else 
      { 
       throw new Win32Exception(); 
      } 

      Marshal.FreeCoTaskMem(unmanagedData); 

      NativeMethods.EndDocPrinter(printerHandle); 
     } 
     else 
     { 
      throw new Win32Exception(); 
     } 

     NativeMethods.ClosePrinter(printerHandle); 
    } 
    else 
    { 
     throw new Win32Exception(); 
    } 
}

¡Buena suerte!

+0

Gracias Nicholas, tu código parece estar muy avanzado para mí, pero trato de entenderlo. : D – Ewerton

+0

@Nicholas Tu blog ya no funciona. de todos modos, ¿podría echar un vistazo a ese código? –

0

".... OpenPrinter (printerName.Normalize(), fuera printerHandle, IntPtr.Zero) ..."

fuerza necesaria para establecer IntPtr.Zero a prima también.

Impresoras, especialmente la matriz de puntos, puede ser directa utilizando el método DOS, CMD, que mucho más simple y más rápido para la impresión también puede usar códigos de comando ESC/0x1b básicos para controlar la impresora. . etc.

como windowos/graphic, puede ser gráficos y sin formato configurando openprinter (,, printer_defaults) printer_defaults y doc-inf, pls refieren las referencias de win32 sdk.

para cualquier impresión en bruto se puede utilizar el comando ESC (consulte los detalles del manual de la impresora) para imprimir cualquier gráfico como lo hizo el controlador de Windows .

como la impresión en bruto, que sólo anexar cualquiera de la primera 20 ASCII, como oxoc (formfeed) 0x0doa (0x0a, 0x0D, \ n o salto de línea) cada impresora ha ligera ESC comandos diferencias pero utilizando el comando ESC principal es multado por la mayor parte de la matriz de puntos similar.

como ejemplo el modo sin procesar sigue, AvHoja, \ n & \ r

Char cFormfeed = 0x0C; // o \ f

char cStr [] = "1 = texto, ...... @ \ n2 = texto ..... \ r \ f3 = texto ......."; // use \ f no use cFormfeed puede resolverlo

cStr> lpt1; // salida al método dos o cmd de la impresora, de causa debe tener el lpt1 disponible.

impresión será

primera página

1 = texto, ...... @

2 = texto .....

en la segunda página es

3 = texto .......

espero que esto pueda ser de ayuda, buena suerte.

Cuestiones relacionadas