• ZPL 2 Para Impresoras Zebra en Java

    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.

    Tags:

8 Comments


  1. Diego says:

    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

  2. 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.

  3. Fernando says:

    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

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

  5. Fernando says:

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

  6. 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.

  7. Fernando says:

    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());
    }
    }

  8. Fernando says:

    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 comment