Generieren von Barcodes und QR-Codes in Java

1. Übersicht

Barcodes werden verwendet, um Informationen visuell zu vermitteln. Wir werden höchstwahrscheinlich ein geeignetes Barcode-Bild in einer Webseite, E-Mail oder einem druckbaren Dokument bereitstellen.

In diesem Tutorial werden wir uns ansehen, wie die häufigsten Arten von Barcodes in Java generiert werden.

Zunächst lernen wir die Interna verschiedener Arten von Barcodes kennen. Als Nächstes untersuchen wir die beliebtesten Java-Bibliotheken zum Generieren von Barcodes. Schließlich werden wir sehen, wie Barcodes in unsere Anwendung integriert werden, indem sie mithilfe von Spring Boot über einen Webdienst bereitgestellt werden.

2. Arten von Barcodes

Barcodes codieren Informationen wie Produktnummern, Seriennummern und Chargennummern. Darüber hinaus ermöglichen sie Parteien wie Einzelhändlern, Herstellern und Transportanbietern, Vermögenswerte über die gesamte Lieferkette hinweg zu verfolgen.

Wir können die vielen verschiedenen Barcode-Symbologien in zwei Hauptkategorien einteilen:

  • lineare Barcodes
  • 2D-Barcodes

2.1. UPC-Codes (Universal Product Code)

UPC-Codes sind einige der am häufigsten verwendeten 1D-Barcodes, und wir finden sie hauptsächlich in den USA.

Der UPC-A ist ein nur numerischer Code, der 12 Ziffern enthält : eine Herstelleridentifikationsnummer (6 Ziffern), eine Artikelnummer (5 Ziffern) und eine Prüfziffer. Es gibt auch einen UPC-E-Code, der nur 8 Stellen hat und für kleine Pakete verwendet wird.

2.2. EAN-Codes

EAN-Codes sind weltweit sowohl als europäische Artikelnummer als auch als internationale Artikelnummer bekannt. Sie sind für das Scannen an Verkaufsstellen konzipiert. Es gibt auch einige verschiedene Variationen des EAN-Codes, einschließlich EAN-13, EAN-8, JAN-13 und ISBN.

Der EAN-13-Code ist der am häufigsten verwendete EAN-Standard und ähnelt dem UPC-Code. Es besteht aus 13 Ziffern - einer führenden „0“, gefolgt vom UPC-A-Code.

2.3. Code 128

Der Code 128-Barcode ist ein kompakter linearer Code mit hoher Dichte, der in der Logistik- und Transportbranche für die Bestellung und Verteilung verwendet wird. Es kann alle 128 Zeichen von ASCII codieren und seine Länge ist variabel.

2.4. PDF417

PDF417 ist ein gestapelter linearer Barcode, der aus mehreren übereinander gestapelten 1D-Barcodes besteht. Daher kann ein herkömmlicher linearer Scanner verwendet werden.

Wir können erwarten, dass es in einer Vielzahl von Anwendungen wie Reisen (Bordkarten), Ausweisen und Bestandsverwaltung zu finden ist.

PDF417 verwendet die Reed-Solomon-Fehlerkorrektur anstelle von Prüfziffern. Diese Fehlerkorrektur ermöglicht es dem Symbol, einige Schäden zu ertragen, ohne Datenverlust zu verursachen. Es kann jedoch eine expansive Größe haben - viermal größer als andere 2D-Barcodes wie Datamatrix und QR-Codes.

2.5. QR-Codes

QR-Codes werden weltweit zu den bekanntesten 2D-Barcodes. Der große Vorteil des QR-Codes besteht darin, dass wir große Datenmengen auf engstem Raum speichern können.

Sie verwenden vier standardisierte Codierungsmodi, um Daten effizient zu speichern:

  • numerisch
  • alphanumerisch
  • Byte / Binär
  • Kanji

Darüber hinaus sind sie flexibel und können problemlos mit einem Smartphone gescannt werden. Ähnlich wie bei PDF417 kann ein QR-Code einigen Schäden standhalten, ohne dass Daten verloren gehen.

3. Barcode-Bibliotheken

Wir werden mehrere Bibliotheken erkunden:

  • Grill
  • Barcode4j
  • ZXing
  • QRGen

Barbecue ist eine Open-Source-Java-Bibliothek, die einen umfangreichen Satz von 1D-Barcode-Formaten unterstützt. Die Barcodes können auch in PNG, GIF, JPEG und SVG ausgegeben werden.

Barcode4j ist auch eine Open-Source-Bibliothek. Darüber hinaus bietet es 2D-Barcode-Formate wie DataMatrix und PDF417 sowie weitere Ausgabeformate. Das PDF417-Format ist in beiden Bibliotheken verfügbar. Im Gegensatz zu Barcode4j betrachtet Barbecue es jedoch als linearen Barcode.

ZXing („Zebrastreifen“) ist eine in Java implementierte Open-Source-1D / 2D-Barcode-Bildverarbeitungsbibliothek mit mehreren Formaten und Ports zu anderen Sprachen. Dies ist die Hauptbibliothek, die QR-Codes in Java unterstützt.

Die QRGen- Bibliothek bietet eine einfache QRCode-Generierungs-API, die auf ZXing basiert. Es bietet separate Module für Java und Android.

4. Generieren von linearen Barcodes

Erstellen wir einen Barcode-Bildgenerator für jedes Bibliotheks- und Barcode-Paar. Wir werden das Bild im PNG-Format abrufen, aber wir können auch andere Formate wie GIF oder JPEG verwenden.

4.1. Verwenden der Barbecue-Bibliothek

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. Generieren eines QR-Code-Barcodes

Rufen wir den QR-Code-Webdienst mithilfe der ZXing-Bibliothek auf:

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

Wir stellen den Anfragetext bereit, der die Daten enthält:

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.

Hier ist unser QR-Code:

Hier sehen wir die Leistungsfähigkeit von QR-Codes, um große Datenmengen auf engstem Raum zu speichern.

7. Fazit

In diesem Artikel haben wir gelernt, wie die häufigsten Arten von Barcodes in Java generiert werden.

Zunächst untersuchten wir die Formate verschiedener Arten von linearen und 2D-Barcodes. Als nächstes untersuchten wir die beliebtesten Java-Bibliotheken, um sie zu generieren. Obwohl wir einige einfache Beispiele ausprobiert haben, können wir die Bibliotheken weiter untersuchen, um individuellere Implementierungen zu erhalten.

Schließlich haben wir gesehen, wie die Barcode-Generatoren in einen REST-Service integriert und getestet werden können.

Wie immer ist der Beispielcode aus diesem Tutorial auf GitHub verfügbar.