日本人のためのCode128のバーコードをPython を使って作成する。無料でバーコードフォントのダウンロードが可能

2024年11月7日

パターンファイルを作ると簡単に作成できるのでCode128作ってみました

Code128

Code 128バーコードの構造には、スタートコードデータコードチェックキャラクタストップコードが含まれます。チェックサムの計算にはモジュラス103が使用され、データの整合性を検証します。

Code 128バーコードの構造

  1. スタートコード
  • データの開始を示し、使用するコードセット(Code Set A, B, Cのいずれか)を指定します。
  • 各コードセットには固有のスタートコードがあり、それによって文字セットA、B、Cが選択されます。
  1. データコード
  • エンコードされる実際のデータ(文字列)です。スタートコードに従って、コードセットA、B、Cに基づくエンコードが行われます。
  1. チェックキャラクタ
  • チェックサム(モジュラス103)で計算される1文字分のコードです。データコードが正確にエンコードされていることを検証するために使用されます。
  1. ストップコード
  • バーコードの終了を示すコードです。固定のストップパターン(1100011101011)で表現されます。

チェックサム計算(モジュラス103)

Code 128のチェックキャラクタは、以下の手順で計算されます。

チェックサムの計算方法

  1. スタートコードの値を設定します(例: Code Aは103、Code Bは104、Code Cは105)。
  2. スタートコードの値に1を掛けたものを基準値とします(初期値として設定)。
  3. 次に、各データコードの数値(Code 128表で定義された値)に、その文字の位置インデックス(データコードからの順番)を掛けたものを合計します。
  4. 最後に、その合計を103で割った余り(モジュラス103)を求めます。これがチェックキャラクタの値です。

Code 128のチェックキャラクターの計算を、具体的な手順で示します。例として、「Code Set B」を使用して「HELLO」をエンコードする場合を考え、各ステップの計算を行います。

Code 128のチェックキャラクター計算手順

Code 128では、チェックキャラクターをモジュラス103で計算します。計算手順は以下の通りです。

1. スタートコードの値を設定

  • 今回はCode Set Bを使用するので、スタートコードの値は「104」 です。

2. 計算の初期値(基準値)として、スタートコードの値に「1」を掛けたものを使います。

  • スタートコードの値:104
  • スタートコードの位置インデックス:1

このため、最初の基準値
104 x 1 = 104

3. 各データ文字の数値とその位置インデックスを掛け合わせ、順次合計します。

  • 文字列「HELLO」をエンコードします。
  • 各文字のCode 128での値と位置インデックスは以下

チェックサムの例

たとえば、「Code Set B」で「HELLO」をエンコードする場合:

  • スタートコード (Code B) = 104
  • 文字「H」の値 = 40
  • 文字「E」の値 = 37
  • 文字「L」の値 = 44
  • 文字「L」の値 = 44
  • 文字「O」の値 = 47

各ステップでチェックサムを計算します。

  1. スタートコードの値:104 × 1 = 104
  2. 文字「H」の値:40 × 1 = 40
  3. 文字「E」の値:37 × 2 = 74
  4. 文字「L」の値:44 × 3 = 132
  5. 文字「L」の値:44 × 4 = 176
  6. 文字「O」の値:47 × 5 = 235

合計は 104 + 40 + 74 + 132 + 176 + 235 = 761

したがって、チェックキャラクタの値は 761 mod 103 = 40「H」になります。

Code 128の各文字のパターン

Code Set AとBで共通の文字

