EANバーコードの作り方

GD::Barcode::EAN13から、リバース・エンジニアリングしてJAN13バーコードの作成方法を調べた。
なお、ここではコードの妥当性は考えない。先頭から12桁を計算して、チェックデジットである13桁目の数字を決める訳だが、その計算式は別に譲る。

バーコードの基本の基本

JAN13(=EAN(=ISBN13))の場合、1.コードを構成する数字の一つ一つが7桁の2進数に置き換えられ、2.2進数の0の桁が空白、1の桁が黒線に置き換えられる。3.ただし、数字と数字の間に、エラーチェックのためにたまに色々挟まる。
プログラミングをする上で、2の部分はぶっちゃけ何も問題がない。楽なもんである。
3も、ルールはそれほど難しくない。決まりきった作業である。
一番ネックになるのが、1の数字から2進数への置き換えである。これが面倒。ルールのためのルールと言った感じで、覚えにくい。いや、プログラマならそれに慣れて然るべきなんだけれども。

数値から2進数への置き換え

まず、数字を三つのグループに分ける。
1.最も左側、先頭の数字1桁。これをプリフィックスキャラクターと呼ぶ。恐るべきことに、この数字はそのものの形で印刷されることはない。
2.次の6桁を左側と呼ぶ。
3.最後の6桁(5桁+1桁のチェックデジット)を右側と呼ぶ。
プログラム的には、1を0番として、2を1〜6、3を7〜12とするのが覚えやすいかも知れない。

右側の置き換え

順番は前後するが、右側の方が理解やプログラミングの難易度が低いので、こちらを先にする。
右側の置き換えは単純な一対一の置換で、以下の表に従う。

数字 コード
0 1110010
1 1100110
2 1101100
3 1000010
4 1011100
5 1001110
6 1010000
7 1000100
8 1001000
9 1110100

小細工はない。

左側の置き換え

左側は単純な置き換えではなく、数字一つに対し二つの置き換え候補があって、都度それを選択していく。

数字 Odd Even
0 0001101 0100111
1 0011001 0110011
2 0010011 0011011
3 0111101 0100001
4 0100011 0011101
5 0110001 0111001
6 0101111 0000101
7 0111011 0010001
8 0110111 0001001
9 0001011 0010111

このOddとEvenの選択の基準は、最初のプリフィックスキャラクターにより、以下の表に従う。

数字 1 2 3 4 5 6
0 Odd Odd Odd Odd Odd Odd
1 Odd Odd Even Odd Even Even
2 Odd Odd Even Even Odd Even
3 Odd Odd Even Even Even Odd
4 Odd Even Odd Odd Even Even
5 Odd Even Even Odd Odd Even
6 Odd Even Even Even Odd Odd
7 Odd Even Odd Even Odd Even
8 Odd Even Odd Even Even Odd
9 Odd Even Even Odd Even Odd

例えば、プリフィックスキャラクターが0であれば、左側6桁は全てOddの欄で置き換えがなされる。4であれば、1と3と4桁目がOddで、2と5と6桁目がEvenで置き換えがなされることになる。

まとめ

フローチャート的にまとめると以下のようになる。

  1. 幅が113ドット以上の画像領域を確保する。順番に左から書き加えていく。
  2. 11ドット以上の空白を追加する。(00000000000)
  3. 3ドットのスタートコードを追加する。(101)
  4. プリフィックスキャラクターに従って、左側6桁を追加していく。(7ドット×6字=42ドット)
  5. 中心の5桁を追加する。(01010)
  6. 右側6桁を追加していく。(7ドット×(5+1)字=42ドット)
  7. 3ドットのストップコードを追加する。(101)
  8. 7ドット以上の空白を追加する。(0000000)

以上でドットの並び方は決まったので、それを適当に上下に伸ばして完成。