日本人のためのCode128のバーコードをPython を使って作成する。無料でバーコードフォントのダウンロードが可能
パターンファイルを作ると簡単に作成できるのでCode128作ってみました
Code128
Code 128バーコードの構造には、スタートコード、データコード、チェックキャラクタ、ストップコードが含まれます。チェックサムの計算にはモジュラス103が使用され、データの整合性を検証します。
Code 128バーコードの構造
- スタートコード:
- データの開始を示し、使用するコードセット(Code Set A, B, Cのいずれか)を指定します。
- 各コードセットには固有のスタートコードがあり、それによって文字セットA、B、Cが選択されます。
- データコード:
- エンコードされる実際のデータ(文字列)です。スタートコードに従って、コードセットA、B、Cに基づくエンコードが行われます。
- チェックキャラクタ:
- チェックサム(モジュラス103)で計算される1文字分のコードです。データコードが正確にエンコードされていることを検証するために使用されます。
- ストップコード:
- バーコードの終了を示すコードです。固定のストップパターン(
1100011101011
)で表現されます。
チェックサム計算(モジュラス103)
Code 128のチェックキャラクタは、以下の手順で計算されます。
チェックサムの計算方法
- スタートコードの値を設定します(例: Code Aは
103
、Code Bは104
、Code Cは105
)。 - スタートコードの値に1を掛けたものを基準値とします(初期値として設定)。
- 次に、各データコードの数値(Code 128表で定義された値)に、その文字の位置インデックス(データコードからの順番)を掛けたものを合計します。
- 最後に、その合計を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
各ステップでチェックサムを計算します。
- スタートコードの値:
104 × 1 = 10
4 - 文字「H」の値:
40 × 1 = 40
- 文字「E」の値:
37 × 2 = 74
- 文字「L」の値:
44 × 3 = 132
- 文字「L」の値:
44 × 4 = 176
- 文字「O」の値:
47 × 5 = 235
合計は 104 + 40 + 74 + 132 + 176 + 235 =
761
したがって、チェックキャラクタの値は 761 mod 103 = 40「H」になります。
Code 128の各文字のパターン
Code Set AとBで共通の文字
文字 | パターン |
---|---|
Space | 11011001100 |
! | 11001101100 |
“ | 11001100110 |
# | 10010011000 |
$ | 10010001100 |
% | 10001001100 |
& | 10011001000 |
' | 10011000100 |
( | 10001100100 |
) | 11001001000 |
* | 11001000100 |
+ | 11000100100 |
, | 10110011100 |
– | 10011011100 |
. | 10011001110 |
/ | 10111001100 |
0 | 10011101100 |
1 | 10011100110 |
2 | 11001110010 |
3 | 11001011100 |
4 | 11001001110 |
5 | 11011100100 |
6 | 11001110100 |
7 | 11101101110 |
8 | 11101001100 |
9 | 11100101100 |
: | 11100100110 |
; | 11101100100 |
< | 11100110100 |
= | 11100110010 |
> | 11011011000 |
? | 11011000110 |
@ | 11000110110 |
A | 10100011000 |
B | 10001011000 |
C | 10001000110 |
D | 10110001000 |
E | 10001101000 |
F | 10001100010 |
G | 11010001000 |
H | 11000101000 |
I | 11000100010 |
J | 10110111000 |
K | 10110001110 |
L | 10001101110 |
M | 10111011000 |
N | 10111000110 |
O | 10001110110 |
P | 11101110110 |
Q | 11010001110 |
R | 11000101110 |
S | 11011101000 |
T | 11011100010 |
U | 11011101110 |
V | 11101011000 |
W | 11101000110 |
X | 11100010110 |
Y | 11101101000 |
Z | 11101100010 |
[ | 11100011010 |
\ | 11101111010 |
] | 11001000010 |
^ | 11110001010 |
_ | 10100110000 |
` | 10100001100 |
a | 10010110000 |
b | 10010000110 |
c | 10000101100 |
d | 10000100110 |
e | 10110010000 |
f | 10110000100 |
g | 10011010000 |
h | 10011000010 |
i | 10000110100 |
j | 10000110010 |
k | 11000010010 |
l | 11001010000 |
m | 11110111010 |
n | 11000010100 |
o | 10001111010 |
p | 10100111100 |
q | 10010111100 |
r | 10010011110 |
s | 10111100100 |
t | 10011110100 |
u | 10011110010 |
v | 11110100100 |
w | 11110010100 |
x | 11110010010 |
y | 11011011110 |
z | 11011110110 |
{ | 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を表示したい時
BHELLOHE
他の制御コードの設定
半角カタカナや他の半角も対応しています
95 | del | D | ア | À | 10111101000 | |
96 | Fnc 3 | 3 | イ | Á | 10111100010 | |
97 | Fnc 2 | 2 | ウ | Â | 11110101000 | |
98 | Shift | S | エ | Ã | 11110100010 | |
99 | Code C | c | オ | Ä | 10111011110 | |
100 | Fnc 4 | 4 | カ | Å | 10111101110 | |
101 | Code A | a | キ | Æ | 11101011110 | |
102 | Fnc 1 | 1 | ク | Ç | 11110101110 | |
103 | Start A | A | ケ | È | 11010000100 | |
104 | Start B | B | コ | É | 11010010000 | |
105 | Start C | C | サ | Ê | 11010011100 | |
106 | Stop | E | シ | Ë | 1100011101011 |
ディスカッション
コメント一覧
まだ、コメントがありません