Java

ZXingを使ってJANコードの生成/読み取りを行う

JANコード とは13桁の商品識別番号であり、一般に流通している商品にはバーコードスキャナで読み取れるように JANコードとともに JANシンボル というバーコードシンボルがパッケージに表示されています。JANコードを利用すれば、システムと商品を連携できます。本稿では、JAN(EAN-13)コードやQRコードなどの各種バーコードを生成できる Java のライブラリ ZXing でJANコードを生成/読み取りする方法について解説します。

こんな人におすすめ
  • JANコードを読み取って商品検索に使いたい
  • 店舗独自のインストアマーキングを印刷したい
  • バーコードバトラーを作りたい

ZXingとは

ZXing(ゼブラクロッシング)は、Javaで実装されたオープンソースのマルチフォーマット1次元・2次元コード画像処理ライブラリであり、.NETやC++など様々な言語の移植やバインディングが展開されています。

1次元コードについては以下がサポートされています(2019年9月現在)

UPC-Aアメリカ、カナダで使用されている12桁の統一商品コードです。
UPC-Eアメリカ、カナダで使用されている8桁の統一商品コードです。
EAN-8EAN-8 バーコードは、EAN-13 バーコードの短縮版で、ヨーロッパおよびその他の国で標準的な小売り製品の識別子として使われてます。
EAN-13日本で最も普及している商品識別コードであり、日本ではJANコードと呼称されています。EAN(JAN)コードから生成されたバーコードシンボルは市販される多くの商品に印刷または貼付されており、POSシステムや在庫管理システムなどで価格や商品名を検索するためのキーとして使われています。
Code39産業用途。数字と文字の両方を使用したコードで、一度に最大43のアルファベット文字をエンコードできます。一般的には、軍隊や自動車産業で使われています。
Code93産業用途。Code39をさらにコンパクトにしたコードです。
Code128産業用途。アスキーコード128文字(数字、アルファベット大文字/小文字、記号、制御コード)全てをバーコード化することができます。
Codabar産業用途。コードには自己チェック機能が付いているため、コード入力時のエラーを排除できます。
ITFコード産業用途。ITF(Interleaved Two of Five)コードは、日本における物流統一シンボルで、ヨーロッパの物流統一シンボルEAN-DUNや米国の物流統一シンボルUCC-SCSと互換性を持って作成されたものです。

セットアップ

ZXingはGithubのページ https://github.com/zxing/zxing ではjarが配布されていません。ソースからビルドするのが難しい場合は、Mavenのリポジトリよりダウンロードするのをおすすめします。core-*.*.*.jarとjavase-*.*.*.jarをクラスパスに追加してください(PCの場合です。Androidの場合はjavaseではなくandroid-coreが必要です)。

https://repo1.maven.org/maven2/com/google/zxing/core/3.4.0/core-3.4.0.jar

https://repo1.maven.org/maven2/com/google/zxing/javase/3.4.0/javase-3.4.0.jar

Mavenを使用する場合は、pom.xmlに以下の定義を追加してください。

pom.xml

<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.0</version>
</dependency>

サンプルソース

生成処理

以下のソースはEAN13Writerを使って、JANコード「4902102072618」をエンコードして、「jancode_cocacola.png」という画像ファイルにJANシンボルを出力するサンプルです。

Java

package net.develman.barcode;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.EAN13Writer;
import com.google.zxing.qrcode.QRCodeWriter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ZxingEAN13WriterExample {

    public static final void main(String[] args) {
        String content = "4902102072618";
        int width = 273;
        int height = 110;
        String output = "jancode_cocacola.png";

        try {
            EAN13Writer writer = new EAN13Writer();

            //EAN13Writer#encode()には以下の情報を渡す
            // (1)エンコード対象の文字列、バーコードシンボルに埋め込みたい情報
            // (2)出力するバーコードの書式
            // (3)イメージの幅
            // (4)イメージの高さ
            BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.EAN_13, width, height);

            BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);

            //エンコードで得られたイメージを画像ファイルに出力する
            ImageIO.write(image, "png", new File(output));

        } catch (WriterException e) {
            System.err.println("[" + content + "] をエンコードするときに例外が発生.");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("[" + output + "] を出力するときに例外が発生.");
            e.printStackTrace();
        }
    }
}

これを実行すると、シンボルを画像ファイルとして得られます。

JANコードは規格で13桁と決められています。エンコード対象として渡す数値が規定の桁数でない場合は、例外発生となります。ただし12桁を指定した場合は13桁目のチェックディジットが付与された状態でシンボルが生成されます。

読み取り処理

以下のソースはEAN13Readerを使って、「jancode_cocacola.png」という画像ファイルをデコードしてJANコード「4902102072618」を得るサンプルです。

Java

package net.develman.barcode;

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.oned.EAN13Reader;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ZxingEAN13ReadExample {

    public static final void main(String[] args) {
        String input = "jancode_cocacola.png";

        try {
            //画像データを読み込む
            BufferedImage image = ImageIO.read(new File(input));
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            Binarizer binarizer = new HybridBinarizer(source);
            BinaryBitmap bitmap = new BinaryBitmap(binarizer);

            EAN13Reader reader = new EAN13Reader();

            //EAN13Reader#decode()には以下の情報を渡す
            // (1)読み込んだイメージ
            Result result = reader.decode(bitmap);

            System.out.println(result.getText());

        } catch (NotFoundException e) {
            System.err.println("[" + input + "] イメージの中にバーコードが見つからないためデコードで例外が発生.");
            e.printStackTrace();
        } catch (FormatException e) {
            System.err.println("[" + input + "] は書式不正のためデコードで例外が発生.");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("[" + input + "] を読み込むときに例外が発生.");
            e.printStackTrace();
        }
    }
}

実行結果

4902102072618
ABOUT ME
sasakiyu
ひ弱で優しい少年だったが、デーモンと合体。 強大な力を得つつも人間の心を失わないデベルマンとなる。