Streepjescodes en QR-codes genereren in Java

1. Overzicht

Barcodes worden gebruikt om informatie visueel over te brengen. We zullen hoogstwaarschijnlijk een geschikte streepjescodeafbeelding toevoegen aan een webpagina, e-mail of een afdrukbaar document.

In deze zelfstudie gaan we bekijken hoe u de meest voorkomende typen streepjescodes in Java kunt genereren.

Eerst leren we de binnenkant van verschillende soorten streepjescodes. Vervolgens verkennen we de meest populaire Java-bibliotheken voor het genereren van streepjescodes. Ten slotte zullen we zien hoe we streepjescodes in onze applicatie kunnen integreren door ze te bedienen vanaf een webservice met Spring Boot.

2. Soorten streepjescodes

Barcodes coderen informatie zoals productnummers, serienummers en batchnummers. Bovendien stellen ze partijen zoals retailers, fabrikanten en transportbedrijven in staat om activa door de hele toeleveringsketen te volgen.

We kunnen de vele verschillende streepjescodesymbologieën groeperen in twee hoofdcategorieën:

  • lineaire streepjescodes
  • 2D-streepjescodes

2.1. UPC-codes (Universal Product Code)

UPC-codes zijn enkele van de meest gebruikte 1D-streepjescodes en we vinden ze meestal in de Verenigde Staten.

De UPC-A is een code die alleen uit cijfers bestaat en uit 12 cijfers bestaat: een fabrikantidentificatienummer (6 cijfers), een artikelnummer (5 cijfers) en een controlecijfer. Er is ook een UPC-E-code die slechts 8 cijfers heeft en wordt gebruikt voor kleine pakketten.

2.2. EAN-codes

EAN-codes zijn wereldwijd bekend als zowel Europees artikelnummer als internationaal artikelnummer. Ze zijn ontworpen voor scannen op het verkooppunt. Er zijn ook een paar verschillende varianten van de EAN-code, waaronder EAN-13, EAN-8, JAN-13 en ISBN.

De EAN-13-code is de meest gebruikte EAN-standaard en is vergelijkbaar met de UPC-code. Het bestaat uit 13 cijfers - een voorloop "0" gevolgd door de UPC-A-code.

2.3. Code 128

De Code 128-streepjescode is een compacte lineaire code met hoge dichtheid gebruikt in de logistieke en transportsector voor bestellingen en distributie. Het kan alle 128 tekens van ASCII coderen, en de lengte is variabel.

2.4. PDF417

PDF417 is een gestapelde lineaire barcode die bestaat uit meerdere 1D-barcodes die op elkaar zijn gestapeld. Daarom kan het een traditionele lineaire scanner gebruiken.

We zouden het kunnen verwachten op een verscheidenheid aan toepassingen, zoals reizen (instapkaarten), identificatiekaarten en voorraadbeheer.

PDF417 gebruikt de foutcorrectie van Reed-Solomon in plaats van controlecijfers. Door deze foutcorrectie kan het symbool enige schade oplopen zonder dat er gegevens verloren gaan. Het kan echter enorm groot zijn - 4 keer groter dan andere 2D-barcodes zoals Datamatrix en QR-codes.

2.5. QR-codes

QR-codes worden de meest algemeen erkende 2D-streepjescodes ter wereld. Het grote voordeel van de QR-code is dat we kunnen grote hoeveelheden gegevens in een beperkte ruimte opslaan.

Ze gebruiken vier gestandaardiseerde coderingsmodi om gegevens efficiënt op te slaan:

  • numeriek
  • alfanumeriek
  • byte / binair
  • kanji

Bovendien zijn ze flexibel van formaat en gemakkelijk te scannen met een smartphone. Net als bij PDF417 kan een QR-code enige schade weerstaan ​​zonder dat er gegevens verloren gaan.

3. Barcodebibliotheken

We gaan verschillende bibliotheken verkennen:

  • Barbecue
  • Barcode4j
  • ZXing
  • QRGen

Barbecue is een open-source Java-bibliotheek die een uitgebreide set 1D-streepjescodeformaten ondersteunt. De streepjescodes kunnen ook worden uitgevoerd naar PNG, GIF, JPEG en SVG.

Barcode4j is ook een open-sourcebibliotheek. Bovendien biedt het 2D-streepjescodeformaten - zoals DataMatrix en PDF417 - en meer uitvoerformaten. Het formaat PDF417 is beschikbaar in beide bibliotheken. Maar in tegenstelling tot Barcode4j beschouwt Barbecue het als een lineaire barcode.

