[Métodos] Generar código de barras y Códigos QR - Generación de códigos QR con ZXing


Generar código de barras y Códigos QR - Generación de códigos QR con ZXing



Los códigos QR o Quick Response Code son simple códigos de barras pero en 2 dimensiones que pueden ser leidos o escaneados por una cámara, como la de un teléfono móvil.

Un código QR consiste en cuadrados negros dispuestos en una cuadrícula cuadrada sobre un fondo blanco. Existen varias variantes de códigos QR que dependen del tamaño de los símbolos, el diseño, la codificación y la estructura.

Zxing es una librería para java y android que se pronuncia "Zebra Crossing" como el cruce peatonal de Abbey Road

Procedimiento:

Hay que agregar las dependencias de zxing-core y zxing-javase a nuestro propio proyeto

Con maven

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

Con gradel

 compile "com.google.zxing:core:3.4.0"
 compile 'com.google.zxing:javase:3.4.0'
 

Manualmente añadir los jar al classpath descargandolos desde maven central


El siguiente paso es poner manos al código:

  • Crear una instancia de com.google.zxing.qrcode.QRCodeWriter
  • Obtener un BitMatrix a través de encodear con el objeto QRCodeWriter, pasando el texto, el tipo de codigo y un alto y ancho
  • Por último escribir en un archivo el bitmatrix a través de método MatrixToImageWriter.writeToPath definiendo la extensión de la imagen y el path.
 private static void generateQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException {
  QRCodeWriter qrCodeWriter = new QRCodeWriter();
  BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);

  Path path = FileSystems.getDefault().getPath(filePath);
  MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
 }
 

Asegurarse de que el directorio del parametro filePath exista, porque no lo crea y lanza una excepción.

Ejecutando en un main normal de toda la vida, obtendremos:

public static void main(String[] args) throws Exception {
    generateQRCodeImage("Hola juli =)", 350, 350, "D:/dev/qrcodes/holajuli.png");
}

Resultado

[Métodos] Generar pdf con Jasper


Crear un reporte con Jasper Report



JasperReports es una biblioteca de creación de informes que tiene la habilidad de entregar contenido enriquecido al monitor, a la impresora o a ficheros PDF, HTML, XLS, CSV y XML... y no lo digo yo sino la wikipedia

Está escrito completamente en Java, su propósito principal es ayudar a crear documentos de tipo páginas, es de bajo licencia libre GNU, por lo que es Software libre.

Una de la más notoria ventaja es el diseño de sus templates a través de una sólida interfaz visual, componentes drag and drop para realizar el template xml por nosotros, además de que con un click realiza la compilación.




iReport Designer (v5.6.0) página de descarga



Nota mental: La ultima versión del iReport es la 5.6.0 del 28-May-2014 y al parecer solo funciona con java 7 en la variable de entorno JAVA_HOME. Pueden ser cambiado desde las configuraciones en la instalación, generalmente C:\Program Files (x86)\Jaspersoft\iReport-5.5.1\etc\ireport.conf o visitando la documentación

Jaspersoft Studio Eclipse plugin página del marketplace





La manera en que trabajar es la siguiente:

  • Se escribe un template xml con la extension .jrxml
  • Se compila con el motor de jasper para generar un archivo de extension .jasper
  • Se procesa junto a una fuente de datos: Collection de java o una conexion a la base de datos para obtener un ResultSet
  • Se obtiene como resultado un reporte! :D


Procedimiento

Crear un proyeto maven saltéandose la elección del arquetipo para luego agregar las dependencias a utilizar en el pom.xml:

 <!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
 <dependency>
  <groupId>net.sf.jasperreports</groupId>
  <artifactId>jasperreports</artifactId>
  <version>6.9.0</version>
 </dependency>
 

Tras hacer esto obtendremos un error, de que no encuentra la librería de itext.jar:2.1.7.js6, el problema es que en maven central no existe esa version sino una itext.jar:2.1.7.js2 y agregando esa ya maven es feliz

 <dependency>
  <groupId>com.lowagie</groupId>
  <artifactId>itext</artifactId>
  <version>2.1.7.js2</version>
 </dependency>
 
Adicionalmente vamos a tener que declarar el repositorio jasperreports y sus librerias de terceros ya que la versión de itext que espera es la versión 2.1.7.js4 y será desde aqui donde se tomen las librerias necesarias:

 <repositories>
  <repository>
   <id>jasperreports</id>
   <url>http://jasperreports.sourceforge.net/maven2</url>
  </repository>
  <repository>
   <id>jaspersoft-third-party</id>
   <url>http://jaspersoft.artifactoryonline.com/jaspersoft/third-party-ce-artifacts/</url>
  </repository>
 </repositories>
 

Con cualquiera de las opciones disponibles para crear los jrxml, se procede a crear un reporte como a uno más le guste.



Para empezar podemos arrastrar un static text y escribir el típico hola mundo, hello world, etc.


Nota mental: Al usar el iReport 'por defecto' tiende a usar el lenguaje como groovy dando exceptions en la compilación. Hay que editarlo desde las properties del reporte en la solapa de Report Inspector o bien remover el attributo language="groovy" en etiqueta root jasperReport luego de todas las declaraciones de esquemas. Ah y de paso agregar whenNoDataType="AllSectionsNoDetail" para que no evite no generar el pdf cuando no hay un fuente de datos para completar los mismos.

El archivo creado deberá ser dejado en la carpeta src/main/resources para encontrarlo a tiro.

 public static void imprime() throws JRException, IOException {
  System.out.println("obtenemos la plantilla JRXML como un inputstream");
  InputStream template = JasperRunnable.class.getResourceAsStream("/reporte.xml");

  System.out.println("compilamos el reporte desde el stream");
  JasperReport report = JasperCompileManager.compileReport(template);

  System.out.println("obtenemos la fuente de datos");
  Map<String, Object> sourceData = new HashMap<>();

  System.out.println("llenamos el reporte en un print object, con la fuente de datos");
  JasperPrint print = JasperFillManager.fillReport(report, sourceData);

  File pdf = File.createTempFile("output.", ".pdf");
  System.out.println("Lo exportamos a " + pdf.getAbsolutePath());
  JasperExportManager.exportReportToPdfStream(print, new FileOutputStream(pdf));
 }
 
La extensión puede ser tanto xml como jrxml dado que son simple archivos de texto plano con diferentes extension, pero para el caso es indistinto.

Ejecutando esta función en la clase main obtendremos una salida de consola como la siguiente:

obtenemos la plantilla JRXML como un inputstream
compilamos el reporte desde el stream
obtenemos la fuente de datos
llenamos el reporte en un print object, con la fuente de datos
Lo exportamos a C:\Users\Imago\AppData\Local\Temp\output.5354953787413152033.pdf

Dandonos como resultado, el mas simple de los pdf:



Es lo más básico de lo más básico que puede ofrecernos jasper report, pero es sólo el inicio.