Python案例如何实现条形码生成?

wen python案例 1

本文目录导读:

Python案例如何实现条形码生成?

  1. 方法一:使用 python-barcode 库(推荐)
  2. 方法二:带自定义样式的条形码
  3. 方法三:使用 pyqrcode + 条形码
  4. 方法四:生成PDF格式的条形码
  5. 完整示例:商品条形码生成系统
  6. 注意事项

我来介绍几种在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']}")

注意事项

  1. 选择合适的编码类型

    • EAN-13:商品零售,13位数字
    • Code128:最通用,支持所有ASCII字符
    • Code39:支持字母数字
  2. 条形码验证

    def validate_barcode(code, barcode_type='EAN13'):
     if barcode_type == 'EAN13':
         if len(code) != 13 or not code.isdigit():
             return False
         # 校验码验证
         # ...
     return True
  3. 输出格式选择

    • PNG:图像格式,适合打印
    • SVG:矢量格式,适合网页
    • PDF:适合文档整合

这些方法能满足大部分条形码生成需求,根据具体使用场景选择合适的库和参数即可。

抱歉,评论功能暂时关闭!