Saludos colegas,
Tengo que lograr generar una etiqueta con codigos de barras en una impresora
Zebra GC420, pero no tengo suerte con las pruebas.
Entiendo que hubo varios foros tratando temas similares, pero en ninguno hay una solución factible.
Primero, este dispositivo se comunica por puerto USB, que es como el viejo Serial, pero tiene asignación dinamica por parte del SO (USB001, USB002,...) con lo cual es dificil determinar en donde está ubicada la impresora. Por ahora, yo trato de ubicarla mediante el "nombre" del dispositivo, haciendo un llamado a la funcion
Printer de la unit Printers, ago asi:
Código Delphi
[-]unit MiPrograma;
interface
uses
..., Printers,...
procedure TForm1.IniciandoModulo();
begin
ComboBox1.Items.Clear;
ComboBox1.Items.AddStrings(Printer.Printers);
end;
Segundo problema, es que a mi me pasan un archivo TXT con toda la instruccion EPL necesaria. Aqui un ejemplo del txt :
Código:
I8,A,001
Q508,024
q863
rN
S3
D7
ZT
JF
OD
R25,0
f100
N
B200,189,0,E30,4,8,130,B,"3836556465461"
A99,31,0,4,6,6,N,"Esto es un ejemplo"
P1
Puede que este archivo sea incorrecto, porque en otros foros he visto que las secuencias deben comenzar con el prefijo "^" que aqui está ausente, pero, el driver de la impresora (Dispositivo de impresion->Propiedades) permite cargar y enviar un fichero externo y al cargar ese fichero lo imprime bien. Lo que desconozco es si antes lo pre-procesa de alguna forma.
La rutina de impresión se basa en una rutina ya conocida para enviar comandos RAW (muy utilizado con impresoras para POS) y es la siguiente:
Código Delphi
[-]
procedure TForm1.Imprimir();
var
fTextFile, fPrnFile:TextFile;
sPRN, s, s1: string;
begin
TRY
s:= GetCurrentDir;
ChDir(s);
OpenDialog1.InitialDir:= s;
EXCEPT
try
s:= ExtractFilePath(paramStr(0));
ChDir(s);
OpenDialog1.InitialDir:= s;
except
s:= PathInicial; ChDir(s);
OpenDialog1.InitialDir:= s;
end;
END;
if OpenDialog1.Execute then
begin
try
sPRN:= Trim(ComboBox1.Text);
AssignFile(fTextFile, OpenDialog1.FileName );
Reset(fTextFile);
try
While Not Eof(fTextFile) Do
begin
ReadLn(fTextFile, s);
WriteRawDataToPrinter(sPRN, s); s1:= s1 + s;
end;
except
on E:Exception do MessageDlg(E.Message, mtWarning, [mbOk],0);
end;
finally
CloseFile(fTextFile);
end;
end;
end;
function WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean;
var
PrinterHandle: THandle;
DocInfo: TDocInfo1;
i: Integer;
B: Byte;
Retorna: DWORD;
begin
Result:= FALSE;
if OpenPrinter(PChar(PrinterName), PrinterHandle, nil)
then try
FillChar(DocInfo,Sizeof(DocInfo),#0);
with DocInfo do
begin
pDocName:= PChar('Etiqueta...');
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, Retorna);
end;
Result:= TRUE;
finally
EndPagePrinter(PrinterHandle);
end;
finally
EndDocPrinter(PrinterHandle);
end;
finally
ClosePrinter(PrinterHandle);
end;
end;
La cosa es que con esto la impresora ni se inmuta...

Alguna sugerencia al formato del archivo; a la forma de enviar la secuencia y/o al código en general?