7

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 を使用し、慣行に従う方が安全であると判断しました。

4

0 に答える 0