python3 と reportlab を使用して、バーコードの 2 つの列を生成しようとしています。
from reportlab.graphics.barcode import code39
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
c = canvas.Canvas("barcode_example.pdf", pagesize=A4)
code_list = [
'E100', 'RA100',
'E101', 'RA101',
'E102', 'RA102',
'E103', 'RA103',
'E104', 'RA104',
'E105', 'RA105',
'E106', 'RA106',
'E107', 'RA107',
'E108', 'RA108',
'E109', 'RA109']
x = 1 * mm
y = 278 * mm
x1 = 6.4 * mm
for i, code in enumerate(code_list):
barcode = code39.Extended39(code, barWidth=0.6*mm, barHeight=15*mm)
if i % 2 == 0:
barcode.drawOn(c, x, y)
x1 = x + 6.4 * mm
c.drawString(x1, y- 5 * mm, code)
else:
x1 = x + 100 * mm
barcode.drawOn(c, x1, y)
y = y - 5 * mm
c.drawString(x1 + 6.4 * mm, y, code)
y = y - 25 * mm
# if int(y) == 0:
# x = x + 50 * mm
# y = 285 * mm
c.showPage()
c.save()
ファイルを生成し、問題ないように見えますが、バーコードスキャナーでスキャンした後、次のように読み取ります。
E100F RA100
E101G RA101$
E102H RA102/
E103I RA103+
E104J RA104%
E105K RA1050
E106L RA1061
E107M RA1072
E108N RA1083
E109O RA1094
RA100 の後にスペースがあります。明らかにASCIIの優先順位に従っていますが、理由はわかりません。有効/無効にする設定はありますか?
また、それは間違いなくバーコード スキャナーではありません。コード 39 を読み取るようにリセットし、reportlab 以外で生成された他のバーコードでテストしたところ、問題なく動作しました。
ご協力ありがとうございました!
また、ここからコードを変更しました: https://stackoverflow.com/questions/2179269/python-barcode-generation-library
編集 code128 でテストしたところ、完全に機能しました。したがって、code39に固有のようです
編集2:そして私はばかです。私のバーコード スキャナーはチェックサム オプションをサポートしていません。reportlab でチェックサムを無効にすると、問題が解決しました。他の誰かがこの問題に遭遇した場合に備えて、これを残しておきます。
次の方法でチェックサムを無効にします。
barcode = code39.Extended39(code, barWidth=0.6*mm, barHeight=15*mm, checksum=0)
checksum=False はおそらく問題なく機能しますが、ソースを確認した後、true/false に 1 と 0 を使用し、慣行に従う方が安全であると判断しました。