Generere strekkoder og QR-koder i Java

1. Oversikt

Strekkoder brukes til å formidle informasjon visuelt. Vi vil sannsynligvis gi et passende strekkodebilde på en webside, e-post eller et utskrivbart dokument.

I denne opplæringen skal vi se på hvordan du genererer de vanligste typene strekkoder i Java.

Først lærer vi om det indre av flere typer strekkoder. Deretter vil vi utforske de mest populære Java-bibliotekene for å generere strekkoder. Til slutt vil vi se hvordan vi kan integrere strekkoder i applikasjonen vår ved å servere dem fra en webtjeneste ved hjelp av Spring Boot.

2. Typer strekkoder

Strekkoder koder informasjon som produktnumre, serienumre og batchnumre. De gjør det også mulig for parter som forhandlere, produsenter og transportleverandører å spore eiendeler gjennom hele forsyningskjeden.

Vi kan gruppere de mange forskjellige strekkodesymbologiene i to hovedkategorier:

  • lineære strekkoder
  • 2D strekkoder

2.1. UPC (Universal Product Code) koder

UPC-koder er noen av de mest brukte 1D-strekkodene, og vi finner dem for det meste i USA.

UPC-A er en kun numerisk kode som inneholder 12 sifre: et produsentidentifikasjonsnummer (6 sifre), et varenummer (5 sifre) og et kontrollsiffer. Det er også en UPC-E-kode som bare har 8 sifre og brukes til små pakker.

2.2. EAN-koder

EAN-koder er kjent over hele verden som både europeisk artikkelnummer og internasjonalt artikkelnummer. De er designet for skanning ved salgsstedet. Det er også noen få forskjellige varianter av EAN-koden, inkludert EAN-13, EAN-8, JAN-13 og ISBN.

EAN-13-koden er den mest brukte EAN-standarden og ligner på UPC-koden. Den er laget av 13 sifre - en ledende "0" etterfulgt av UPC-A-koden.

2.3. Kode 128

Kode 128-strekkoden er en kompakt lineær kode med høy tetthet brukt i logistikk- og transportbransjen for bestilling og distribusjon. Den kan kode alle 128 tegnene i ASCII, og lengden er variabel.

2.4. PDF417

PDF417 er en stablet lineær strekkode som består av flere 1D-strekkoder stablet oppå hverandre. Derfor kan den bruke en tradisjonell lineær skanner.

Vi kan forvente å finne den på en rekke applikasjoner, for eksempel reiser (boardingkort), identifikasjonskort og lagerstyring.

PDF417 bruker feilkorrigering av Reed-Solomon i stedet for sjekk sifre. Denne feilretting gjør at symbolet tåler noe skade uten å forårsake tap av data. Imidlertid kan den være ekspansiv i størrelse - 4 ganger større enn andre 2D-strekkoder som Datamatrix og QR-koder.

2.5. QR-koder

QR-koder blir de mest anerkjente 2D-strekkodene over hele verden. Den store fordelen med QR-koden er at vi kan lagre store datamengder på et begrenset sted.

De bruker fire standardiserte kodingsmoduser for å lagre data effektivt:

  • numerisk
  • alfanumerisk
  • byte / binær
  • kanji

Videre er de fleksible i størrelse og skannes enkelt ved hjelp av en smarttelefon. I likhet med PDF417 tåler en QR-kode noen skader uten å medføre tap av data.

3. Strekkodebiblioteker

Vi skal utforske flere biblioteker:

  • Grill
  • Strekkode4j
  • ZXing
  • QRGen

Grill er et Java-bibliotek med åpen kildekode som støtter et omfattende sett med 1D-strekkodeformater. Strekkodene kan også sendes til PNG, GIF, JPEG og SVG.

Strekkode4j er også et open source-bibliotek. I tillegg tilbyr den 2D-strekkodeformater - som DataMatrix og PDF417 - og flere utdataformater. PDF417-formatet er tilgjengelig i begge biblioteker. Men i motsetning til Barcode4j anser Barbecue det som en lineær strekkode.

