Python条形码生成

news2024/9/21 18:36:20

条形码基础知识

在开始编码之前,让我们先了解一下条形码的基本概念。条形码本质上是一种将数据编码成可视模式的方法,通常由一系列平行的黑色条和白色空格组成。常见的条形码类型包括:

  1. UPC(通用产品代码)

  2. EAN(欧洲商品编码)

  3. Code 128

  4. QR码(虽然严格来说不是条形码,但经常与之并列讨论)

每种类型都有其特定的用途和编码规则。在本文中,我们将主要关注最常见的线性条形码。

环境准备

首先,我们需要安装必要的库。在这个项目中,我们将使用python-barcode库来生成条形码。

pip install python-barcode

如果你还想生成条形码图像,还需要安装Pillow库:

pip install Pillow

基本实现:生成简单的条形码

让我们从最基本的实现开始:

from barcode import EAN13
from barcode.writer import ImageWriter

def generate_barcode(code, filename):
    # 创建EAN-13条形码对象
    my_code = EAN13(code, writer=ImageWriter())
    
    # 保存条形码为图像文件
    my_code.save(filename)

# 使用示例
generate_barcode('5901234123457', 'my_barcode')

这段代码做了以下几件事:

  1. barcode模块导入EAN13类和ImageWriter

  2. 定义一个函数generate_barcode,它接受条形码数据和文件名作为参数。

  3. 创建一个EAN-13条形码对象,并使用ImageWriter将其保存为图像。

运行这段代码后,你会在当前目录下看到一个名为my_barcode.png的文件,这就是生成的条形码图像。

进阶:自定义条形码样式

在实际项目中,我们经常需要自定义条形码的外观。以下是一个更高级的实现,展示了如何自定义条形码的颜色、大小和文本:

from barcode import Code128
from barcode.writer import ImageWriter
from PIL import Image, ImageDraw, ImageFont

def custom_barcode(code, filename, text_color=(0, 0, 0), bar_color=(0, 0, 0), bg_color=(255, 255, 255), width=300, height=100):
    # 创建Code128条形码对象
    barcode = Code128(code, writer=ImageWriter())
    
    # 自定义选项
    options = {
        'module_width': 0.2,
        'module_height': 8,
        'quiet_zone': 1,
        'font_size': 10,
        'text_distance': 5,
        'background': bg_color,
        'foreground': bar_color,
        'write_text': False,
    }
    
    # 生成条形码图像
    barcode_image = barcode.render(options)
    
    # 创建新的图像,设置背景颜色
    final_image = Image.new('RGB', (width, height), bg_color)
    
    # 将条形码图像粘贴到新图像上
    x_offset = (width - barcode_image.width) // 2
    y_offset = (height - barcode_image.height) // 2
    final_image.paste(barcode_image, (x_offset, y_offset))
    
    # 添加自定义文本
    draw = ImageDraw.Draw(final_image)
    font = ImageFont.load_default()
    text_width = draw.textlength(code, font=font)
    text_x = (width - text_width) // 2
    text_y = height - 20
    draw.text((text_x, text_y), code, font=font, fill=text_color)
    
    # 保存最终图像
    final_image.save(f"{filename}.png")
    print(f"Custom barcode saved as {filename}.png")

# 使用示例
custom_barcode("PYTHON2023", "custom_barcode", text_color=(0, 0, 255), bar_color=(0, 0, 0), bg_color=(220, 220, 220), width=300, height=150)

这个高级版本引入了几个重要的改进:

  1. 使用Code128条形码类型,它支持更广泛的字符。

  2. 允许自定义条形码的颜色、大小和背景。

  3. 在条形码下方添加自定义文本。

  4. 使用Pillow库进行更精细的图像处理。

实战经验:批量生成条形码

在实际项目中,我们可能需要批量生成大量条形码。以下是一个实用的脚本,可以从CSV文件读取数据并批量生成条形码:

import csv
from barcode import Code128
from barcode.writer import ImageWriter
import os

