Ir al contenido


Foto

Enviar secuencias de escape a una impresora


  • Por favor identifícate para responder
22 respuestas en este tema

#1 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 26 noviembre 2008 - 03:12

La siguiente función envía secuencias de escape directamente a la impresora.



delphi
  1. uses Printers, WinSpool;
  2.  
  3. function WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean;
  4. var
  5.   PrinterHandle: THandle;
  6.   DocInfo: TDocInfo1;
  7.   i: Integer;
  8.   B: Byte;
  9.   Escritos: DWORD;
  10. begin
  11.   Result:= FALSE;
  12.   if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
  13.   try
  14.     FillChar(DocInfo,Sizeof(DocInfo),#0);
  15.     with DocInfo do
  16.     begin
  17.       pDocName:= PChar('Printer Test');
  18.       pOutputFile:= nil;
  19.       pDataType:= 'RAW';
  20.     end;
  21.     if StartDocPrinter(PrinterHandle, 1, @DocInfo) <> 0 then
  22.     try
  23.       if StartPagePrinter(PrinterHandle) then
  24.       try
  25.         while Length(Str) > 0 do
  26.         begin
  27.           if Copy(Str, 1, 1) = '\' then
  28.           begin
  29.             if Uppercase(Copy(Str, 2, 1)) = 'X' then
  30.               Str[2]:= '$';
  31.             if not TryStrToInt(Copy(Str, 2, 3),i) then
  32.               Exit;
  33.             B:= Byte(i);
  34.             Delete(Str, 1, 3);
  35.           end else B:= Byte(Str[1]);
  36.           Delete(Str,1,1);
  37.           WritePrinter(PrinterHandle, @B, 1, Escritos);
  38.         end;
  39.         Result:= TRUE;
  40.       finally
  41.         EndPagePrinter(PrinterHandle);
  42.       end;
  43.     finally
  44.       EndDocPrinter(PrinterHandle);
  45.     end;
  46.   finally
  47.     ClosePrinter(PrinterHandle);
  48.   end;
  49. end;



"PrinterName" es el nombre de la impresora tal como aparece en la carpeta de impresoras de windows, esto permite que nos olvidemos de si la impresora es serie, paralelo o usb, funcionara en todos los casos. Si la impresora se conecta por el puerto serie o paralelo y no quieres instalar los drivers, instala una impresora "Genérica / solo texto" indicándole el puerto donde esta. Por otro lado el parámetro Str es una cadena de texto donde los caracteres especiales están precedidos por el carácter "\" seguido de 3 cifras decimales o de "x" y dos cifras hexadecimales.

Por ejemplo, para que la impresora emita un pitido (las secuencias pueden variar de una impresora a otra):
\x1B@\x0A\x0D\x1B\x07\x0A\x0D

Para que corte el papel:
\x1B@\x0A\x0D\x1Bi\x0A\x0D

Para abrir el cajon de monedas
\x1B@\x0A\x0D\027\112\000\100\250\x0A\x0D

Para que escriba "Hola mundo"  :D
\x1B@\x0A\x0DHola mundo\x0A\x0D

  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.177 mensajes
  • LocationMéxico

Escrito 26 noviembre 2008 - 03:21

Muchas gracias amigo seoane

Excelente rutina

Salud OS
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 26 noviembre 2008 - 03:24

Algo así es lo que mucho necesitábamos, muchas gracias seoane :D

Saludos.
  • 0

#4 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 26 noviembre 2008 - 03:29

(y) Buen truco...
  • 0

#5 Caral

Caral

    Advanced Member

  • Administrador
  • 4.261 mensajes
  • LocationCosta Rica

Escrito 26 noviembre 2008 - 03:31

Hola
Muy bueno ademas de util.
Gracias Seoane, lo tratare de implementar.
Saludos
  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 26 noviembre 2008 - 03:32

Vaya, con respuestas como esas da gusto publicar trucos  :D

Pues aquí dejo otro regalito, una pequeña herramienta para probar impresoras de tickets.

http://delphi.jmrds.com/?q=node/50
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 26 noviembre 2008 - 03:36

:o Por eso me encanta la navidad :D
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.177 mensajes
  • LocationMéxico

Escrito 26 noviembre 2008 - 03:37

Hoy estas desatado amigo :D  (y)

Salud OS
  • 0

#9 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 26 noviembre 2008 - 03:38

:o Ha sido más de lo que quiera saber hoy... ¡que bien!  (y)
  • 0

#10 Caral

Caral

    Advanced Member

  • Administrador
  • 4.261 mensajes
  • LocationCosta Rica

Escrito 26 noviembre 2008 - 03:42

Hola
Es impresionante la cantidad de codigo que tengo de ti amigo, es que eres una maquina :D
Saludos
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 26 noviembre 2008 - 03:54

no pero es que trabaja muy bien, gracias seoane  (y)
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 26 noviembre 2008 - 04:07

no pero es que trabaja muy bien, gracias seoane  (y)


Sin ganas de desvirtuar, pero aclara este comentario ;)
  • 0

#13 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 26 noviembre 2008 - 04:10

nada lo que se lee, que trabaja muy bien, no hay problema  (y)
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 26 noviembre 2008 - 04:11

nada lo que se lee, que trabaja muy bien, no hay problema  (y)


Ah, comentario aclarado. (y)

Saludos.
  • 0

#15 lKinGl

lKinGl

    Advanced Member

  • Administrador
  • 118 mensajes
  • LocationVenezuela

Escrito 27 noviembre 2008 - 10:35

La siguiente función envía secuencias de escape directamente a la impresora.



delphi
  1. uses Printers, WinSpool;
  2.  
  3. function WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean;
  4. var
  5.   PrinterHandle: THandle;
  6.   DocInfo: TDocInfo1;
  7.   i: Integer;
  8.   B: Byte;
  9.   Escritos: DWORD;
  10. begin
  11.   Result:= FALSE;
  12.   if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
  13.   try
  14.     FillChar(DocInfo,Sizeof(DocInfo),#0);
  15.     with DocInfo do
  16.     begin
  17.       pDocName:= PChar('Printer Test');
  18.       pOutputFile:= nil;
  19.       pDataType:= 'RAW';
  20.     end;
  21.     if StartDocPrinter(PrinterHandle, 1, @DocInfo) <> 0 then
  22.     try
  23.       if StartPagePrinter(PrinterHandle) then
  24.       try
  25.         while Length(Str) > 0 do
  26.         begin
  27.           if Copy(Str, 1, 1) = '\' then
  28.           begin
  29.             if Uppercase(Copy(Str, 2, 1)) = 'X' then
  30.               Str[2]:= '$';
  31.             if not TryStrToInt(Copy(Str, 2, 3),i) then
  32.               Exit;
  33.             B:= Byte(i);
  34.             Delete(Str, 1, 3);
  35.           end else B:= Byte(Str[1]);
  36.           Delete(Str,1,1);
  37.           WritePrinter(PrinterHandle, @B, 1, Escritos);
  38.         end;
  39.         Result:= TRUE;
  40.       finally
  41.         EndPagePrinter(PrinterHandle);
  42.       end;
  43.     finally
  44.       EndDocPrinter(PrinterHandle);
  45.     end;
  46.   finally
  47.     ClosePrinter(PrinterHandle);
  48.   end;
  49. end;



"PrinterName" es el nombre de la impresora tal como aparece en la carpeta de impresoras de windows, esto permite que nos olvidemos de si la impresora es serie, paralelo o usb, funcionara en todos los casos. Si la impresora se conecta por el puerto serie o paralelo y no quieres instalar los drivers, instala una impresora "Genérica / solo texto" indicándole el puerto donde esta. Por otro lado el parámetro Str es una cadena de texto donde los caracteres especiales están precedidos por el carácter "\" seguido de 3 cifras decimales o de "x" y dos cifras hexadecimales.

Por ejemplo, para que la impresora emita un pitido (las secuencias pueden variar de una impresora a otra):
\x1B@\x0A\x0D\x1B\x07\x0A\x0D

Para que corte el papel:
\x1B@\x0A\x0D\x1Bi\x0A\x0D

Para abrir el cajon de monedas
\x1B@\x0A\x0D\027\112\000\100\250\x0A\x0D

Para que escriba "Hola mundo"  :D
\x1B@\x0A\x0DHola mundo\x0A\x0D


Al parecer todo esta muy bien pero como nunca falta un newbie podrias decirme para que se usa eso?
  • 0

#16 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 27 noviembre 2008 - 11:07

eso es para que la impresora funcione sin tinta, es un ahorro increible, prueba y veras (h)
  • 0

#17 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 27 noviembre 2008 - 03:33

Al parecer todo esta muy bien pero como nunca falta un newbie podrias decirme para que se usa eso?


Claro. Para imprimir tickets es muy habitual usar pequeñas impresoras que imprimen en rollos de papel (seguro que las has visto en alguna tienda). Aunque las mas modernas ya permiten imprimir como si fuera una impresora normal (usando el Canvas), una de las formas mas habituales de usar estas impresoras es mediante secuencias de escape enviadas directamente al puerto de la impresora. Las ventajas de este método es que es muy rápido, no se necesita instalar ningún driver y permite usar funciones especiales como la de abrir el cajón portamonedas o imprimir un logo previamente grabado en la eeprom de la impresora.

Personalmente creo que usar secuencias de escape es el mejor método para manejar impresoras de tickets. Precisamente tengo estos días problemas con un programa (que no hice yo  :D ) que utiliza el driver de windows para imprimir tickets y, además de ser terriblemente lento, tiene muchos problemas para imprimir bien la negrita, fijar los margenes, etc ... cuando si utilizara secuencias de escape solo habría que indicarle las correspondientes al modelo de impresora y listo.
  • 0

#18 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 26 febrero 2009 - 03:51

a ver, en una zebra TLP 2844 para comenzar a imprimir se le envia N luego A, seguido de coordenadas y configuración para el texto y por ultimo P1 para indicarle las copias.

Lo hago asi?? o que es lo que estoy haciendo mal que no me salen los tickets?



delphi
  1. WriteRawDataToPrinter('Zebra  TLP2824', '\x1BN');
  2. WriteRawDataToPrinter('Zebra  TLP2824', '\x1BA70,10,0,1,1,1,N,"HOLA MUNDO"');
  3. WriteRawDataToPrinter('Zebra  TLP2824', '\x1BP1');


  • 0

#19 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.177 mensajes
  • LocationMéxico

Escrito 26 febrero 2009 - 03:55

Las coordenadas que usas en que medida están, pixeles, lineas, o que, porque querer impirmir en la coordenada

10,0

Pues está raro.

Salud OS
  • 0

#20 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 26 febrero 2009 - 04:01

estan en pixeles, las coordenadas son 70, 10 :s por cierto me equivoque de codigo es este:



delphi
  1. WriteRawDataToPrinter('Zebra  TLP2824', '\078');
  2. WriteRawDataToPrinter('Zebra  TLP2824', '\06570,10,0,1,1,1,N,"HOLA MUNDO"');
  3. WriteRawDataToPrinter('Zebra  TLP2824', '\0801');





  • 0