Hace unos dias me topé con una aplicación la cual requería impresión de unos labels y códigos de barra. La impresora era la famosa Zebra la cual es super versátil y el cual ha desarrollado la versión 2 de su propio lenguage para impresión. ZPL 2.

Básicamente la impresora acepta comandos, no un stream de datos como estamos acostumbrados a enviar en Java. Veamos un ejemplo sencillo de código ZPL.

^XA
^FO10,0^ARN,11,7^FD SOME TEXT ^FS
^FO300,0^ARN,11,7^FD SOME VALUE ^FS
^FO10,35^ARN,11,7^FD SOME TEXT ^FS
^FO300,35^ARN,11,7^FD SOME VALUE ^FS
^FO10,70^ARN,11,7^FD SOME CODE ^FS
^FO10,115^ARN,11,7^BCN,60,Y,Y,N^FD 23749237439827 ^FS
^XZ

Una vez que tenemos nuestro código ZPL definido (aca pueden ver como escribir ZPL) vamos a mandar un comando de impresión directamente a través de Java. Vale recordar que las impresoras Zebra se instalan como cualquier otra impresora (LPT1 o USB). Aquí el código Java.

// aca obtenemos la printer default
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();

String zplCommand = "^XA\n" +
"^FO10,0^ARN,11,7^FD SOME TEXT ^FS\n" +
"^FO300,0^ARN,11,7^FD SOME VALUE ^FS\n" +
"^FO10,35^ARN,11,7^FD SOME TEXT ^FS\n" +
"^FO300,35^ARN,11,7^FD SOME VALUE ^FS\n" +
"^FO10,70^ARN,11,7^FD SOME CODE ^FS\n" +
"^FO10,115^ARN,11,7^BCN,60,Y,Y,N^FD 23749237439827 ^FS\n" +
"^XZ";

// convertimos el comando a bytes
byte[] by = zplCommand.getBytes();
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
Doc doc = new SimpleDoc(by, flavor, null);

// creamos el printjob
DocPrintJob job = printService.createPrintJob();

// imprimimos
job.print(doc, null);

Así de simple podemos mandar cualquier comando a las impresoras Zebra que soporten ZPL 1 y ZPL 2. Si buscan en internet ZPL busquen ZPL Zebra porque ZPL tambien es un lenguage de programación para aplicaciones científcas.