def batch_generate_barcodes(csv_file, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    with open(csv_file, 'r') as file:
        reader = csv.reader(file)
        next(reader)  # 跳过标题行
        for row in reader:
            code = row[0]  # 假设条形码数据在第一列
            filename = os.path.join(output_folder, f"barcode_{code}")
            
            barcode = Code128(code, writer=ImageWriter())
            barcode.save(filename)
            
            print(f"Generated barcode for {code}")

# 使用示例
batch_generate_barcodes('product_codes.csv', 'barcodes_output')

这个脚本的特点包括:

  1. 从CSV文件读取数据,适用于大规模数据处理。

  2. 自动创建输出文件夹,提高了脚本的健壮性。

  3. 使用有意义的文件名,便于后续管理和使用。

高级技巧:条形码验证

在生成条形码时,确保数据的正确性至关重要。以下是一个包含验证功能的高级示例:

from barcode import EAN13, Code128
from barcode.errors import BarcodeError

def validate_and_generate(code, barcode_type='ean13', filename='barcode'):
    try:
        if barcode_type.lower() == 'ean13':
            # EAN13需要12位数字,最后一位是校验位
            if len(code) != 12 or not code.isdigit():
                raise ValueError("EAN13 requires 12 digits")
            barcode_class = EAN13
        elif barcode_type.lower() == 'code128':
            # Code128可以包含字母和数字
            if not code.isalnum():
                raise ValueError("Code128 should only contain alphanumeric characters")
            barcode_class = Code128
        else:
            raise ValueError("Unsupported barcode type")
        
        # 生成条形码
        my_code = barcode_class(code, writer=ImageWriter())
        my_code.save(filename)
        print(f"Barcode generated successfully: {filename}")
    
    except BarcodeError as e:
        print(f"Barcode generation error: {e}")
    except ValueError as e:
        print(f"Validation error: {e}")

# 使用示例
validate_and_generate('590123412345', 'ean13', 'valid_ean13')
validate_and_generate('PYTHON2023', 'code128', 'valid_code128')
validate_and_generate('123456', 'ean13', 'invalid_ean13')  # 这将引发错误

这个高级示例引入了几个重要的概念:

  1. 根据不同的条形码类型进行特定的验证。

  2. 使用异常处理来捕获和处理各种错误情况。

  3. 提供清晰的错误消息,有助于调试和用户反馈。

性能优化:异步生成

当需要生成大量条形码时,我们可以利用Python的异步特性来提高性能

import asyncio
import aiofiles
from barcode import Code128
from barcode.writer import ImageWriter
import os

async def generate_barcode_async(code, output_folder):
    filename = os.path.join(output_folder, f"barcode_{code}")
    barcode = Code128(code, writer=ImageWriter())
    
    # 异步保存文件
    async with aiofiles.open(f"{filename}.png", "wb") as f:
        await f.write(barcode.render())
    
    print(f"Generated barcode for {code}")

async def batch_generate_barcodes_async(codes, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    tasks = [generate_barcode_async(code, output_folder) for code in codes]
    await asyncio.gather(*tasks)

# 使用示例
codes = ['CODE1', 'CODE2', 'CODE3', 'CODE4', 'CODE5']
asyncio.run(batch_generate_barcodes_async(codes, 'async_barcodes_output'))

这个异步版本使用了asyncioaiofiles库来并行处理多个条形码生成任务,可以显著提高处理大量条形码时的性能。

总结

条形码生成是一个看似简单但实际上涉及多个方面的任务。从基本的生成到高级的自定义、验证和优化,每一步都为我们提供了学习和改进的机会。在实际项目中,我发现以下几点特别重要:

  1. 数据验证:始终验证输入数据的正确性,这对于生成有效的条形码至关重要。

  2. 灵活性:设计你的代码以支持不同类型的条形码和自定义需求。

  3. 性能考虑:当需要处理大量数据时,考虑使用异步处理或多线程来提高效率。

  4. 错误处理:实现健壮的错误处理机制,以应对各种可能的异常情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2115660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

828华为云征文|华为云Flexus X实例部署k3s与kuboard图形化管理工具

828华为云征文|华为云Flexus X实例部署k3s与kuboard图形化管理工具 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定…

数据结构(邓俊辉)学习笔记】排序 6——希尔排序:框架 + 实例

文章目录 1. 策略2.实例3.循秩访问4. 插入排序5.Shell序列 1. 策略 来学习一种非常别致的排序算法,也就是希尔排序。 希尔排序算法既有着悠久的历史,同时也仍然不失活力。该算法的别致之处在于,它不再是将输入视作为一个一维的序列&#x…

SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法

JUnit单元测试用例中使用Spring框架,之前我的使用方式很直接。 /*** 用于需要用到Spring的测试用例基类* * author lihzh* alia OneCoder* blog http://www.coderli.com*/ RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locations { "/sprin…

七. 部署YOLOv8检测器-deploy-yolov8-basic

目录 前言0. 简述1. 案例运行2. 补充说明3. 代码分析3.1 main.cpp3.2 trt_detector.hpp3.2 trt_detector.cpp 4. INT8量化前瞻总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考 本次课程…

【车载开发系列】ParaSoft入门介绍

【车载开发系列】ParaSoft入门介绍 【车载开发系列】ParaSoft入门介绍 【车载开发系列】ParaSoft入门介绍一. ParaSoft的背景二. 设计理念三. ParaSoft C/CTest简介四. 具备常用功能1)静态代码分析2)代码覆盖率分析3)模糊测试4)自…

