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.

Categories: java

Rodrigo Asensio

Apasionado por la tecnología

8 Comments

Diego · October 13, 2011 at 12:58 pm

Muy bueno tu post. Estoy trabajando con la misma impresora y me re sirvió. Pero también me pidieron hacer una vista previa de la impresión. Tenés idea de como formarla con el código zpl?

Me fije en los manuales que vienen con la impresora sobre zpl y zbi developer pero se me dificulta bastante.

Muchas gracias

Rodrigo Asensio · October 13, 2011 at 1:06 pm

Yo no se como, pero por lo que estuve leyendo no hay una tool o API para hacer eso. Habria que hacerla desde cero teniendo la spec de Zebra en mano.

Fernando · October 16, 2011 at 8:08 pm

Hola, soy nuevo en estoy y trato de ejecutar lo que me indicas, veo algo en la cola de impresion pero no imprime nada

que peudo hacer
o donde puede estar mi error

Rodrigo Asensio · October 16, 2011 at 8:14 pm

Deberias ver que tira el stdout, quiza tenes un error.

Fernando · October 17, 2011 at 11:04 pm

Estimado
no presenta ningun error, veo en la cola de impresion que algo se manda a imprimir y la impresora como si nada

Rodrigo Asensio · October 17, 2011 at 11:18 pm

Lamentablemente la informacion que me das es nula. Deberias poder debuggear tu programa y darte cuenta como se comporta. No te puedo ayudar si no tengo ninguna informacion.

Fernando · October 18, 2011 at 11:43 am

este es mi programa, y no me da un error

static public void main(String args[]) {
try {
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”;

byte[] by = zplCommand.getBytes();
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;

PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
pras.add(new Copies(1));

PrintService pss[] = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.GIF, pras);

if (pss.length == 0)
throw new RuntimeException(“No printer services available.”);

PrintService ps = pss[0];
System.out.println(“Printing to ” + ps);
System.out.println(“by ” + by);
DocPrintJob job = ps.createPrintJob();

DocFlavor.INPUT_STREAM.GIF, null);

job.print(doc, pras);

}
catch (PrintException pe) {
pe.printStackTrace();
System.out.println(pe.getMessage());
}
}

Fernando · October 19, 2011 at 10:01 am

Gracias

Pero al parecer las Zebra no son todas iguales yo tengo la Zebra TLP 2844 y esta tiene otro formato de comandos

El que me funciono fue el siguiente…

// String s = “R0,0\n” + // Set Reference Point
// “N\n” + // Clear Image Buffer
// “ZB\n” + // Print direction (from Bottom of buffer)
// “Q122,16\n” + // Set label Length and gap
// “A160,2,0,3,1,1,N,\”DATA: ” + dateString + ” – CARUGATE\”\n” +
// “B160,30,0,1A,2,7,50,N,\”612041600021580109\”\n” +
// “A160,92,0,1,1,1,N,\”AIA AGRICOLA IT.ALIMENT.S – 594679/VR \”\n” +
// “P1\n”; // Print content of buffer, 1 label

Leave a Reply

Your email address will not be published. Required fields are marked *