Генериране на баркодове и QR кодове в Java

1. Общ преглед

Баркодовете се използват за визуално предаване на информация. Най-вероятно ще предоставим подходящо изображение на баркод в уеб страница, имейл или документ за печат.

В този урок ще разгледаме как да генерираме най-често срещаните видове баркодове в Java.

Първо ще научим за вътрешността на няколко вида баркодове. След това ще проучим най-популярните Java библиотеки за генериране на баркодове. И накрая, ще видим как да интегрираме баркодове в нашето приложение, като ги обслужваме от уеб услуга, използвайки Spring Boot.

2. Видове баркодове

Баркодовете кодират информация като продуктови номера, серийни номера и партидни номера. Освен това те дават възможност на страни като търговци на дребно, производители и доставчици на транспорт да проследяват активите през цялата верига на доставки.

Можем да групираме многото различни символики на баркод в две основни категории:

  • линейни баркодове
  • 2D баркодове

2.1. UPC (Универсален продуктов код) кодове

UPC кодовете са едни от най-често използваните 1D баркодове и най-често ги намираме в САЩ.

UPC-A е само цифров код, който съдържа 12 цифри : идентификационен номер на производителя (6 цифри), номер на артикул (5 цифри) и контролна цифра. Има и UPC-E код, който има само 8 цифри и се използва за малки пакети.

2.2. EAN кодове

EAN кодовете са известни по целия свят и като европейски номер на артикул, и като международен номер на артикул. Те са предназначени за сканиране на точки на продажба. Има и няколко различни вариации на EAN кода, включително EAN-13, EAN-8, JAN-13 и ISBN.

Кодът EAN-13 е най-често използваният EAN стандарт и е подобен на UPC кода. Съставен е от 13 цифри - водеща „0“, последвана от UPC-A кода.

2.3. Код 128

Баркодът Code 128 е компактен линеен код с висока плътност, използван в логистичната и транспортната индустрия за поръчки и дистрибуция. Той може да кодира всички 128 символа на ASCII и дължината му е променлива.

2.4. PDF417

PDF417 е подреден линеен баркод, състоящ се от множество 1D баркодове, подредени един върху друг. Следователно, той може да използва традиционен линеен скенер.

Може да очакваме да го намерим в различни приложения като пътуване (бордни карти), идентификационни карти и управление на инвентара.

PDF417 използва корекция на грешки на Reed-Solomon вместо контролни цифри. Тази корекция на грешки позволява на символа да понесе известни щети, без да причинява загуба на данни. Той обаче може да бъде с експанзивен размер - 4 пъти по-голям от други 2D баркодове като Datamatrix и QR кодове.

2.5. QR кодове

QR кодовете се превръщат в най-широко признатите 2D баркодове в световен мащаб. Голямата полза от QR кода е, че можем да съхраняваме големи количества данни в ограничено пространство.

Те използват четири стандартизирани режима на кодиране за ефективно съхранение на данни:

  • числови
  • буквено-цифрови
  • байт / двоичен
  • канджи

Освен това те са гъвкави по размер и лесно се сканират с помощта на смартфон. Подобно на PDF417, QR кодът може да издържи някои повреди, без да причинява загуба на данни.

3. Библиотеки с баркод

Ще проучим няколко библиотеки:

  • Барбекю
  • Баркод4j
  • ZXing
  • QRGen

Barbecue е Java библиотека с отворен код, която поддържа богат набор от 1D формати на баркод. Също така баркодовете могат да се извеждат в PNG, GIF, JPEG и SVG.

Barcode4j също е библиотека с отворен код. В допълнение, той предлага 2D формати на баркод - като DataMatrix и PDF417 - и повече изходни формати. Форматът PDF417 е достъпен и в двете библиотеки. Но за разлика от Barcode4j, Barbecue го смята за линеен баркод.

ZXing („пресичане на зебра“) е многоформатна 1D / 2D библиотека за обработка на изображения с баркод, внедрена в Java, с портове за други езици. Това е основната библиотека, която поддържа QR кодове в Java.

Библиотеката QRGen предлага прост API за генериране на QRCode, изграден върху ZXing. Той осигурява отделни модули за Java и Android.

4. Генериране на линейни баркодове

Нека създадем генератор на баркод изображения за всяка двойка библиотека и баркод. Ще извлечем изображението във формат PNG, но бихме могли да използваме и други формати като GIF или JPEG.

4.1. Използване на библиотеката за барбекю

Както ще видим, Barbecue предоставя най-простия API за генериране на баркодове. Трябва само да предоставим баркод текста като минимален вход. Но по желание бихме могли да зададем шрифт и резолюция (точки на инч). Що се отнася до шрифта, можем да го използваме за показване на баркод текста под изображението.

Първо, трябва да добавим зависимостта Barbecue Maven:

 net.sourceforge.barbecue barbecue 1.5-beta1 

Нека създадем генератор за EAN13 баркод:

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

Можем да генерираме изображения за останалите типове линейни баркодове по подобен начин.

Трябва да отбележим, че не е необходимо да предоставяме контролната цифра за EAN / UPC баркодове, тъй като тя се добавя автоматично от библиотеката.

4.2. Използване на библиотеката Barcode4j

Нека започнем с добавяне на зависимостта Barcode4j Maven:

 net.sf.barcode4j barcode4j 2.1 

По същия начин, нека изградим генератор за баркод EAN13:

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. Генериране на баркод за QR код

Нека извикаме уеб услугата QR Code, използвайки библиотеката ZXing:

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

Ще предоставим тялото на заявката, съдържащо данните:

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.

Ето нашия QR код:

Тук можем да видим силата на QR кодовете за съхраняване на големи количества данни в ограничено пространство.

7. Заключение

В тази статия научихме как да генерираме най-често срещаните видове баркодове в Java.

Първо проучихме форматите на няколко типа линейни и 2D баркодове. След това изследвахме най-популярните Java библиотеки за генерирането им. Въпреки че изпробвахме няколко прости примера, можем да изучим библиотеките допълнително за по-персонализирани реализации.

Накрая видяхме как да интегрираме генераторите на баркод в REST услуга и как да ги тестваме.

Както винаги, примерният код от този урок е достъпен в GitHub.