ZXing ("Zebrapad") is een open-source, multi-format 1D / 2D barcode beeldverwerkingsbibliotheek geïmplementeerd in Java, met poorten naar andere talen. Dit is de hoofdbibliotheek die QR-codes in Java ondersteunt.

QRGen bibliotheek biedt een eenvoudige API voor het genereren van QRCode die bovenop ZXing is gebouwd. Het biedt aparte modules voor Java en Android.

4. Genereren van lineaire streepjescodes

Laten we een generator voor streepjescodeafbeeldingen maken voor elke bibliotheek en elk streepjescodepaar. We halen de afbeelding op in het PNG-formaat, maar we kunnen ook andere formaten gebruiken, zoals GIF of JPEG.

4.1. De barbecuebibliotheek gebruiken

Zoals we zullen zien, biedt Barbecue de eenvoudigste API voor het genereren van streepjescodes. We hoeven alleen de streepjescodetekst op te geven als minimale invoer. Maar we kunnen optioneel een lettertype en een resolutie (dots per inch) instellen. Met betrekking tot het lettertype kunnen we het gebruiken om de streepjescodetekst onder de afbeelding weer te geven.

Eerst moeten we de Barbecue Maven-afhankelijkheid toevoegen:

 net.sourceforge.barbecue barbecue 1.5-beta1 

Laten we een generator maken voor een EAN13-streepjescode:

openbare statische BufferedImage genererenEAN13BarcodeImage (String barcodeText) genereert Uitzondering {Barcode barcode = BarcodeFactory.createEAN13 (barcodeText); streepjescode.setFont (BARCODE_TEXT_FONT); retourneer BarcodeImageHandler.getImage (barcode); }

We kunnen op een vergelijkbare manier afbeeldingen genereren voor de rest van de lineaire streepjescodetypes.

Houd er rekening mee dat we het checksum-cijfer voor EAN / UPC-streepjescodes niet hoeven op te geven, aangezien dit automatisch door de bibliotheek wordt toegevoegd.

4.2. Met behulp van de Barcode4j-bibliotheek

Laten we beginnen met het toevoegen van de Barcode4j Maven-afhankelijkheid:

 net.sf.barcode4j barcode4j 2.1 

Laten we op dezelfde manier een generator bouwen voor een EAN13-streepjescode:

openbare statische BufferedImage genererenEAN13BarcodeImage (String barcodeText) {EAN13Bean barcodeGenerator = nieuwe EAN13Bean (); BitmapCanvasProvider canvas = nieuwe BitmapCanvasProvider (160, BufferedImage.TYPE_BYTE_BINARY, false, 0); barcodeGenerator.generateBarcode (canvas, barcodeText); retourneer canvas.getBufferedImage (); }

De BitmapCanvasProvider constructor heeft verschillende parameters nodig: resolutie, afbeeldingstype, of anti-aliasing moet worden ingeschakeld en afbeeldingsoriëntatie. We hoeven ook geen lettertype in te stellen omdat de tekst onder de afbeelding wordt standaard weergegeven.

4.3. Met behulp van de ZXing-bibliotheek

Hier moeten we twee Maven-afhankelijkheden toevoegen: de kernafbeeldingsbibliotheek en de Java-client:

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

Laten we een EAN13-generator maken:

openbare statische BufferedImage genererenEAN13BarcodeImage (String barcodeText) genereert Uitzondering {EAN13Writer barcodeWriter = nieuwe EAN13Writer (); BitMatrix bitMatrix = barcodeWriter.encode (barcodeText, BarcodeFormat.EAN_13, 300, 150); retourneer MatrixToImageWriter.toBufferedImage (bitMatrix); }

Hier moeten we verschillende parameters opgeven als invoer, zoals een streepjescodetekst, een streepjescodeformaat en streepjescodeafmetingen. In tegenstelling tot de andere twee bibliotheken, we moeten ook het checksum-cijfer toevoegen voor EAN-streepjescodes. Maar voor UPC-A-streepjescodes is de checksum optioneel.

Bovendien geeft deze bibliotheek geen streepjescodetekst onder de afbeelding weer.

5. Genereren van 2D-streepjescodes

5.1. Met behulp van de ZXing-bibliotheek

We gaan deze bibliotheek gebruiken om een ​​QR-code te genereren. De API is vergelijkbaar met die van de lineaire barcodes:

