本文目录导读:

我来为您介绍几种Python生成条形码的方法和案例。
使用 python-barcode 库(推荐)
安装
pip install python-barcode pillow
EAN-13 条形码生成
from barcode import EAN13
from barcode.writer import ImageWriter
# 生成EAN-13条形码(13位数字)
ean = EAN13("123456789012", writer=ImageWriter())
ean.save("ean13_barcode")
print("EAN-13条形码已生成: ean13_barcode.png")
Code128 条形码(支持文本)
from barcode import Code128
from barcode.writer import ImageWriter
# 生成Code128条形码(支持数字和字母)
code128 = Code128("ABC123456", writer=ImageWriter())
code128.save("code128_barcode")
print("Code128条形码已生成: code128_barcode.png")
自定义条形码样式
from barcode import Code39
from barcode.writer import ImageWriter
# 自定义输出参数
options = {
'module_width': 0.3, # 条码宽度
'module_height': 15.0, # 条码高度
'font_size': 12, # 字体大小
'text_distance': 5.0, # 文字距离
'quiet_zone': 6.0, # 静区
'background': 'white', # 背景颜色
'foreground': 'black', # 前景颜色
}
code39 = Code39("HELLO123", writer=ImageWriter())
# 生成SVG格式
code39.save("custom_barcode", options=options)
print("自定义条形码已生成")
使用 qrcode 生成二维码
import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer
# 生成基本二维码
data = "https://www.example.com"
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=4,
)
qr.add_data(data)
qr.make(fit=True)
# 生成图像
img = qr.make_image(fill_color="black", back_color="white")
img.save("basic_qrcode.png")
# 生成带样式的二维码
qr_styled = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr_styled.add_data(data)
qr_styled.make(fit=True)
img_styled = qr_styled.make_image(
image_factory=StyledPilImage,
module_drawer=RoundedModuleDrawer()
)
img_styled.save("styled_qrcode.png")
print("二维码已生成")
生成多个条形码并保存为PDF
from barcode import EAN13, Code128
from barcode.writer import ImageWriter
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from PIL import Image
import os
def generate_barcodes_to_pdf():
# 生成条形码列表
barcodes_data = [
("EAN13", "123456789012"),
("Code128", "PROD001"),
("Code128", "PROD002"),
]
barcode_images = []
for idx, (barcode_type, data) in enumerate(barcodes_data):
# 创建条形码
if barcode_type == "EAN13":
barcode = EAN13(data, writer=ImageWriter())
else:
barcode = Code128(data, writer=ImageWriter())
filename = f"temp_barcode_{idx}"
barcode.save(filename)
barcode_images.append(f"{filename}.png")
print(f"生成了 {barcode_type} 条形码: {data}")
# 创建PDF
c = canvas.Canvas("barcodes_catalog.pdf", pagesize=A4)
width, height = A4
y_position = height - 50
for i, img_file in enumerate(barcode_images):
if y_position < 100:
c.showPage()
y_position = height - 50
c.drawImage(img_file, 50, y_position - 50, width=200, height=80)
y_position -= 120
c.save()
# 清理临时文件
for img_file in barcode_images:
if os.path.exists(img_file):
os.remove(img_file)
print("PDF已生成: barcodes_catalog.pdf")
generate_barcodes_to_pdf()
批量生成商品条形码(实战案例)
from barcode import EAN13
from barcode.writer import ImageWriter
import pandas as pd
import os
class BarcodeGenerator:
def __init__(self, output_dir="generated_barcodes"):
self.output_dir = output_dir
if not os.path.exists(output_dir):
os.makedirs(output_dir)
def generate_ean13(self, product_id, save=True):
"""生成单个EAN-13条形码"""
# EAN-13需要13位数字,补足位数
ean_code = str(product_id).zfill(12) + "0" # 最后一位是校验位
ean = EAN13(ean_code, writer=ImageWriter())
if save:
filename = os.path.join(self.output_dir, f"product_{product_id}")
ean.save(filename)
return f"{filename}.png"
return ean
def batch_generate_from_csv(self, csv_file):
"""从CSV文件批量生成条形码"""
df = pd.read_csv(csv_file)
results = []
for _, row in df.iterrows():
product_id = row.get('product_id')
product_name = row.get('product_name', f"Product_{product_id}")
if product_id:
filename = self.generate_ean13(product_id)
results.append({
'product_id': product_id,
'product_name': product_name,
'barcode_file': filename
})
print(f"生成条形码: {product_name} -> {filename}")
return pd.DataFrame(results)
def generate_inventory_labels(self, products):
"""生成库存标签"""
labels = []
for product in products:
barcode = self.generate_ean13(product['id'], save=False)
labels.append({
'name': product['name'],
'barcode': barcode,
'price': product.get('price', 0)
})
return labels
# 使用示例
generator = BarcodeGenerator()
# 批量生成
products_data = [
{'id': 1001, 'name': '商品A', 'price': 29.99},
{'id': 1002, 'name': '商品B', 'price': 39.99},
{'id': 1003, 'name': '商品C', 'price': 49.99},
]
labels = generator.generate_inventory_labels(products_data)
for label in labels:
print(f"商品: {label['name']}, 价格: {label['price']}")
生成带背景的条形码标签
from barcode import Code128
from barcode.writer import ImageWriter
from PIL import Image, ImageDraw, ImageFont
def create_label_with_barcode(product_name, price, barcode_data, output_file):
"""创建带条形码的商品标签"""
# 生成条形码
code128 = Code128(barcode_data, writer=ImageWriter())
barcode_img = code128.render(writer_options={
'module_width': 0.4,
'module_height': 10,
'font_size': 10,
'text_distance': 2,
'quiet_zone': 4,
})
# 创建标签背景
label_width = 400
label_height = 300
label = Image.new('RGB', (label_width, label_height), 'white')
draw = ImageDraw.Draw(label)
# 添加边框
draw.rectangle([5, 5, label_width-5, label_height-5], outline='black', width=2)
# 添加商品名称
draw.text((20, 20), f"商品: {product_name}", fill='black')
draw.text((20, 50), f"价格: ¥{price:.2f}", fill='black')
# 将条形码粘贴到标签上
barcode_img = barcode_img.resize((350, 100))
label.paste(barcode_img, (25, 80))
# 添加公司信息
draw.text((20, 200), "感谢购买!", fill='gray')
# 保存标签
label.save(output_file)
print(f"标签已生成: {output_file}")
# 使用示例
create_label_with_barcode(
product_name="示例商品",
price=99.99,
barcode_data="ITEM12345",
output_file="product_label.png"
)
支持的条形码类型
- EAN-13: 13位数字,常用于零售商品
- EAN-8: 8位数字,用于小商品
- Code 39: 支持字母数字
- Code 128: 支持所有ASCII字符
- UPC-A: 12位数字,北美标准
注意事项
- 条形码验证: 确保数据符合条形码规范
- 图像质量: 设置合适的dpi以保证打印质量
- 静区: 条形码周围需要保留空白区域
- 校验位: 某些条形码类型需要计算校验位
这些案例涵盖了从简单的条形码生成到批量处理的完整方案,您可以根据实际需求选择合适的实现方式。