文字パターン
Space11011001100
!11001101100
11001100110
#10010011000
$10010001100
%10001001100
&10011001000
'10011000100
(10001100100
)11001001000
*11001000100
+11000100100
,10110011100
10011011100
.10011001110
/10111001100
010011101100
110011100110
211001110010
311001011100
411001001110
511011100100
611001110100
711101101110
811101001100
911100101100
:11100100110
;11101100100
<11100110100
=11100110010
>11011011000
?11011000110
@11000110110
A10100011000
B10001011000
C10001000110
D10110001000
E10001101000
F10001100010
G11010001000
H11000101000
I11000100010
J10110111000
K10110001110
L10001101110
M10111011000
N10111000110
O10001110110
P11101110110
Q11010001110
R11000101110
S11011101000
T11011100010
U11011101110
V11101011000
W11101000110
X11100010110
Y11101101000
Z11101100010
[11100011010
\11101111010
]11001000010
^11110001010
_10100110000
`10100001100
a10010110000
b10010000110
c10000101100
d10000100110
e10110010000
f10110000100
g10011010000
h10011000010
i10000110100
j10000110010
k11000010010
l11001010000
m11110111010
n11000010100
o10001111010
p10100111100
q10010111100
r10010011110
s10111100100
t10011110100
u10011110010
v11110100100
w11110010100
x11110010010
y11011011110
z11011110110
{11110110110
}10100011110
~10001011110

特殊機能と制御文字

文字パターン
FNC1(1)11110101110
FNC2(2)111010111010
FNC3(3)111010001010
FNC4(4)111010111001
SHIFT(S)101101111111
CODEA(a)101010011111
CODEB(b)101001011111
CODEC(c)110111001011
START(CODEA) (A)11010000100
START(CODEB) (B)11010010000
START(CODEC) (C)11010011100
DEL (D)10111101000
STOP (E)1100011101011

このリストは、Code 128バーコードで使用される全ての半角英数字および特殊文字のパターンを示しています。制御文字や機能文字(FNC1〜FNC4、SHIFT、CODEA、CODEB、CODEC)など、特定の操作に必要な文字も含まれています。

プログラム

このプログラムは1モジュール36ポイントで作っています

フォントの高さは1000ポイントです

全角文字を読み込むため UTF 8のパターンをファイルにします

そのためプログラムを一部変更しています

import csv
import os

# 文字列を16進数に変換し、"0x" をつける
def string_to_hex(s):
    hex_value = ''.join([format(ord(c), 'x') for c in s])  # 文字列をUTF-8バイト列の16進数に変換
    return f"0x{hex_value}"  # "0x"を先頭につけて返す

# CSVからデータを読み込み、指定のフォルダにSVGファイルを生成
def generate_svg_from_csv(csv_file_path, output_folder):
    # フォルダが存在しない場合は作成する
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    # CSVファイルを読み込み
    with open(csv_file_path, mode='r', encoding='utf-8') as file:
        reader = csv.reader(file)
        for row in reader:
            binary_string = row[0]  # 1列目の文字列を取得
            hex_value = string_to_hex(row[1])  # 2列目の文字列を16進数に変換
            file_name = f"{hex_value}.svg"  # 変換した16進数をファイル名にする
            
            # SVGデータを生成
            svg_data = generate_svg_from_string(binary_string)
            
            # 出力ファイルのパスを作成
            file_path = os.path.join(output_folder, file_name)
            
            # SVGファイルとして保存
            with open(file_path, 'w') as svg_file:
                svg_file.write(svg_data)

# SVGデータを生成する関数
#def generate_svg_from_string(binary_string, width=12, height=832):
def generate_svg_from_string(binary_string, width=36, height=1000):
#    if  len(binary_string) != 7:
#        height+=24
    # SVGのヘッダー部分
    svg_header = '<?xml version="1.0" standalone="no"?>\n'
    svg_open = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 {} {}">\n'.format(len(binary_string) * width, 1024)
    svg_close = '</svg>'
    svg_path_open = '   <path fill="black"\n'
    svg_path_d = 'd="'
    
    # 文字列をループして「1」に対する黒の四角を作成
    for index, char in enumerate(binary_string):
        if char == '1':
            x_position = index * width
            svg_path_d += 'M{} 0v{}h{}v-{}h-{}z'.format(x_position, height, width, height, width)
    
    # pathタグを閉じる
    svg_path_d += '" />\n'
    
    # すべてのパーツを結合してSVGデータを完成
    svg_content = svg_header + svg_open + svg_path_open + svg_path_d + svg_close
    return svg_content

# 実行例: CSVファイルを読み込み、指定フォルダにSVGファイルを生成
csv_file_path = 'input4.csv'  # CSVファイルのパス
output_folder = 'output_svgs'  # SVGファイルを保存するフォルダ
generate_svg_from_csv(csv_file_path, output_folder)

フォントのダウンロード

チェックコードが必要なためご自身で計算してチェックコードをセットしてください

使い方

HELLOを表示したい時

HELLOH

他の制御コードの設定

半角カタカナや他の半角も対応しています

95delÀ10111101000 
96Fnc 33Á10111100010 
97Fnc 22Â11110101000 
98ShiftÃ11110100010 
99Code CÄ10111011110 
100Fnc 44Å10111101110 
101Code AÆ11101011110 
102Fnc 11Ç11110101110 
103Start AÈ11010000100 
104Start BÉ11010010000 
105Start CÊ11010011100 
106StopË1100011101011 

参考

バーコード CODE128 のフォント作ってしまいました。 – blog

font,Python

Posted by eightban