实用脚本如何实现批量生成二维码?

wen 实用脚本 2

本文目录导读:

实用脚本如何实现批量生成二维码?

  1. 方案一:使用 Python + qrcode 库
  2. 方案二:带 Logo 的高级版本
  3. 方案三:JavaScript 版(Node.js)
  4. 方案四:命令行工具版本
  5. 使用建议

我来介绍几种批量生成二维码的实用脚本方案。

使用 Python + qrcode 库

基础版本

import qrcode
import os
from PIL import Image
import pandas as pd
def batch_generate_qrcode(data_list, output_dir="qrcodes"):
    """
    批量生成二维码
    :param data_list: [(文件名, 二维码内容), ...]
    :param output_dir: 输出目录
    """
    # 创建输出目录
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    for filename, content in data_list:
        # 创建二维码对象
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_H,
            box_size=10,
            border=4,
        )
        # 添加数据
        qr.add_data(content)
        qr.make(fit=True)
        # 生成图片
        img = qr.make_image(fill_color="black", back_color="white")
        # 保存
        filepath = os.path.join(output_dir, f"{filename}.png")
        img.save(filepath)
        print(f"已生成: {filepath}")

从 Excel 读取数据批量生成

def generate_from_excel(excel_file, content_column, name_column, output_dir="qrcodes"):
    """
    从Excel读取数据批量生成二维码
    :param excel_file: Excel文件路径
    :param content_column: 内容列名
    :param name_column: 文件名列名
    """
    # 读取Excel
    df = pd.read_excel(excel_file)
    # 准备数据
    data_list = []
    for _, row in df.iterrows():
        data_list.append((row[name_column], row[content_column]))
    # 批量生成
    batch_generate_qrcode(data_list, output_dir)
# 使用示例
if __name__ == "__main__":
    # 方法1:直接传入数据
    data = [
        ("qrcode_1", "https://example.com/1"),
        ("qrcode_2", "https://example.com/2"),
        ("qrcode_3", "这是一段文本内容"),
    ]
    batch_generate_qrcode(data)
    # 方法2:从Excel读取
    # generate_from_excel("data.xlsx", "内容", "文件名")

带 Logo 的高级版本

def generate_with_logo(data_list, logo_path=None, output_dir="qrcodes_with_logo"):
    """
    带Logo的二维码生成
    """
    import qrcode
    from qrcode.image.styledpil import StyledPilImage
    from qrcode.image.styles.moduledrawers import RoundedModuleDrawer
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    for filename, content in data_list:
        # 创建二维码
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_H,
            box_size=10,
            border=2,
        )
        qr.add_data(content)
        qr.make(fit=True)
        # 生成图片
        if logo_path and os.path.exists(logo_path):
            # 使用圆角模块
            img = qr.make_image(
                image_factory=StyledPilImage,
                module_drawer=RoundedModuleDrawer(),
                fill_color="black",
                back_color="white"
            )
            # 添加Logo
            img = img.convert("RGBA")
            logo = Image.open(logo_path)
            # 调整Logo大小
            logo_size = int(img.size[0] * 0.2)
            logo = logo.resize((logo_size, logo_size), Image.LANCZOS)
            # 计算位置
            pos = ((img.size[0] - logo_size) // 2, 
                   (img.size[1] - logo_size) // 2)
            # 粘贴Logo
            img.paste(logo, pos, logo)
        else:
            img = qr.make_image(fill_color="black", back_color="white")
        # 保存
        img.save(os.path.join(output_dir, f"{filename}.png"))
        print(f"已生成带Logo的二维码: {filename}.png")

JavaScript 版(Node.js)

// 使用 qrcode 包
// npm install qrcode
const QRCode = require('qrcode');
const fs = require('fs');
const path = require('path');
async function batchGenerateQR(dataList, outputDir = './qrcodes') {
    // 创建输出目录
    if (!fs.existsSync(outputDir)) {
        fs.mkdirSync(outputDir, { recursive: true });
    }
    for (const [filename, content] of dataList) {
        const filepath = path.join(outputDir, `${filename}.png`);
        try {
            await QRCode.toFile(filepath, content, {
                color: {
                    dark: '#000000',
                    light: '#ffffff'
                },
                width: 400,
                margin: 2
            });
            console.log(`已生成: ${filepath}`);
        } catch (error) {
            console.error(`生成失败 ${filename}:`, error);
        }
    }
}
// 使用示例
const data = [
    ['qrcode_1', 'https://example.com/1'],
    ['qrcode_2', 'https://example.com/2'],
];
batchGenerateQR(data);

命令行工具版本

#!/bin/bash
# batch_qrcode.sh
# 需要安装 qrencode
# sudo apt-get install qrencode  # Ubuntu/Debian
# brew install qrencode          # macOS
# 从文件读取数据批量生成
while IFS=',' read -r filename content
do
    # 去除空格
    filename=$(echo "$filename" | xargs)
    content=$(echo "$content" | xargs)
    # 生成二维码
    qrencode -o "${filename}.png" -s 10 -l H "$content"
    echo "已生成: ${filename}.png"
done < data.csv

使用建议

安装依赖

# Python
pip install qrcode[pil] pandas
# Node.js
npm install qrcode
# 系统工具
sudo apt-get install qrencode  # Linux
brew install qrencode          # macOS

CSV 数据格式

filename,content
qrcode_1,https://example.com
qrcode_2,这是测试内容
qrcode_3,123456789

高级功能扩展

def advanced_batch_generate(data_list, config=None):
    """
    高级批量生成配置
    config = {
        'logo': 'logo.png',           # Logo图片
        'size': 400,                   # 尺寸
        'color': ('#000', '#fff'),     # 颜色
        'custom_design': 'round',      # 自定义样式
    }
    """
    # ... 实现代码
def batch_url_shorten_and_qrcode(urls):
    """
    先缩短URL再生成二维码
    """
    # ... 实现代码

选择最合适的方案取决于你的具体需求:Python适合数据处理,Node.js适合Web应用,命令行工具适合简单的批量操作。

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