Menghasilkan Kode Batang dan Kode QR di Jawa

1. Ikhtisar

Barcode digunakan untuk menyampaikan informasi secara visual. Kami kemungkinan besar akan memberikan gambar kode batang yang sesuai di halaman web, email, atau dokumen yang dapat dicetak.

Dalam tutorial ini, kita akan melihat bagaimana membuat tipe barcode yang paling umum di Java.

Pertama, kita akan belajar tentang bagian dalam dari beberapa jenis barcode. Selanjutnya, kita akan menjelajahi perpustakaan Java paling populer untuk menghasilkan kode batang. Terakhir, kita akan melihat bagaimana mengintegrasikan barcode ke dalam aplikasi kita dengan menyajikannya dari layanan web menggunakan Spring Boot.

2. Jenis Barcode

Barcode menyandikan informasi seperti nomor produk, nomor seri, dan nomor batch. Selain itu, mereka memungkinkan pihak seperti pengecer, produsen, dan penyedia transportasi untuk melacak aset melalui seluruh rantai pasokan.

Kita dapat mengelompokkan berbagai simbologi kode batang menjadi dua kategori utama:

  • barcode linier
  • Kode batang 2D

2.1. Kode UPC (Kode Produk Universal)

Kode UPC adalah beberapa dari barcode 1D yang paling umum digunakan, dan kami kebanyakan menemukannya di Amerika Serikat.

UPC-A adalah kode hanya numerik yang berisi 12 digit : nomor identifikasi pabrikan (6 digit), nomor item (5 digit), dan digit pemeriksa. Ada juga kode UPC-E yang hanya memiliki 8 digit dan digunakan untuk paket kecil.

2.2. Kode EAN

Kode EAN dikenal di seluruh dunia sebagai Nomor Artikel Eropa dan Nomor Artikel Internasional. Mereka dirancang untuk pemindaian Tempat Penjualan. Ada juga beberapa variasi kode EAN, termasuk EAN-13, EAN-8, JAN-13, dan ISBN.

Kode EAN-13 adalah standar EAN yang paling umum digunakan dan mirip dengan kode UPC. Itu terbuat dari 13 digit - "0" di depan diikuti oleh kode UPC-A.

2.3. Kode 128

Kode batang 128 adalah kode linier padat dan berdensitas tinggi yang digunakan dalam industri logistik dan transportasi untuk pemesanan dan distribusi. Itu dapat menyandikan semua 128 karakter ASCII , dan panjangnya bervariasi.

2.4. PDF417

PDF417 adalah kode batang linier bertumpuk yang terdiri dari beberapa kode batang 1D yang ditumpuk satu sama lain. Oleh karena itu, dapat menggunakan pemindai linier tradisional.

Kami mungkin berharap untuk menemukannya di berbagai aplikasi seperti perjalanan (boarding pass), kartu identitas, dan manajemen inventaris.

PDF417 menggunakan koreksi kesalahan Reed-Solomon alih-alih digit cek. Koreksi kesalahan ini memungkinkan simbol untuk mengalami beberapa kerusakan tanpa menyebabkan hilangnya data. Namun, ukurannya bisa ekspansif - 4 kali lebih besar dari barcode 2D lainnya seperti Datamatrix dan QR Codes.

2.5. Kode QR

Kode QR menjadi barcode 2D yang paling dikenal luas di seluruh dunia. Manfaat besar dari kode QR adalah kami dapat menyimpan data dalam jumlah besar dalam ruang terbatas.

Mereka menggunakan empat mode pengkodean standar untuk menyimpan data secara efisien:

  • numerik
  • alfanumerik
  • byte / biner
  • kanji

Selain itu, ukurannya fleksibel dan mudah dipindai menggunakan ponsel cerdas. Mirip dengan PDF417, kode QR dapat menahan beberapa kerusakan tanpa menyebabkan hilangnya data.

3. Perpustakaan Barcode

Kami akan menjelajahi beberapa perpustakaan:

  • Panggang
  • Barcode4j
  • ZXing
  • QRGen

Barbekyu adalah pustaka Java sumber terbuka yang mendukung serangkaian format kode batang 1D yang ekstensif. Selain itu, kode batang dapat di-output ke PNG, GIF, JPEG, dan SVG.

Barcode4j juga merupakan perpustakaan sumber terbuka. Selain itu, ia menawarkan format kode batang 2D - seperti DataMatrix dan PDF417 - dan lebih banyak format keluaran. Format PDF417 tersedia di kedua perpustakaan. Tapi, tidak seperti Barcode4j, Barbekyu menganggapnya sebagai kode batang linier.

ZXing ("zebra crossing") adalah pustaka pemrosesan gambar barcode 1D / 2D open-source dan multi-format yang diimplementasikan di Java, dengan port ke bahasa lain. Ini adalah perpustakaan utama yang mendukung kode QR di Jawa.

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

4. Menghasilkan Barcode Linear

Mari buat generator gambar kode batang untuk setiap perpustakaan dan pasangan kode batang. Kami akan mengambil gambar dalam format PNG, tetapi kami juga dapat menggunakan format lain seperti GIF atau JPEG.

4.1. Menggunakan Perpustakaan Barbekyu

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 Kode Batang Kode QR

Mari panggil layanan web Kode QR menggunakan perpustakaan ZXing:

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

Kami akan memberikan badan permintaan, yang berisi 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.

Ini kode QR kami:

Di sini, kita dapat melihat kekuatan kode QR untuk menyimpan data dalam jumlah besar dalam ruang terbatas.

7. Kesimpulan

Pada artikel ini, kita belajar bagaimana membuat tipe barcode yang paling umum di Java.

Pertama, kami mempelajari format dari beberapa jenis barcode linear dan 2D. Selanjutnya, kami menjelajahi pustaka Java paling populer untuk menghasilkannya. Meskipun kami mencoba beberapa contoh sederhana, kami dapat mempelajari pustaka lebih lanjut untuk implementasi yang lebih disesuaikan.

Terakhir, kami melihat cara mengintegrasikan generator kode batang ke dalam layanan REST, dan cara mengujinya.

Seperti biasa, kode contoh dari tutorial ini tersedia di GitHub.