[Java] Utiliser ZXing pour générer un QR Code

Nous avions vu il y a très longtemps qu’il existait une librairie spécifique appelée Zebra Crossing, ou encore ZXing, en open-source. Elle permet de gérer (lire ou générer) différents formats de codes-barres en 2D : code 128, EAN8/13, Data Matrix, UPC-A/E, et même des QR Code (« Quick Response Code« ).

Il fait partie de la dernière génération, même s’il n’est pas nouveau, car il peut contenir bien plus de données qu’un simple code au standard UPC par exemple. Selon sa version, sa gestion de la correction d’erreur et le type de données, il peut stocker entre 1.817 (Kanji/Kana) et 7.089 caractères (numérique seulement). Pour de l’alphanumérique, on ne peut dépasser 4.296 caractères.

Pour générer un simple code avec des données reçues par un programme externe ou que l’on stocke dans une chaine, voici comment il faut procéder. On va générer un simple QR Code de 300×300 pixels, sur base d’une chaine qu’on ré-encode dans un character set ISO-8859-1. Si vous avez une solution plus fiable, plus complète ou plus performante, même avec d’autres librairies, n’hésitez pas à partager.

Comment faire?

1) Utilisez au minimum les packages suivants. L’un d’eux, « MatrixToImageWriter« , nous servira à convertir le code en image (par exemple, dans le format PNG). « QRCodeWriter » nous permet d’écrire et de stocker les données dans notre code. Vous devriez trouver la documentation nécessaire sur la page officielle de ce projet.

import com.google.zxing.BarcodeFormat; 
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWrite;

2) Stocker les données dans une chaine classique (String). Dans mon exemple, j’ai ouvert un fichier avec un BufferedReader (qui demande un objet de type FileReader à sa création), et j’ai lu ligne par ligne grâce à la fonction readLine().

3) Une fois votre chaine complète, il va falloir en récupérer le contenu. Pour cela, on récupère les caractères sous forme d’un tableau de bytes (getBytes () sur la chaine créée). Ensuite, on crée une nouvelle chaine de données, qu’on appellera ici « data », en lui passant en paramètres le tableau de bytes, ainsi que le character set.

data = new String(b, "ISO-8859-1");

4) Nous allons déclarer un nouvel objet de la classe BitMatrix, qu’on appellera « matrix« , ainsi qu’initialiser un objet QRCodeWriter en une variable « qr« . On appelle ensuite la fonction « encode() » d’objet « qr« , qui nous retournera un objet de type BitMatrix. Elle requiert 4 paramètres : la chaîne qui contient les données, le format du code-barres (constante), et la taille en pixels (largeur/hauteur). Il faudra ensuite l’exporter, car il n’est pas encore vraiment « exploitable » en l’état.

BitMatrix matrix; 
QRCodeWriter qr = new QRCodeWriter(); 
matrix = qr.encode(data,
  BarcodeFormat.QR_CODE, 300, 300
);

5) Pour exporter, nous devons utiliser une fonction de la classe MatrixToImageWriter, qui est writeToStream(). Elle nécessite trois paramètres : le code-barres à convertir (objet BitMatrix), le format d’image (chaine de caractères, qui contiendra par exemple « png« ), et enfin le fichier destination (sous forme d’objet FileOutputStream).

MatrixToImageWriter.writeToStream( 
  matrix, 
  imageFormat, 
  fi 
);

6) N’oubliez pas de fermer votre fichier grâce à la fonction close(). Tout objet doit être correctement libéré ou fermé, c’est fondamental.7) Ne prenez pas à la légère les traitements d’exception : ils ont une place importante dans votre code, donc utilisez-les ! Les erreurs doivent toujours être gérées pour afficher un message adéquat aux utilisateurs de votre logiciel.

Vous obtenez alors un code QR : pour le vérifier, il vous faudra un scanner qui permet de lire ce type d’image, ou même un smartphone récent, disposant d’une bonne caméra, et fonctionnant sous Windows Phone, Android ou iOS. En effet, on trouve pour ces systèmes, une pléthore d’applications qui permet la lecture du contenu. A vos téléphones !

2 commentaires sur « [Java] Utiliser ZXing pour générer un QR Code »

  1. D'après une réponse sur les groupes Google, ZXing ne permettrait pas de faire cela. groups.google.com/forum/?fromgroups=#!topic/zxing/Yb0HmcUCTX8

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *