1. 概要

バーコードは、情報を視覚的に伝えるために使用されます。 ほとんどの場合、適切なバーコード画像をWebページ、電子メール、または印刷可能なドキュメントで提供します。

このチュートリアルでは、Javaで最も一般的なタイプのバーコードを生成する方法を見ていきます。

まず、いくつかのタイプのバーコードの内部について学びます。 次に、バーコードを生成するための最も人気のあるJavaライブラリについて説明します。 最後に、Spring Bootを使用して Webサービスからバーコードを提供することにより、バーコードをアプリケーションに統合する方法を説明します。

2. バーコードの種類

バーコードは、製品番号、シリアル番号、バッチ番号などの情報をエンコードします。また、小売業者、製造業者、輸送業者などの関係者は、サプライチェーン全体で資産を追跡できます。

多くの異なるバーコードシンボルを2つの主要なカテゴリにグループ化できます。

  • 線形バーコード
  • 2Dバーコード

2.1. UPC(Universal Product Code)コード

UPCコードは、最も一般的に使用されている1Dバーコードの一部であり、ほとんどの場合、米国で使用されています。

UPC-Aは、12桁の数字のみのコードです:メーカー識別番号(6桁)、アイテム番号(5桁)、およびチェックディジット。 わずか8桁で、小さなパッケージに使用されるUPC-Eコードもあります。

2.2. EANコード

EANコードは、ヨーロッパの商品番号と国際商品番号の両方として世界的に知られています。 これらはPOSスキャン用に設計されています。 EAN-13、EAN-8、JAN-13、ISBNなど、EANコードにはいくつかの異なるバリエーションもあります。

EAN-13コードは、最も一般的に使用されるEAN標準であり、UPCコードに似ています。 13桁で構成され、先頭に「0」が続き、その後にUPC-Aコードが続きます。

2.3. コード128

Code 128バーコードは、ロジスティクスおよび輸送業界で注文および配布に使用されるコンパクトで高密度の線形コードです。 ASCII の128文字すべてをエンコードでき、長さは変数。

2.4. PDF417

PDF417は、複数の1Dバーコードを積み重ねたスタックリニアバーコードです。したがって、従来のリニアスキャナーを使用できます。

旅行(搭乗券)、身分証明書、在庫管理など、さまざまなアプリケーションで見つかると思われます。

PDF417は、チェックディジットの代わりにリードソロモンエラー訂正を使用します。 このエラー訂正により、シンボルはデータの損失を引き起こすことなく、ある程度の損傷に耐えることができます。 ただし、サイズが大きくなる可能性があります。DatamatrixやQRコードなどの他の2Dバーコードの4倍の大きさです。

2.5. QRコード

QRコードは、世界中で最も広く認識されている2Dバーコードになりつつあります。 QRコードの大きなメリットは、限られたスペースに大量のデータを保存できることです。

4つの標準化されたエンコーディングモードを使用して、データを効率的に保存します。

  • 数値
  • 英数字
  • バイト/バイナリ
  • 漢字

さらに、サイズが柔軟で、スマートフォンを使用して簡単にスキャンできます。 PDF417と同様に、QRコードはデータの損失を引き起こすことなくある程度の損傷に耐えることができます。

3. バーコードライブラリ

いくつかのライブラリを探索します。

  • バーベキュー
  • Barcode4j
  • ZXing
  • QRGen

Barbecue は、広範な1Dバーコード形式のセットをサポートするオープンソースのJavaライブラリです。 また、バーコードはPNG、GIF、JPEG、SVGに出力できます。

Barcode4jもオープンソースライブラリです。 さらに、DataMatrixやPDF417などの2Dバーコード形式とその他の出力形式を提供します。 PDF417形式は両方のライブラリで利用できます。 ただし、Barcode4jとは異なり、Barbecueはそれを線形バーコードと見なします。

ZXing (「横断歩道」)は、Javaで実装されたオープンソースのマルチフォーマット1D / 2Dバーコード画像処理ライブラリであり、他の言語への移植が可能です。 これは、JavaでQRコードをサポートするメインライブラリです。

QRGen ライブラリは、ZXing上に構築されたシンプルなQRCode生成APIを提供します。 JavaとAndroid用に別々のモジュールを提供します。

4. 線形バーコードの生成

ライブラリとバーコードのペアごとにバーコード画像ジェネレータを作成してみましょう。 画像はPNG形式で取得しますが、GIFやJPEGなどの他の形式を使用することもできます。

4.1. バーベキューライブラリの使用

これから説明するように、バーベキューはバーコードを生成するための最も単純なAPIを提供します。 最小限の入力としてバーコードテキストを提供するだけで済みます。ただし、オプションでフォントと解像度(1インチあたりのドット数)を設定できます。 フォントに関しては、画像の下にバーコードテキストを表示するために使用できます。

まず、 BarbecueMaven依存関係を追加する必要があります。

<dependency>
    <groupId>net.sourceforge.barbecue</groupId>
    <artifactId>barbecue</artifactId>
    <version>1.5-beta1</version>
</dependency>

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ライブラリの使用

Barcode4jMaven依存関係を追加することから始めましょう。

<dependency>
    <groupId>net.sf.barcode4j</groupId>
    <artifactId>barcode4j</artifactId>
    <version>2.1</version>
</dependency>

同様に、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();
}

BitmapCanvasProvider コンストラクターは、解像度、画像タイプ、アンチエイリアシングを有効にするかどうか、画像の向きなど、いくつかのパラメーターを取ります。 また、画像の下のテキストはデフォルトで表示されるため、フォントを設定する必要はありません。

4.3. ZXingライブラリの使用

ここでは、コアイメージライブラリJavaクライアントの2つのMaven依存関係を追加する必要があります。

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.3.0</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.3.0</version>
</dependency>

EAN13ジェネレーターを作成しましょう。

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);
}

ここでは、バーコードテキスト、バーコード形式、バーコード寸法など、いくつかのパラメータを入力として提供する必要があります。 他の2つのライブラリとは異なり、 また、EANバーコードのチェックサム桁を追加する必要があります。 ただし、UPC-Aバーコードの場合、チェックサムはオプションです。

さらに、このライブラリは画像の下にバーコードテキストを表示しません。

5. 2Dバーコードの生成

5.1. ZXingライブラリの使用

このライブラリを使用してQRコードを生成します。 APIは、線形バーコードのAPIに似ています。

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. QRGenライブラリーの使用

ライブラリはMavenCentralにデプロイされなくなりましたが、jitpack.ioで見つけることができます。

まず、jitpackリポジトリとQRGen依存関係をpom.xmlに追加する必要があります。

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>com.github.kenglxn.qrgen</groupId>
        <artifactId>javase</artifactId>
        <version>2.6.0</version>
    </dependency>
</dependencies>

QRコードを生成するメソッドを作成しましょう:

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);
}

ご覧のとおり、APIは Builderパターンに基づいており、FileOutputStreamの2種類の出力を提供します。 ImageIO ライブラリを使用して、BufferedImageに変換できます。

6. RESTサービスの構築

これで、使用するバーコードライブラリを選択できるようになりました。次に、Spring BootWebサービスからバーコードを提供する方法を見てみましょう。

RestControllerから始めましょう。

@RestController
@RequestMapping("/barcodes")
public class BarcodesController {

    @GetMapping(value = "/barbecue/ean13/{barcode}", produces = MediaType.IMAGE_PNG_VALUE)
    public ResponseEntity<BufferedImage> barbecueEAN13Barcode(@PathVariable("barcode") String barcode)
    throws Exception {
        return okResponse(BarbecueBarcodeGenerator.generateEAN13BarcodeImage(barcode));
    }
    //...
}

また、デフォルトがないため、BufferedImage HTTPResponsesのメッセージコンバーターを手動で登録する必要があります。

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

最後に、Postmanまたはブラウザを使用して、生成されたバーコードを表示できます。

6.1. UPC-Aバーコードの生成

バーベキューライブラリを使用してUPC-AWebサービスを呼び出しましょう。

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

結果は次のとおりです。

6.2. EAN13バーコードの生成

同様に、EAN13Webサービスを呼び出します。

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

そして、これが私たちのバーコードです:

6.3. Code128バーコードの生成

この場合、POSTメソッドを使用します。 バーベキューライブラリを使用してCode128Webサービスを呼び出しましょう。

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

データを含むリクエスト本文を提供します。

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

結果を見てみましょう:

6.4. PDF417バーコードの生成

ここでは、Code128に似たPDF417Webサービスを呼び出します。

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

データを含むリクエスト本文を提供します。

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

結果のバーコードは次のとおりです。

6.5. QRコードバーコードの生成

ZXingライブラリを使用してQRコードWebサービスを呼び出しましょう。

[POST] http://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から入手できます。