You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取ReportLab生成的Code 128条形码实际宽度?

获取ReportLab Code128条码的实际总宽度

我之前做类似需求的时候也踩过这个坑!你提到的barWidth确实只是条码里最窄条的宽度,完全不是我们需要的总宽度。其实ReportLab的条码对象提供了两种简单的方式来获取实际总宽度:

方法1:使用getBounds()方法

每个条码实例都有getBounds()方法,它会返回一个包含四个值的元组:(left, bottom, right, top),分别对应条码边界的左、下、右、上坐标(相对于条码自身的原点)。总宽度就是right - left的差值。

举个完整的实现例子,刚好匹配你要的A4右下角、5mm边距的需求:

from reportlab.pdfgen import canvas
from reportlab.graphics.barcode import code128
from reportlab.lib.units import mm

# 创建A4尺寸的PDF画布
pdf_canvas = canvas.Canvas("bottom_right_barcode.pdf", pagesize=(210*mm, 297*mm))

# 生成Code128条码,设置条码高度为10mm(可按需调整)
barcode = code128.Code128("YOUR_BARCODE_DATA", barHeight=10*mm)

# 获取条码边界,计算总宽度
left, bottom, right, top = barcode.getBounds()
barcode_total_width = right - left

# 计算右下角的绘制位置:A4宽度 - 5mm边距 - 条码宽度;y轴是5mm边距
margin = 5*mm
x_position = 210*mm - margin - barcode_total_width
y_position = margin

# 在指定位置绘制条码
barcode.drawOn(pdf_canvas, x_position, y_position)

# 保存PDF
pdf_canvas.save()

方法2:直接访问width属性

更简洁的方式是直接读取条码对象的width属性,这个属性已经帮你计算好了整个条码的总宽度(包含起始符、数据、校验位、终止符以及必要的空白区):

barcode_total_width = barcode.width

用这个值来计算位置和上面的逻辑完全一致,代码会更短一些。

为什么barWidth没用?

再补充解释下:barWidth是ReportLab条码类里的基础属性,它代表的是条码中最窄条/空的宽度,是用来计算整个条码尺寸的基础单位,而不是最终的总宽度。比如Code128的条码宽度是由这个基础宽度乘以一系列系数(对应不同条/空的宽度倍数)累加而来的,所以直接用它肯定得不到你要的总宽度。

内容的提问来源于stack exchange,提问作者Basj

火山引擎 最新活动