Menjana Kod Bar dan Kod QR di Java

1. Gambaran keseluruhan

Kod bar digunakan untuk menyampaikan maklumat secara visual. Kami kemungkinan besar akan memberikan gambar kod bar yang sesuai di halaman web, e-mel, atau dokumen yang dapat dicetak.

Dalam tutorial ini, kita akan melihat bagaimana menghasilkan jenis barcode yang paling biasa di Java.

Pertama, kita akan belajar mengenai dalaman beberapa jenis kod bar. Seterusnya, kita akan meneroka perpustakaan Java yang paling popular untuk menghasilkan kod bar. Akhirnya, kita akan melihat cara mengintegrasikan kod bar ke dalam aplikasi kita dengan memberikannya dari perkhidmatan web menggunakan Spring Boot.

2. Jenis Kod Bar

Kod bar mengekod maklumat seperti nombor produk, nombor siri, dan nombor kumpulan. Juga, mereka membolehkan pihak seperti peruncit, pengeluar, dan penyedia pengangkutan untuk mengesan aset melalui seluruh rantaian bekalan.

Kami dapat mengumpulkan banyak simbologi kod bar ke dalam dua kategori utama:

  • kod bar linear
  • Kod bar 2D

2.1. Kod UPC (Kod Produk Sejagat)

Kod UPC adalah beberapa kod bar 1D yang paling biasa digunakan, dan kebanyakannya kami dapati di Amerika Syarikat.

UPC-A adalah kod angka sahaja yang mengandungi 12 digit : nombor pengenalan pengeluar (6 digit), nombor item (5 digit), dan digit cek. Terdapat juga kod UPC-E yang hanya mempunyai 8 digit dan digunakan untuk pakej kecil.

2.2. Kod EAN

Kod EAN dikenali di seluruh dunia sebagai Nombor Artikel Eropah dan Nombor Artikel Antarabangsa. Ia direka untuk pengimbasan Tempat Dijual. Terdapat juga beberapa variasi kod EAN yang berbeza, termasuk EAN-13, EAN-8, JAN-13, dan ISBN.

Kod EAN-13 adalah standard EAN yang paling biasa digunakan dan serupa dengan kod UPC. Ini terdiri daripada 13 digit - "0" yang terkemuka diikuti oleh kod UPC-A.

2.3. Kod 128

Kod bar Code 128 adalah kod linear berketumpatan tinggi yang digunakan dalam industri logistik dan pengangkutan untuk membuat pesanan dan pengedaran. Ia dapat mengekod semua 128 watak ASCII , dan panjangnya berubah-ubah.

2.4. PDF417

PDF417 adalah kod bar linier bertumpuk yang terdiri daripada beberapa kod bar 1D yang disusun satu di atas yang lain. Oleh itu, ia boleh menggunakan pengimbas linier tradisional.

Kami mungkin akan mencarinya dalam pelbagai aplikasi seperti perjalanan (boarding pass), kad pengenalan, dan pengurusan inventori.

PDF417 menggunakan pembetulan ralat Reed-Solomon dan bukannya digit periksa. Pembetulan ralat ini memungkinkan simbol untuk menanggung beberapa kerosakan tanpa menyebabkan kehilangan data. Walau bagaimanapun, ukurannya boleh luas - 4 kali lebih besar daripada kod bar 2D lain seperti Datamatrix dan QR Codes.

2.5. Kod QR

Kod QR menjadi kod bar 2D yang paling dikenali di seluruh dunia. Manfaat besar dari kod QR adalah kita dapat menyimpan sejumlah besar data di tempat yang terhad.

Mereka menggunakan empat mod pengekodan standard untuk menyimpan data dengan cekap:

  • berangka
  • abjad angka
  • bait / binari
  • kanji

Lebih-lebih lagi, ukurannya fleksibel dan mudah diimbas menggunakan telefon pintar. Sama seperti PDF417, kod QR dapat menahan beberapa kerosakan tanpa menyebabkan kehilangan data.

3. Perpustakaan Kod Bar

Kami akan meneroka beberapa perpustakaan:

  • Barbeku
  • Kod bar4j
  • ZXing
  • QRGen

Barbeku adalah perpustakaan Java sumber terbuka yang menyokong sekumpulan format kod bar 1D yang luas. Juga, kod bar boleh dihasilkan ke PNG, GIF, JPEG, dan SVG.

Barcode4j juga merupakan perpustakaan sumber terbuka. Di samping itu, ia menawarkan format kod bar 2D - seperti DataMatrix dan PDF417 - dan lebih banyak format output. Format PDF417 tersedia di kedua-dua perpustakaan. Tetapi, tidak seperti Barcode4j, Barbecue menganggapnya sebagai barcode linier.

ZXing ("penyeberangan zebra") adalah pustaka pemprosesan gambar barcode sumber terbuka 1D / 2D sumber terbuka yang dilaksanakan di Java, dengan port ke bahasa lain. Ini adalah perpustakaan utama yang menyokong kod QR di Java.

Perpustakaan QRGen menawarkan API generasi QRCode ringkas yang dibina di atas ZXing. Ini menyediakan modul terpisah untuk Java dan Android.

4. Menjana Kod Bar Linear

Mari buat penjana gambar kod bar untuk setiap perpustakaan dan pasangan kod bar. Kami akan mengambil gambar dalam format PNG, tetapi kami juga boleh menggunakan format lain seperti GIF atau JPEG.

4.1. Menggunakan Perpustakaan Barbeku

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. Menghasilkan Kod Bar Kod QR

Mari hubungi perkhidmatan web QR Code menggunakan perpustakaan ZXing:

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

Kami akan memberikan badan permintaan, yang mengandungi data:

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.

Inilah kod QR kami:

Di sini, kita dapat melihat kehebatan kod QR untuk menyimpan sejumlah besar data di tempat yang terhad.

7. Kesimpulannya

Dalam artikel ini, kami belajar bagaimana menghasilkan jenis kod bar yang paling biasa di Java.

Pertama, kami mengkaji format beberapa jenis kod bar linear dan 2D. Seterusnya, kami meneroka perpustakaan Java yang paling popular untuk menghasilkannya. Walaupun kami mencuba beberapa contoh mudah, kami dapat mempelajari perpustakaan lebih jauh untuk pelaksanaan yang lebih disesuaikan.

Akhirnya, kami melihat bagaimana mengintegrasikan penjana kod bar ke perkhidmatan REST, dan bagaimana mengujinya.

Seperti biasa, contoh kod dari tutorial ini terdapat di GitHub.