ZXing (“Zebra crossing”) er et åpen kildekode, multi-format 1D / 2D-strekkode-bildebehandlingsbibliotek implementert i Java, med porter til andre språk. Dette er hovedbiblioteket som støtter QR-koder i Java.

QRGen biblioteket tilbyr et enkelt QRCode-generasjons-API bygget på toppen av ZXing. Det gir separate moduler for Java og Android.

4. Generere lineære strekkoder

La oss lage en strekkodegenerator for hvert bibliotek og strekkodepar. Vi henter bildet i PNG-format, men vi kan også bruke andre formater som GIF eller JPEG.

4.1. Bruke grillbiblioteket

Som vi får se, gir Barbecue den enkleste API for å generere strekkoder. Vi trenger bare å oppgi strekkodeteksten som minimal inndata. Men vi kan eventuelt angi en skrift og en oppløsning (prikker per tomme). Når det gjelder skrift, kan vi bruke den til å vise strekkodeteksten under bildet.

Først må vi legge til avhengigheten av Barbecue Maven:

 net.sourceforge.grillgrill 1.5-beta1 

La oss lage en generator for en EAN13-strekkode:

offentlig statisk BufferedImage generereEAN13BarcodeImage (String barcodeText) kaster Unntak {Barcode barcode = BarcodeFactory.createEAN13 (barcodeText); strekkode.setFont (BARCODE_TEXT_FONT); return BarcodeImageHandler.getImage (strekkode); }

Vi kan generere bilder for resten av de lineære strekkodetypene på en lignende måte.

Vi må merke oss at vi ikke trenger å oppgi kontrollsifret for EAN / UPC-strekkoder, ettersom det automatisk blir lagt til av biblioteket.

4.2. Bruke Barcode4j-biblioteket

La oss starte med å legge til Barcode4j Maven-avhengighet:

 net.sf.barcode4j strekkode4j 2.1 

På samme måte, la oss bygge en generator for en EAN13-strekkode:

offentlig statisk BufferedImage generereEAN13BarcodeImage (String barcodeText) {EAN13Bean strekkodeGenerator = ny EAN13Bean (); BitmapCanvasProvider canvas = new BitmapCanvasProvider (160, BufferedImage.TYPE_BYTE_BINARY, false, 0); barcodeGenerator.generateBarcode (canvas, barcodeText); return canvas.getBufferedImage (); }

De BitmapCanvasProvider konstruktøren tar flere parametere: oppløsning, bildetype, om anti-aliasing skal aktiveres, og bildeorientering. Vi trenger heller ikke å angi en skrift fordi teksten under bildet vises som standard.

4.3. Bruke ZXing-biblioteket

Her må vi legge til to Maven-avhengigheter: kjernebildebiblioteket og Java-klienten:

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

La oss lage en EAN13-generator:

offentlig statisk BufferedImage generereEAN13BarcodeImage (String barcodeText) kaster Unntak {EAN13Writer barcodeWriter = new EAN13Writer (); BitMatrix bitMatrix = strekkodeWriter.encode (strekkodeText, StrekkodeFormat.EAN_13, 300, 150); returnere MatrixToImageWriter.toBufferedImage (bitMatrix); }

Her må vi oppgi flere parametere som inndata, for eksempel strekkodetekst, strekkodeformat og strekkodedimensjoner. I motsetning til de to andre bibliotekene, vi må også legge til kontrollsifret for EAN-strekkoder. Men for UPC-A-strekkoder er kontrollsummen valgfri.

Videre vil ikke dette biblioteket vise strekkodetekst under bildet.

5. Generere 2D-strekkoder

5.1. Bruke ZXing-biblioteket

Vi skal bruke dette biblioteket til å generere en QR-kode. API-en ligner på linjære strekkoder:

offentlig statisk BufferedImage generereQRCodeImage (String barcodeText) kaster Unntak {QRCodeWriter barcodeWriter = new QRCodeWriter (); BitMatrix bitMatrix = barcodeWriter.encode (barcodeText, BarcodeFormat.QR_CODE, 200, 200); returnere MatrixToImageWriter.toBufferedImage (bitMatrix); }

