PrintTest

Esta herramienta surgió de la necesidad de comprobar el funcionamiento de impresoras de tickets, es decir, que corta bien, que imprime el logo correcto, etc. Su funcionamiento es realmente simple, se selecciona la impresora, se escribe la secuencia de escape y se pulsa el botón "Enviar". No importa si la impresora es serie, paralelo, usb o es una impresora compartida desde otro equipo, el único requisito es que este instalada, aunque sea como una impresora "Genérica / Solo texto".

Aquí dejo un ejemplo de algunas secuencias de escape (pueden variar de una impresora a otra):

Para que la impresora emita un pitido
\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"  
\x1B@\x0A\x0DHola mundo\x0A\x0D

Los caracteres especiales se escriben precedidos por el carácter "\" seguido de 3 cifras decimales o de "x" y dos cifras hexadecimales. Así el carácter ESC se escribe "\x1B" o "\027", y el retorno de carro "x0D" o "\013".

El código de este programa, en delphi, es el siguiente:

unit ufrmMain;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;
 
type
  TfrmMain = class(TForm)
    txtSecuencia: TEdit;
    cmbPrinters: TComboBox;
    Label1: TLabel;
    Enviar: TButton;
    Label2: TLabel;
    mnuMain: TPopupMenu;
    mnuCortar: TMenuItem;
    mnuCopiar: TMenuItem;
    mnuPegar: TMenuItem;
    mnuEliminar: TMenuItem;
    N1: TMenuItem;
    mnuSeleccionar: TMenuItem;
    N2: TMenuItem;
    mnuDeshacer: TMenuItem;
    N3: TMenuItem;
    mnuWindows: TMenuItem;
    N4: TMenuItem;
    chkOnTop: TCheckBox;
    btnMenu: TButton;
    mnuEnviar: TMenuItem;
    mnuBucle: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure EnviarClick(Sender: TObject);
    procedure mnuDeshacerClick(Sender: TObject);
    procedure mnuCortarClick(Sender: TObject);
    procedure mnuCopiarClick(Sender: TObject);
    procedure mnuPegarClick(Sender: TObject);
    procedure mnuEliminarClick(Sender: TObject);
    procedure mnuSeleccionarClick(Sender: TObject);
    procedure mnuWindowsClick(Sender: TObject);
    procedure chkOnTopClick(Sender: TObject);
    procedure btnMenuClick(Sender: TObject);
    procedure mnuBucleClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  frmMain: TfrmMain;
 
implementation
 
{$R *.dfm}
 
uses Printers, WinSpool, Clipbrd, ufrmBucle;
 
function RawToWindows(Str: String): String;
var
  i: Integer;
begin
  Result:= '<';
  while Length(Str) > 0 do
  begin
    if Copy(Str, 1, 1) = '\' then
    begin
      if Uppercase(Copy(Str, 2, 1)) = 'X' then
        Str[2]:= '$';
      if not TryStrToInt(Copy(Str, 2, 3),i) then
        Continue;
      Delete(Str, 1, 3);
    end else i:= Byte(Str[1]);
    Delete(Str,1,1);
    Result:= Result + IntToHex(i,2);
  end;
  Result:= Result + '>';
end;  
 
function WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean;
var
  PrinterHandle: THandle;
  DocInfo: TDocInfo1;
  i: Integer;
  B: Byte;
  Escritos: DWORD;