openbare statische BufferedImage genererenQRCodeImage (String barcodeText) genereert Uitzondering {QRCodeWriter barcodeWriter = nieuwe QRCodeWriter (); BitMatrix bitMatrix = barcodeWriter.encode (barcodeText, BarcodeFormat.QR_CODE, 200, 200); retourneer MatrixToImageWriter.toBufferedImage (bitMatrix); }

5.2. Met behulp van de QRGen-bibliotheek

De bibliotheek wordt niet langer geïmplementeerd in Maven Central, maar we kunnen deze vinden op jitpack.io.

Eerst moeten we de jitpack-repository en de QRGen-afhankelijkheid toevoegen aan onze pom.xml:

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

Laten we een methode maken die een QR-code genereert:

openbare statische BufferedImage genererenQRCodeImage (String barcodeText) genereert Uitzondering {ByteArrayOutputStream stream = QRCode .from (barcodeText) .withSize (250, 250) .stream (); ByteArrayInputStream bis = nieuwe ByteArrayInputStream (stream.toByteArray ()); retourneer ImageIO.read (bis); }

Zoals we kunnen zien, is de API gebaseerd op het Builder-patroon en biedt deze twee soorten uitvoer: het dossier en OutputStream. We kunnen de ImageIO bibliotheek om het naar een BufferedImage.

6. Bouwen van een REST-service

Nu hebben we de keuze uit een barcodebibliotheek die we kunnen gebruiken, laten we eens kijken hoe we barcodes van een Spring Boot-webservice kunnen aanbieden.

We beginnen met een RestController:

@RestController @RequestMapping ("/ barcodes") openbare klasse BarcodesController {@GetMapping (value = "/ barbecue / ean13 / {barcode}", produceert = MediaType.IMAGE_PNG_VALUE) openbare ResponseEntity barbecueEAN13Barcode (@PathVariable ("barcode") String barcode) gooit uitzondering {return okResponse (BarbecueBarcodeGenerator.generateEAN13BarcodeImage (barcode)); } // ...}

We moeten ook handmatig registreer een berichtconverter voor BufferedImage HTTP-reacties omdat er geen standaard is:

@Bean openbare HttpMessageConverter createImageHttpMessageConverter () {retourneer nieuwe BufferedImageHttpMessageConverter (); }

Ten slotte kunnen we Postman of een browser gebruiken om de gegenereerde barcodes te bekijken.

6.1. Een UPC-A-streepjescode genereren

Laten we de UPC-A-webservice bellen met behulp van de Barbecue-bibliotheek:

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

Hier is het resultaat:

6.2. Een EAN13-streepjescode genereren

Op dezelfde manier gaan we de EAN13-webservice bellen:

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

En hier is onze streepjescode:

6.3. Een Code128-streepjescode genereren

In dit geval gaan we de POST-methode gebruiken. Laten we de Code128 webservice bellen met behulp van de Barbecue-bibliotheek:

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

We zullen de hoofdtekst van het verzoek verstrekken, met daarin de gegevens:

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

Laten we eens kijken naar het resultaat:

6.4. Een PDF417-streepjescode genereren

Hier gaan we de PDF417-webservice noemen, die vergelijkbaar is met Code128:

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

We zullen de hoofdtekst van het verzoek verstrekken, met daarin de gegevens:

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

En hier is de resulterende streepjescode:

6.5. Een QR-code streepjescode genereren

Laten we de webservice QR-code bellen met behulp van de ZXing-bibliotheek:

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

We zullen de hoofdtekst van het verzoek verstrekken, met daarin de gegevens:

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 exercise ullamco laboris nisi ut aliquip ex ea commodo consequat.

Hier is onze QR-code:

Hier zien we de kracht van QR-codes om grote hoeveelheden gegevens in een beperkte ruimte op te slaan.

7. Conclusie

In dit artikel hebben we geleerd hoe we de meest voorkomende typen streepjescodes in Java kunnen genereren.

Eerst hebben we de formaten van verschillende soorten lineaire en 2D-streepjescodes bestudeerd. Vervolgens hebben we de meest populaire Java-bibliotheken onderzocht om ze te genereren. Hoewel we enkele eenvoudige voorbeelden hebben geprobeerd, kunnen we de bibliotheken verder bestuderen voor meer aangepaste implementaties.

Ten slotte hebben we gezien hoe we de streepjescodegeneratoren in een REST-service kunnen integreren en hoe we ze kunnen testen.

Zoals altijd is de voorbeeldcode van deze tutorial beschikbaar op GitHub.