5.2. Bruke QRGen-biblioteket

Biblioteket er ikke lenger distribuert til Maven Central, men vi finner det på jitpack.io.

Først må vi legge til jitpack-depotet og QRGen-avhengigheten til pom.xml:

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

La oss lage en metode som genererer en QR-kode:

offentlig statisk BufferedImage generereQRCodeImage (streng strekkodetekst) kaster unntak {ByteArrayOutputStream stream = QRCode. fra (strekkodetekst) .withSize (250, 250) .stream (); ByteArrayInputStream bis = ny ByteArrayInputStream (stream.toByteArray ()); returner ImageIO.read (bis); }

Som vi kan se, er API-et basert på Builder-mønsteret, og det gir to typer utdata: Fil og OutputStream. Vi kan bruke ImageIO biblioteket for å konvertere det til et BufferedImage.

6. Bygg en REST-tjeneste

Nå har vi et utvalg av strekkodebibliotek å bruke, la oss se på hvordan du serverer strekkoder fra en Spring Boot-nettjeneste.

Vi begynner med en RestController:

@RestController @RequestMapping ("/ barcodes") public class BarcodesController {@GetMapping (value = "/ barbecue / ean13 / {barcode}", produserer = MediaType.IMAGE_PNG_VALUE) public ResponseEntity barbecueEAN13Barcode (@PathVariable ("barcode") String barcode) kaster Unntak {retur okResponse (BarbecueBarcodeGenerator.generateEAN13BarcodeImage (strekkode)); } // ...}

Vi må også manuelt registrer en meldingsomformer for BufferedImage HTTP-svar fordi det ikke er noen standard:

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

Til slutt kan vi bruke Postman eller en nettleser for å se de genererte strekkodene.

6.1. Genererer en UPC-A strekkode

La oss ringe UPC-A-nettjenesten ved hjelp av grillbiblioteket:

[GET] // localhost: 8080 / strekkoder / grill / upca / 12345678901

Her er resultatet:

6.2. Generere en EAN13-strekkode

På samme måte skal vi ringe EAN13-nettjenesten:

[GET] // / lokal vert: 8080 / strekkoder / grill / ean13 / 012345678901

Og her er strekkoden vår:

6.3. Genererer en kode128-strekkode

I dette tilfellet skal vi bruke POST-metoden. La oss ringe Code128-nettjenesten ved hjelp av Barbecue-biblioteket:

[POST] // localhost: 8080 / strekkoder / grill / code128

Vi gir forespørselsorganet, som inneholder dataene:

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

La oss se resultatet:

6.4. Genererer en PDF417-strekkode

Her skal vi ringe PDF417-nettjenesten, som ligner på Code128:

[POST] // localhost: 8080 / strekkoder / grill / pdf417

Vi gir forespørselsorganet, som inneholder dataene:

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

Og her er den resulterende strekkoden:

6.5. Genererer en QR-kode strekkode

La oss ringe QR-kodetjenesten ved hjelp av ZXing-biblioteket:

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

Vi vil gi forespørsel kroppen, som inneholder dataene:

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

Her er vår QR-kode:

Her kan vi se kraften til QR-koder for å lagre store mengder data på et begrenset sted.

7. Konklusjon

I denne artikkelen lærte vi hvordan vi genererer de vanligste typene strekkoder i Java.

Først studerte vi formatene til flere typer lineære og 2D strekkoder. Deretter utforsket vi de mest populære Java-bibliotekene for å generere dem. Selv om vi prøvde noen enkle eksempler, kan vi studere bibliotekene videre for mer tilpassede implementeringer.

Til slutt så vi hvordan vi kunne integrere strekkodegeneratorene i en REST-tjeneste, og hvordan vi skulle teste dem.

Som alltid er eksempelkoden fra denne opplæringen tilgjengelig på GitHub.