本文目录导读:

我来介绍几种在Python中生成条形码的方法:
使用 python-barcode 库(推荐)
安装
pip install python-barcode
基本使用
from barcode import EAN13, Code128, Code39
from barcode.writer import ImageWriter
# 1. 生成EAN-13条形码
def generate_ean13():
# EAN-13需要13位数字,最后一位是校验码
code = '5901234123457'
ean = EAN13(code, writer=ImageWriter())
ean.save('ean13_barcode')
print("EAN-13条形码已生成")
# 2. 生成Code128条形码
def generate_code128():
from barcode import Code128
code = 'ABC-1234-DEFG'
code128 = Code128(code, writer=ImageWriter())
code128.save('code128_barcode')
print("Code128条形码已生成")
# 3. 生成Code39条形码
def generate_code39():
code = 'HELLO123'
code39 = Code39(code, writer=ImageWriter())
code39.save('code39_barcode')
print("Code39条形码已生成")
# 4. 完整示例:批量生成
def batch_generate():
codes = [
('123456789012', 'product_1'), # (条形码数据, 文件名)
('987654321098', 'product_2'),
('ABC-567', 'product_3')
]
for code_data, filename in codes:
try:
if code_data.isdigit() and len(code_data) == 12:
# EAN-13自动添加校验码
from barcode import EAN13
barcode = EAN13(code_data, writer=ImageWriter())
else:
# 使用Code128支持字母和数字
from barcode import Code128
barcode = Code128(code_data, writer=ImageWriter())
barcode.save(filename)
print(f"已生成: {filename}.png")
except Exception as e:
print(f"生成 {code_data} 失败: {e}")
带自定义样式的条形码
from barcode import Code128
from barcode.writer import ImageWriter
from PIL import Image, ImageDraw, ImageFont
def generate_styled_barcode():
# 自定义样式
options = {
'module_width': 0.2, # 模块宽度
'module_height': 15.0, # 模块高度
'quiet_zone': 6.5, # 静区
'font_size': 10, # 字体大小
'text_distance': 5.0, # 文字距离
'background': 'white', # 背景色
'foreground': 'black', # 前景色
'write_text': True, # 是否写入文字
'center_text': True, # 文字居中
}
writer = ImageWriter()
code = 'PRODUCT-001'
barcode = Code128(code, writer=writer)
# 生成并保存
barcode.save('styled_barcode', options=options)
# 添加额外信息
img = Image.open('styled_barcode.png')
draw = ImageDraw.Draw(img)
# 在条形码下方添加价格信息
draw.text((50, 130), 'Price: $19.99', fill='black')
img.save('styled_barcode_with_price.png')
print("带样式的条形码已生成")
使用 pyqrcode + 条形码
import tempfile
from barcode import Code128
from barcode.writer import ImageWriter
from PIL import Image
def create_barcode_with_logo():
# 生成条形码
code = 'QRCODE-123'
writer = ImageWriter()
barcode = Code128(code, writer=writer)
# 保存到临时文件
temp_file = tempfile.NamedTemporaryFile(suffix='.png', delete=False)
barcode.write(temp_file, {
'module_width': 0.3,
'module_height': 20.0,
})
# 可以在这里添加logo或其他元素
print("条形码已生成")
生成PDF格式的条形码
from barcode import Code128
from barcode.writer import SVGWriter
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
def generate_pdf_with_barcode():
from io import BytesIO
# 生成SVG格式条形码
code = 'INVOICE-2024-001'
writer = SVGWriter()
barcode = Code128(code, writer=writer)
# 将条形码保存为SVG字符串
svg_data = barcode.render()
# 创建PDF
c = canvas.Canvas("barcode_invoice.pdf", pagesize=A4)
width, height = A4
# 添加标题
c.setFont("Helvetica-Bold", 16)
c.drawString(50, height - 50, "Invoice #2024-001")
# 添加条形码(需要将SVG转换为图像)
# 这里简化处理,直接使用PNG
barcode_png = Code128(code, writer=ImageWriter())
barcode_png.save('temp_barcode')
c.drawImage('temp_barcode.png', 50, height - 150, width=200, height=100)
# 添加其他内容
c.setFont("Helvetica", 12)
c.drawString(50, height - 200, "Product: Sample Item")
c.drawString(50, height - 220, "Price: $99.99")
c.drawString(50, height - 240, "Date: 2024-01-15")
c.save()
print("PDF已生成")
完整示例:商品条形码生成系统
import os
import datetime
from barcode import Code128, EAN13
from barcode.writer import ImageWriter
from PIL import Image, ImageDraw, ImageFont
class BarcodeGenerator:
def __init__(self, output_dir='barcodes'):
self.output_dir = output_dir
if not os.path.exists(output_dir):
os.makedirs(output_dir)
def generate_product_barcode(self, product_id, product_name, price):
"""生成商品条形码"""
# 创建输出文件名
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"{product_name}_{timestamp}"
filepath = os.path.join(self.output_dir, filename)
# 生成条形码
writer = ImageWriter()
# 根据产品ID长度选择编码方式
if len(product_id) == 12 and product_id.isdigit():
barcode = EAN13(product_id, writer=writer)
else:
barcode = Code128(product_id, writer=writer)
# 保存条形码
barcode.save(filepath, {
'module_width': 0.2,
'module_height': 20.0,
'font_size': 12,
'text_distance': 5,
})
# 添加商品信息
img = Image.open(f"{filepath}.png")
draw = ImageDraw.Draw(img)
# 可以在这里添加字体
try:
font = ImageFont.truetype("arial.ttf", 12)
except:
font = ImageFont.load_default()
# 添加商品信息
draw.text((10, img.height - 20), f"ID: {product_id}", fill='black', font=font)
draw.text((10, img.height - 35), f"Price: ${price:.2f}", fill='black', font=font)
# 保存最终图像
img.save(f"{filepath}_final.png")
return f"{filepath}_final.png"
def batch_generation(self, products):
"""批量生成条形码"""
results = []
for product in products:
try:
result = self.generate_product_barcode(
product['id'],
product['name'],
product['price']
)
results.append({
'product': product['name'],
'file': result,
'status': 'success'
})
except Exception as e:
results.append({
'product': product['name'],
'error': str(e),
'status': 'failed'
})
return results
# 使用示例
if __name__ == "__main__":
# 创建生成器
generator = BarcodeGenerator()
# 单个商品
barcode_file = generator.generate_product_barcode(
'PROD-2024-001',
'SampleProduct',
29.99
)
print(f"条形码已生成: {barcode_file}")
# 批量生成
products = [
{'id': 'PROD-001', 'name': 'Laptop', 'price': 999.99},
{'id': 'PROD-002', 'name': 'Mouse', 'price': 29.99},
{'id': 'PROD-003', 'name': 'Keyboard', 'price': 79.99},
]
results = generator.batch_generation(products)
for result in results:
print(f"{result['product']}: {result['status']}")
if result['status'] == 'success':
print(f" 文件: {result['file']}")
注意事项
-
选择合适的编码类型:
- EAN-13:商品零售,13位数字
- Code128:最通用,支持所有ASCII字符
- Code39:支持字母数字
-
条形码验证:
def validate_barcode(code, barcode_type='EAN13'): if barcode_type == 'EAN13': if len(code) != 13 or not code.isdigit(): return False # 校验码验证 # ... return True -
输出格式选择:
- PNG:图像格式,适合打印
- SVG:矢量格式,适合网页
- PDF:适合文档整合
这些方法能满足大部分条形码生成需求,根据具体使用场景选择合适的库和参数即可。