Java Codigos de Barra con ZXing

By | 02/16/2017

El código de barra QR Code (Quick Response Code) es capaz de almacenar muchos más datos en menos tamaño en comparación con otros códigos de barra.

Veamos con un breve ejemplo utilizando ZXing como crear códigos QR. Este ejemplo también te servirá para cualquier otro tipo de código soportado.

Importar dependencia ZXing con maven

<dependencies>
   <dependency>
       <groupId>com.google.zxing</groupId>
       <artifactId>core</artifactId>
       <version>3.3.0</version>
       <type>pom</type>
   </dependency>

   <dependency>
       <groupId>com.google.zxing</groupId>
       <artifactId>javase</artifactId>
       <version>3.3.0</version>
   </dependency>

</dependencies>

Como escribir código QR Code con ZXing

Debes utilizar la clase BitMatrix que recibirá el texto, formato y tamaño de la imagen. Luego te valdrás de MatrixToImageWriter para escribir este BitMatrix en un OutputStream.

private static void writeQR(String text, String pathname) throws WriterException, IOException {

   int width = 600;
   int height = 400;

   String imageFormat = "png"; // "jpeg" "gif" "tiff"

   BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, width, height);
   FileOutputStream outputStream = new FileOutputStream(new File(pathname));
   MatrixToImageWriter.writeToStream(bitMatrix, imageFormat, outputStream);

}

Como leer código QR Code con ZXing

Aquí debes utilizar BinaryBitmap y MultiFormatReader, esta última una clase que intentará decodificar el qr code del bitmap (nuestra imagen qr) y te devolverá el string resultante.

private static String readQR(String pathname) throws FormatException, ChecksumException, NotFoundException, IOException {

   InputStream qrInputStream = new FileInputStream(pathname);
   BufferedImage qrBufferedImage = ImageIO.read(qrInputStream);

   LuminanceSource source = new BufferedImageLuminanceSource(qrBufferedImage);
   BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
   Reader reader = new MultiFormatReader();
   Result stringBarCode = reader.decode(bitmap);

   return stringBarCode.getText();
}

Cómo leer y escribir código QR Code

El código completo te queda de esta manera

public class QRCodeExample {

   public static void main(String[] arg) {

       String pathname = "qrcode_example.png";
       String textToQr = "La imaginación es más importante que el conocimiento";

       try {
           writeQR(textToQr, pathname);
           String text = readQR(pathname);
           System.out.print(text);

       } catch (Exception e) {
           e.printStackTrace();
       }
   }

   private static void writeQR(String text, String pathname) throws WriterException, IOException {

       int width = 600;
       int height = 400;

       String imageFormat = "png"; // "jpeg" "gif" "tiff"

       BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, width, height);
       FileOutputStream outputStream = new FileOutputStream(new File(pathname));
       MatrixToImageWriter.writeToStream(bitMatrix, imageFormat, outputStream);

   }

   private static String readQR(String pathname) throws FormatException, ChecksumException, NotFoundException, IOException {

       InputStream qrInputStream = new FileInputStream(pathname);
       BufferedImage qrBufferedImage = ImageIO.read(qrInputStream);

       LuminanceSource source = new BufferedImageLuminanceSource(qrBufferedImage);
       BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
       Reader reader = new MultiFormatReader();
       Result stringBarCode = reader.decode(bitmap);

       return stringBarCode.getText();
   }

}

Otros códigos de barra soportados

Viendo el enum BarcodeFormat vemos estos códigos de barra soportados por ZXing

public enum BarcodeFormat {
    AZTEC, CODABAR, CODE_39, CODE_93, CODE_128, DATA_MATRIX, EAN_8, EAN_13, ITF, MAXICODE, PDF_417, QR_CODE, RSS_14, RSS_EXPANDED, UPC_A, UPC_E, UPC_EAN_EXTENSION;
}

Referencias:
https://github.com/zxing/zxing
https://zxing.github.io/zxing/project-info.html

Descarga este código completo

Compartir esto:

4 thoughts on “Java Codigos de Barra con ZXing

  1. Andy

    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.*;

    esos imports pertenecen a alguna librería?

    Reply
    1. Gustavo Post author

      Hola. Son propias de la api de java. saludos!

      Reply
  2. Mario

    Hola, puedo leer perfecto qr pero no logro leer los ITF o 128 ¿vos pudiste leer estos de un archivo? Se necesita alguna configuración especial? Por más que use ITF Reader no logro leer estos de una factura.

    Reply
    1. Gustavo Post author

      No no se necesita ninguna configuracion especial. Debes asegurarte que la imagen que lees es 100% barcode, que no tenga ‘algo sucio’.

      En algunos pocos casos he tenido que agregar un ‘hints’ de esta forma:
      Map hints = new EnumMap(DecodeHintType.class);
      hints.put(DecodeHintType.PURE_BARCODE, Boolean.FALSE);

      Reader reader = new MultiFormatReader();
      Result stringBarCode = reader.decode(bitmap, hints);

      Si ya conoces que el codigo que viene es ITF
      Reader reader = new ITFReader();
      Result stringBarCode = reader.decode(bitmap, hints);

      espero te sirva

      Reply

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *