本文目录导读:
我来为您提供几种Python生成条形码的实用案例。
安装必要库
pip install python-barcode pip install Pillow # 用于图像处理
基础条形码生成案例
1 EAN-13 条形码
import barcode
from barcode import EAN13
from barcode.writer import ImageWriter
# 生成EAN-13条形码(12位数字,最后一位自动计算)
def generate_ean13():
# 12位数字(不含校验位)
code = '5901234123457'
# 创建条形码对象
ean = EAN13(code, writer=ImageWriter())
# 保存为PNG图片
ean.save('ean13_barcode')
print("EAN-13条形码已生成:ean13_barcode.png")
# 获取SVG格式
ean_svg = EAN13(code)
ean_svg.save('ean13_barcode_svg')
print("EAN-13条形码SVG已生成:ean13_barcode_svg.svg")
generate_ean13()
2 多种条形码格式
from barcode import get_barcode_class
from barcode.writer import ImageWriter
def generate_multiple_barcodes():
# 支持的条形码类型
barcode_types = ['code128', 'code39', 'ean13', 'ean8', 'upca']
for barcode_type in barcode_types:
# 获取条形码类
BarcodeClass = get_barcode_class(barcode_type)
try:
# 根据类型选择合适的数据
if barcode_type == 'ean13':
data = '5901234123457'
elif barcode_type == 'ean8':
data = '12345670'
elif barcode_type == 'upca':
data = '12345678901'
else:
data = 'ABC-12345-6789'
# 生成条形码
barcode_instance = BarcodeClass(data, writer=ImageWriter())
# 保存图片
filename = f'barcode_{barcode_type}'
barcode_instance.save(filename)
print(f"{barcode_type.upper()}条形码已生成:{filename}.png")
except Exception as e:
print(f"生成{barcode_type}失败: {e}")
generate_multiple_barcodes()
高级定制案例
1 自定义样式和尺寸
from barcode import EAN13
from barcode.writer import ImageWriter
from PIL import Image, ImageDraw, ImageFont
def customized_barcode():
# 自定义写入器选项
options = {
'module_width': 0.5, # 条码宽度
'module_height': 50, # 条码高度
'font_size': 20, # 字体大小
'text_distance': 5, # 文字距离
'quiet_zone': 6.5, # 空白区域
'background': 'white', # 背景颜色
'foreground': 'black', # 前景颜色
'write_text': True, # 是否显示文字
'center_text': True, # 文字居中
}
# 创建自定义写入器
writer = ImageWriter()
writer.set_options(options)
# 生成条形码
code = '5901234123457'
ean = EAN13(code, writer=writer)
ean.save('customized_barcode')
print("自定义条形码已生成:customized_barcode.png")
customized_barcode()
2 批量生成条形码
import pandas as pd
from barcode import get_barcode_class
from barcode.writer import ImageWriter
import os
def batch_generate_barcodes():
# 产品数据
products = [
{'code': '5901234123457', 'name': '产品A', 'price': 29.99},
{'code': '5901234123464', 'name': '产品B', 'price': 39.99},
{'code': '5901234123471', 'name': '产品C', 'price': 49.99},
]
# 创建输出目录
output_dir = 'barcodes'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 批量生成
for product in products:
try:
# 生成条形码
BarcodeClass = get_barcode_class('ean13')
barcode_instance = BarcodeClass(
product['code'],
writer=ImageWriter()
)
# 保存文件
filename = f"{output_dir}/{product['name']}_{product['code']}"
barcode_instance.save(filename)
print(f"已生成:{product['name']} - {product['code']}")
except Exception as e:
print(f"生成{product['name']}失败: {e}")
batch_generate_barcodes()
PDF报表中的条形码
from reportlab.lib import colors
from reportlab.graphics.barcode import code128
from reportlab.graphics.shapes import Drawing
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.graphics import renderPDF
def create_pdf_with_barcode():
# 创建PDF
c = canvas.Canvas("barcode_report.pdf", pagesize=A4)
width, height = A4
# 添加标题
c.setFont("Helvetica-Bold", 24)
c.drawString(100, height - 100, "产品条形码报表")
# 添加多个条形码
products = [
("产品A", "ABC-12345", 100, height - 200),
("产品B", "XYZ-67890", 100, height - 350),
("产品C", "QWE-54321", 100, height - 500),
]
for name, code, x, y in products:
# 添加产品名称
c.setFont("Helvetica", 14)
c.drawString(x, y, f"产品: {name}")
# 生成条形码
barcode = code128.Code128(code)
barcode.width = 200
barcode.height = 50
# 绘制条形码
barcode.drawOn(c, x, y - 70)
# 添加条形码编号
c.setFont("Helvetica", 10)
c.drawString(x, y - 130, f"条形码: {code}")
# 保存PDF
c.save()
print("PDF报表已生成:barcode_report.pdf")
create_pdf_with_barcode()
Web应用集成
from flask import Flask, send_file, request
from barcode import get_barcode_class
from barcode.writer import ImageWriter
import io
app = Flask(__name__)
@app.route('/generate_barcode')
def generate_barcode():
# 获取参数
code = request.args.get('code', '123456789012')
barcode_type = request.args.get('type', 'default')
# 映射到标准条形码类型
type_mapping = {
'ean13': 'ean13',
'ean8': 'ean8',
'code128': 'code128',
'code39': 'code39',
}
bc_type = type_mapping.get(barcode_type, 'code128')
try:
# 生成条形码
BarcodeClass = get_barcode_class(bc_type)
writer = ImageWriter()
# 创建内存中的字节流
buffer = io.BytesIO()
barcode_instance = BarcodeClass(code, writer=writer)
barcode_instance.write(buffer)
buffer.seek(0)
return send_file(
buffer,
mimetype='image/png',
as_attachment=False,
download_name=f'barcode_{code}.png'
)
except Exception as e:
return f"生成条形码失败: {str(e)}", 400
@app.route('/')
def index():
return '''
<html>
<head><title>条形码生成器</title></head>
<body>
<h1>条形码生成器</h1>
<form action="/generate_barcode" method="get">
输入数字:
<input type="text" name="code" value="123456789012">
<select name="type">
<option value="code128">Code 128</option>
<option value="ean13">EAN-13</option>
<option value="ean8">EAN-8</option>
<option value="code39">Code 39</option>
</select>
<input type="submit" value="生成条形码">
</form>
<br>
<img src="/generate_barcode?code=5901234123457&type=ean13" alt="示例条形码">
</body>
</html>
'''
if __name__ == '__main__':
app.run(debug=True)
使用第三条库:python-barcode 完整示例
from barcode import EAN13, Code128, Code39
from barcode.writer import ImageWriter
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, code, filename=None):
"""生成EAN-13条形码"""
if filename is None:
filename = f"ean13_{code}"
ean = EAN13(code, writer=ImageWriter())
filepath = os.path.join(self.output_dir, filename)
ean.save(filepath)
return f"{filepath}.png"
def generate_code128(self, code, filename=None):
"""生成Code128条形码"""
if filename is None:
filename = f"code128_{code.replace('/', '_')}"
code128 = Code128(code, writer=ImageWriter())
filepath = os.path.join(self.output_dir, filename)
code128.save(filepath)
return f"{filepath}.png"
def generate_code39(self, code, filename=None):
"""生成Code39条形码"""
if filename is None:
filename = f"code39_{code.replace('/', '_')}"
code39 = Code39(code, writer=ImageWriter(), add_checksum=False)
filepath = os.path.join(self.output_dir, filename)
code39.save(filepath)
return f"{filepath}.png"
def batch_generate(self, codes, barcode_type='ean13'):
"""批量生成条形码"""
results = []
for code in codes:
try:
if barcode_type == 'ean13':
filepath = self.generate_ean13(code)
elif barcode_type == 'code128':
filepath = self.generate_code128(code)
elif barcode_type == 'code39':
filepath = self.generate_code39(code)
else:
raise ValueError(f"未知的条形码类型: {barcode_type}")
results.append({
'code': code,
'filepath': filepath,
'status': '成功'
})
except Exception as e:
results.append({
'code': code,
'filepath': None,
'status': f'失败: {str(e)}'
})
return results
# 使用示例
if __name__ == '__main__':
generator = BarcodeGenerator()
# 单个生成
path = generator.generate_ean13('5901234123457')
print(f"生成EAN-13条形码: {path}")
path = generator.generate_code128('ABC-12345')
print(f"生成Code128条形码: {path}")
path = generator.generate_code39('CODE39TEST')
print(f"生成Code39条形码: {path}")
# 批量生成
codes = [
'5901234123457',
'5901234123464',
'5901234123471',
]
results = generator.batch_generate(codes, 'ean13')
for result in results:
print(f"条形码 {result['code']}: {result['status']} - {result['filepath']}")
这些示例涵盖了Python条形码生成的各种场景,您可以根据实际需求选择合适的方法,条形码在库存管理、产品标签、超市商品等领域非常实用。
标签: 条形码