Génération de codes à barres et de codes QR en Java

1. Vue d'ensemble

Les codes à barres sont utilisés pour transmettre des informations visuellement. Nous fournirons très probablement une image de code-barres appropriée dans une page Web, un e-mail ou un document imprimable.

Dans ce didacticiel, nous allons voir comment générer les types de codes à barres les plus courants en Java.

Tout d'abord, nous allons découvrir les éléments internes de plusieurs types de codes à barres. Ensuite, nous explorerons les bibliothèques Java les plus populaires pour générer des codes à barres. Enfin, nous verrons comment intégrer des codes-barres dans notre application en les diffusant à partir d'un service Web utilisant Spring Boot.

2. Types de codes-barres

Les codes-barres codent des informations telles que les numéros de produit, les numéros de série et les numéros de lot. En outre, ils permettent à des parties comme les détaillants, les fabricants et les fournisseurs de transport de suivre les actifs tout au long de la chaîne d'approvisionnement.

Nous pouvons regrouper les nombreuses symbologies de codes à barres différentes en deux catégories principales:

  • codes-barres linéaires
  • Codes-barres 2D

2.1. Codes UPC (Universal Product Code)

Les codes UPC sont parmi les codes à barres 1D les plus couramment utilisés, et nous les trouvons principalement aux États-Unis.

Le code UPC-A est un code uniquement numérique qui contient 12 chiffres : un numéro d'identification du fabricant (6 chiffres), un numéro d'article (5 chiffres) et un chiffre de contrôle. Il existe également un code UPC-E qui n'a que 8 chiffres et est utilisé pour les petits paquets.

2.2. Codes EAN

Les codes EAN sont connus dans le monde entier sous le nom de numéro d'article européen et de numéro d'article international. Ils sont conçus pour la numérisation au point de vente. Il existe également quelques variantes différentes du code EAN, notamment EAN-13, EAN-8, JAN-13 et ISBN.

Le code EAN-13 est la norme EAN la plus couramment utilisée et est similaire au code UPC. Il est composé de 13 chiffres - un «0» en tête suivi du code UPC-A.

2.3. Le code 128

Le code-barres Code 128 est un code linéaire compact à haute densité utilisé dans les secteurs de la logistique et du transport pour la commande et la distribution. Il peut encoder les 128 caractères ASCII et sa longueur est variable.

2.4. PDF417

PDF417 est un code-barres linéaire empilé composé de plusieurs codes-barres 1D empilés les uns sur les autres. Par conséquent, il peut utiliser un scanner linéaire traditionnel.