begin
  Result:= FALSE;
  if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
  try
    FillChar(DocInfo,Sizeof(DocInfo),#0);
    with DocInfo do
    begin
      pDocName:= PChar('Printer Test');
      pOutputFile:= nil;
      pDataType:= 'RAW';
    end;
    if StartDocPrinter(PrinterHandle, 1, @DocInfo) <> 0 then
    try
      if StartPagePrinter(PrinterHandle) then
      try
        while Length(Str) > 0 do
        begin
          if Copy(Str, 1, 1) = '\' then
          begin
            if Uppercase(Copy(Str, 2, 1)) = 'X' then
              Str[2]:= '$';
            if not TryStrToInt(Copy(Str, 2, 3),i) then
              Exit;
            B:= Byte(i);
            Delete(Str, 1, 3);
          end else B:= Byte(Str[1]);
          Delete(Str,1,1);
          WritePrinter(PrinterHandle, @B, 1, Escritos);
        end;
        Result:= TRUE;
      finally
        EndPagePrinter(PrinterHandle);
      end;
    finally
      EndDocPrinter(PrinterHandle);
    end;
  finally
    ClosePrinter(PrinterHandle);
  end;
end;
 
procedure TfrmMain.btnMenuClick(Sender: TObject);
var
  P: TPoint;
begin
  GetCursorPos(P);
  mnuMain.Popup(P.X, P.Y);
end;
 
procedure TfrmMain.chkOnTopClick(Sender: TObject);
begin
  if chkOnTop.Checked then
    FormStyle:= fsStayOnTop
  else
    FormStyle:= fsNormal;
end;
 
procedure TfrmMain.EnviarClick(Sender: TObject);
begin
  if cmbPrinters.ItemIndex >= 0 then
  begin
    WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],
      txtSecuencia.Text);
  end;
end;
 
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  cmbPrinters.Items.Assign(Printer.Printers);
end;
 
procedure TfrmMain.mnuCopiarClick(Sender: TObject);
begin
  txtSecuencia.CopyToClipboard;
end;
 
procedure TfrmMain.mnuCortarClick(Sender: TObject);
begin
  txtSecuencia.CutToClipboard;
end;
 
procedure TfrmMain.mnuDeshacerClick(Sender: TObject);
begin
  txtSecuencia.Undo;
end;
 
procedure TfrmMain.mnuEliminarClick(Sender: TObject);
begin
  txtSecuencia.ClearSelection;
end;
 
procedure TfrmMain.mnuPegarClick(Sender: TObject);
begin
  txtSecuencia.PasteFromClipboard;
end;
 
procedure TfrmMain.mnuBucleClick(Sender: TObject);
begin
  with TfrmBucle.Create(Self) do
  try
    ShowModal;
  finally
    Free;
  end;
end;
 
procedure TfrmMain.mnuSeleccionarClick(Sender: TObject);
begin
  txtSecuencia.SelectAll;
end;
 
procedure TfrmMain.mnuWindowsClick(Sender: TObject);
begin
  ClipBoard.AsText:= RawToWindows(txtSecuencia.SelText);
end;
 
end.

El código lo puedes bajar de aquí, y el programa ya compilado de aquí.

Vaya, tanto tiempo sin

Vaya, tanto tiempo sin escribir nada, se ve que has estado ocupado.
Saluditos.

Que buen aporte... gracias

Que buen aporte... gracias :)

Hey amigo. Me da gusto que

Hey amigo.

Me da gusto que hayas publicado algo mas en esta página :)

Muy intersante forma de imprimir, yo normalmente uso el canvas, así que probaré tu code.

Salud OS

Muchas gracias, es un buen

Muchas gracias, es un buen aporte, yo trabajo mucho con impresoras TM-U de Epson.

Hola! gran trabajo, nos ira

Hola!
gran trabajo, nos ira perfecto para probar las impresoras TM de Epson.
Solo tengo una duda:
intento imprimir un logotipo gráfico previamente grabado en la memoria de la impresora y no lo consigo.
Los codigos ESC que tengo para esto son:
para la EPSON TM-T88, T88II y T88III : 28,112,1,0
para la EPSON TM-T88IV : 29,40,76,6,0,48,69,x,x,1,1 donde x es el numero que sale en el programa de carga del logo.
Saludos.

Yo para Epson tengo la

Yo para Epson tengo la siguiente secuencia:

\x1C\x70\x01\x30\x0A\x0D

Como ves solo se diferencia de la tuya en que, en vez de terminar en 0 termina en 30h que se corresponde con el valor ASCII de "0". Ademas he añadido un "retorno de carro" al final, a lo mejor no es necesario pero tampoco hace daño.

En cuanto a la TM-T88IV creo que sirve la misma secuencia que para las demás TM-T88, pruebalo.

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.