使用 python3 和 reportlab 我正在尝试生成两列条形码:
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 优先顺序排列的,我只是不知道为什么。是否有我想启用/禁用的设置?
此外,它绝对不是条形码扫描仪,我将其重置为读取 code39 并在其他非 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 可能工作得很好,但是在查看他们的来源后,他们使用 1 和 0 表示真/假,并认为坚持他们的做法会更安全。