On peut s'attendre à le trouver sur une variété d'applications telles que les voyages (cartes d'embarquement), les cartes d'identité et la gestion des stocks.

PDF417 utilise la correction d'erreur Reed-Solomon au lieu de chiffres de contrôle. Cette correction d'erreur permet au symbole de subir des dommages sans entraîner de perte de données. Cependant, sa taille peut être volumineuse - 4 fois plus grande que les autres codes à barres 2D tels que Datamatrix et QR Codes.

2.5. Codes QR

Les codes QR sont en train de devenir les codes-barres 2D les plus reconnus dans le monde. Le grand avantage du code QR est que nous pouvons stocker de grandes quantités de données dans un espace limité.

Ils utilisent quatre modes d'encodage normalisés pour stocker efficacement les données:

  • numérique
  • alphanumérique
  • octet / binaire
  • kanji

De plus, ils sont de taille flexible et sont facilement numérisés à l'aide d'un smartphone. Semblable à PDF417, un code QR peut résister à certains dommages sans entraîner de perte de données.

3. Bibliothèques de codes à barres

Nous allons explorer plusieurs bibliothèques:

  • Barbecue
  • Code-barres4j
  • ZXing
  • QRGen

Barbecue est une bibliothèque Java open source qui prend en charge un vaste ensemble de formats de codes à barres 1D. En outre, les codes-barres peuvent être générés au format PNG, GIF, JPEG et SVG.

Barcode4j est également une bibliothèque open source. De plus, il propose des formats de codes à barres 2D - comme DataMatrix et PDF417 - et plus de formats de sortie. Le format PDF417 est disponible dans les deux bibliothèques. Mais, contrairement à Barcode4j, Barbecue le considère comme un code à barres linéaire.

ZXing («zebra crossing») est une bibliothèque de traitement d'images de codes-barres 1D / 2D open source et multi-format implémentée en Java, avec des ports vers d'autres langages. Il s'agit de la bibliothèque principale qui prend en charge les codes QR en Java.

La bibliothèque QRGen offre une API de génération de QRCode simple construite sur ZXing. Il fournit des modules séparés pour Java et Android.

4. Génération de codes-barres linéaires

Créons un générateur d'images de codes-barres pour chaque bibliothèque et paire de codes-barres. Nous récupérerons l'image au format PNG, mais nous pourrions également utiliser d'autres formats comme GIF ou JPEG.

4.1. Utilisation de la bibliothèque de barbecue

As we'll see, Barbecue provides the simplest API for generating barcodes. We only need to provide the barcode text as minimal input. But we could optionally set a font and a resolution (dots per inch). Regarding the font, we can use it to display the barcode text under the image.

First, we need to add the Barbecue Maven dependency:

 net.sourceforge.barbecue barbecue 1.5-beta1 

Let's create a generator for an EAN13 barcode:

public static BufferedImage generateEAN13BarcodeImage(String barcodeText) throws Exception { Barcode barcode = BarcodeFactory.createEAN13(barcodeText); barcode.setFont(BARCODE_TEXT_FONT); return BarcodeImageHandler.getImage(barcode); }

We can generate images for the rest of the linear barcode types in a similar manner.

We should note that we do not need to provide the checksum digit for EAN/UPC barcodes, as it is automatically added by the library.

4.2. Using the Barcode4j Library

Let's start by adding the Barcode4j Maven Dependency:

 net.sf.barcode4j barcode4j 2.1 

Likewise, let's build a generator for an EAN13 barcode:

public static BufferedImage generateEAN13BarcodeImage(String barcodeText) { EAN13Bean barcodeGenerator = new EAN13Bean(); BitmapCanvasProvider canvas = new BitmapCanvasProvider(160, BufferedImage.TYPE_BYTE_BINARY, false, 0); barcodeGenerator.generateBarcode(canvas, barcodeText); return canvas.getBufferedImage(); }

The BitmapCanvasProvider constructor takes several parameters: resolution, image type, whether to enable anti-aliasing, and image orientation. Also, we don't need to set a font because the text under the image is displayed by default.

4.3. Using the ZXing Library

Here, we need to add two Maven dependencies: the core image library and the Java client:

 com.google.zxing core 3.3.0   com.google.zxing javase 3.3.0 

Let's create an EAN13 generator:

public static BufferedImage generateEAN13BarcodeImage(String barcodeText) throws Exception { EAN13Writer barcodeWriter = new EAN13Writer(); BitMatrix bitMatrix = barcodeWriter.encode(barcodeText, BarcodeFormat.EAN_13, 300, 150); return MatrixToImageWriter.toBufferedImage(bitMatrix); }

Here, we need to provide several parameters as input, such as a barcode text, a barcode format, and barcode dimensions. Unlike the other two libraries, we must also add the checksum digit for EAN barcodes. But, for UPC-A barcodes, the checksum is optional.

Moreover, this library will not display barcode text under the image.

5. Generating 2D Barcodes

5.1. Using the ZXing Library

We're going to use this library to generate a QR Code. The API is similar to that of the linear barcodes:

public static BufferedImage generateQRCodeImage(String barcodeText) throws Exception { QRCodeWriter barcodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = barcodeWriter.encode(barcodeText, BarcodeFormat.QR_CODE, 200, 200); return MatrixToImageWriter.toBufferedImage(bitMatrix); }

5.2. Using the QRGen Library

The library is no longer deployed to Maven Central, but we can find it on jitpack.io.

First, we need to add the jitpack repository and the QRGen dependency to our pom.xml:

  jitpack.io //jitpack.io     com.github.kenglxn.qrgen javase 2.6.0  

Let's create a method that generates a QR Code:

public static BufferedImage generateQRCodeImage(String barcodeText) throws Exception { ByteArrayOutputStream stream = QRCode .from(barcodeText) .withSize(250, 250) .stream(); ByteArrayInputStream bis = new ByteArrayInputStream(stream.toByteArray()); return ImageIO.read(bis); }

As we can see, the API is based on the Builder pattern and it provides two types of output: File and OutputStream. We can use the ImageIO library to convert it to a BufferedImage.

6. Building a REST Service

Now we have a choice of barcode library to use, let's look at how to serve barcodes from a Spring Boot web service.

We'll start with a RestController:

@RestController @RequestMapping("/barcodes") public class BarcodesController { @GetMapping(value = "/barbecue/ean13/{barcode}", produces = MediaType.IMAGE_PNG_VALUE) public ResponseEntity barbecueEAN13Barcode(@PathVariable("barcode") String barcode) throws Exception { return okResponse(BarbecueBarcodeGenerator.generateEAN13BarcodeImage(barcode)); } //... }

Also, we need to manually register a message converter for BufferedImage HTTP Responses because there is no default:

@Bean public HttpMessageConverter createImageHttpMessageConverter() { return new BufferedImageHttpMessageConverter(); }

Finally, we can use Postman or a browser to view the generated barcodes.

6.1. Generating a UPC-A Barcode

Let's call the UPC-A web service using the Barbecue library:

[GET] //localhost:8080/barcodes/barbecue/upca/12345678901

Here's the result:

6.2. Generating an EAN13 Barcode

Similarly, we're going to call the EAN13 web service:

[GET] //localhost:8080/barcodes/barbecue/ean13/012345678901

And here's our barcode:

6.3. Generating a Code128 Barcode

In this case, we're going to use the POST method. Let's call the Code128 web service using the Barbecue library:

[POST] //localhost:8080/barcodes/barbecue/code128

We'll provide the request body, containing the data:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Let's see the result:

6.4. Generating a PDF417 Barcode

Here, we're going to call the PDF417 web service, which is similar to Code128:

[POST] //localhost:8080/barcodes/barbecue/pdf417

We'll provide the request body, containing the data:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

And here's the resulting barcode:

6.5. Générer un code-barres QR Code

Appelons le service Web QR Code à l'aide de la bibliothèque ZXing:

[POST] //localhost:8080/barcodes/zxing/qrcode

Nous fournirons le corps de la requête, contenant les données:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Voici notre code QR:

Ici, nous pouvons voir la puissance des codes QR pour stocker de grandes quantités de données dans un espace limité.

7. Conclusion

Dans cet article, nous avons appris à générer les types de codes-barres les plus courants en Java.

Dans un premier temps, nous avons étudié les formats de plusieurs types de codes barres linéaires et 2D. Ensuite, nous avons exploré les bibliothèques Java les plus populaires pour les générer. Bien que nous ayons essayé quelques exemples simples, nous pouvons étudier les bibliothèques plus avant pour des implémentations plus personnalisées.

Enfin, nous avons vu comment intégrer les générateurs de codes-barres dans un service REST, et comment les tester.

Comme toujours, l'exemple de code de ce didacticiel est disponible à l'adresse over sur GitHub.