协议的认识和理解

目录 1. 协议 1.1. 站在日常生活的角度初始协议 1.2. 网络分层结构 (OS vs 网络) 1.2.1. 软件分层 1.2.2. 网络分层 1.3. 站在语言的角度理解协议 1. 协议 对于协议,我们可以用一句话概括它:协议本质上就是一种约定。 1.1. 站在日常生活的角度初始…

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(四)

概述 在 WWDC 24 中,苹果推出了数据库框架 SwiftData 2.0,并为其加入了全新的 History Trace、“墓碑”等诸多激动人心的新功能。那么它们到底如何实际应用到我们的 App 中去呢? 想搞清楚历史记录追踪(History Trace)如何在 SwiftData 2.0 中大放异彩吗?看这篇就对了! …

压缩文件隐写

1、伪加密 (1)zip伪加密 考点:winhex打开压缩包;搜索504b0102(注意不是文件头部;zip文件头部伪504b0304);从50开始,往后面数第9,10个字符为加密字符,将其设置为0000即可变为无加密状…

攻防世界--->获取

做题笔记。 下载 查壳 64ida打开 main函数: 查找字符: 根据程序逻辑,创建了一个新文件并且进行了写入。 直接Linux上动调一下。 SharifCTF{b70c59275fcfa8aebf2d5911223c6589}

python安装以及访问openAI API

安装python 我是python小白,所以需要一步一步来,先安装。 一口吃不成胖子,记住。 从官网下载python,目前最新版本是3.12,但是据说稳定版3.11更好一点,所以,下载3.11,注意不要下载…

Hiredis的使用

Hiredis的使用 📸这里安利一个github仓库介绍 图片生成 Socialify 一键生成专业 GitHub 仓库简介图 一、Hiredis的安装与使用 1、下载hiredis软件包, https://github.com/redis/hiredis.git 或者使用git下载到本地 git clone https://github.com/redi…

Camtasia 2024破解版注册机包含激活码秘钥

🎬 嗨,亲爱的朋友们!今天我要给你们安利一款超级炫酷的屏幕录制和视频编辑软件——Camtasia 2024!🎉 camtasia2024绿色免费安装包winmac下载,点击链接即可保存。 https://pan.quark.cn/s/5ee0c4655701 C…

vite+vue3+typescript+elementPlus前端实现电子证书查询系统

实现背景:之前电子证书的实现是后端实现的,主要采用GD库技术,在底图上添加文字水印和图片水印实现的。这里采用前端技术实现电子证书的呈现以及点击证书下载,优点是:后端给前端传递的是一组数据,不需要传证…

假期学习-- iOS runloop了解和使用

iOS runloop的总结和理解 https://juejin.cn/post/7167497134294433829?searchId202408060922235E28560E3792F91107ED runloop的概念和数据结构 一般情况下,程序(或者说线程)在执行完毕后会立即退出或销毁;,但如果对…

体育馆智能可视化:提升场馆管理与观赛体验

利用图扑可视化技术,实时呈现体育馆内各项动态,优化场馆管理,提升观众的观赛体验。

基于人工智能的手写数字识别系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 手写数字识别是一种经典的计算机视觉任务,目标是让机器能够识别手写数字。通过人工智能技术,特别是卷积神经网…

JS_变量

二、JS的变量 JS中的变量具有如下特征 1 弱类型变量,可以统一声明成var 2 var声明的变量可以再次声明 3 变量可以使用不同的数据类型多次赋值 4 JS的语句可以以; 结尾,也可以不用;结尾 5 变量标识符严格区分大小写 6 标识符的命名规则参照JAVA 7 如果使用了 一个没有声明的变量…

JAVA基础:值传递和址传递

1 值传递和址传递 值传递 方法调用时,传递的实参是一个基本类型的数据 形参改变,实参不变 public static void doSum(int num1,int num2){} main(){doSum(10,20);int i 10 ;int j 20 ;doSum(i,j) ; } public static void t1(int num){num 20 ;Sys…

STM32CubeMX和HAL库-新建项目

目录 新建项目 选择开发板 MCU图形化配置界面总览 MCU配置 新建项目 新建项目包含选择MCU创建项目、选择开发板新建项目和交叉选择MCU新建项目三部分。 1. 选择MCU创建项目 单击主菜单项File→New Project,或Home视图上的ACCESS TO MCU SELECTOR 按钮&#xff0c…

Mac+Pycharm配置PyQt6教程

安装包 pip install PyQt6 PyQt6-tools #查看Qt版本 pip show PyQt6 pip show pyqt6-tools 配置扩展工具 QTD(界面设计) Program:/Users/wan/PycharmProjects/NewDemo/venv/lib/python3.11/site-packages/qt6_applications/Qt/bin/Designer.app Working directo…