
在实际工作中,我们经常会遇到这样的场景:手上有几十甚至上百份 Word 或 PDF 文档,需要为每一份生成一个二维码,方便扫码后直接打开对应文件。例如:
如果手动一个个生成,不仅效率低,还容易出错。本文介绍一套可复用的批量方案:读取文件夹中的 Word/PDF 文件,按文件名(编号)自动生成二维码,并以编号命名保存。
整个方案的核心逻辑非常清晰:遍历文件夹 → 为每个文件生成可访问链接 → 生成二维码 → 按编号命名保存。下面用流程图展示完整步骤。
flowchart TD
A[准备 Word/PDF 文件夹] --> B[遍历文件列表]
B --> C{是否还有文件}
C -- 是 --> D[提取文件名作为编号]
D --> E[生成文件访问链接]
E --> F[调用二维码库生成图片]
F --> G[按编号命名保存 PNG]
G --> C
C -- 否 --> H[输出结果清单]
H --> I[完成]
这里有一个关键前提:二维码扫码后要能打开文件,文件必须有一个可访问的 URL。因此方案分为两种模式:
本文以在线模式为主,同时给出本地模式的写法,读者可按需选择。
本教程使用 Python 实现,依赖两个核心库:
qrcode:生成二维码图片。Pillow:图像处理,qrcode 生成图片时依赖它。安装命令如下:
pip install qrcode[pil]
如果需要读取 Word 或 PDF 中的元信息(例如标题、编号),还可以按需安装:
pip install python-docx PyPDF2
建议使用 Python 3.8 及以上版本,并在虚拟环境中安装依赖,避免污染全局环境。
先实现最核心的功能:遍历指定文件夹,为每个 Word/PDF 文件生成二维码,并按文件名(不含扩展名)命名保存。
import os
import qrcode
配置:源文件夹、输出文件夹、文件访问前缀
SOURCE_DIR = "./documents" # 存放 Word/PDF 的文件夹
OUTPUT_DIR = "./qrcodes" # 二维码输出文件夹
URL_PREFIX = "https://example.com/files/" # 文件在线访问前缀
支持的文件扩展名
SUPPORTED_EXTS = (".doc", ".docx", ".pdf")
def ensure_dir(path):
if not os.path.exists(path):
os.makedirs(path)
def generate_qrcode(content, save_path):
qr = qrcode.QRCode(
version=None,
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=10,
border=4,
)
qr.add_data(content)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save(save_path)
def batch_generate(source_dir, output_dir, url_prefix):
ensure_dir(output_dir)
count = 0
for filename in os.listdir(source_dir):
name, ext = os.path.splitext(filename)
if ext.lower() not in SUPPORTED_EXTS:
continue
# 二维码内容:在线访问链接
content = url_prefix + filename
save_path = os.path.join(output_dir, f"{name}.png")
generate_qrcode(content, save_path)
print(f"已生成:{save_path} -> {content}")
count += 1
print(f"共生成 {count} 个二维码")
if name == "main":
batch_generate(SOURCE_DIR, OUTPUT_DIR, URL_PREFIX)
运行后,./qrcodes 目录下会得到与源文件同名的 PNG 图片,例如 001.pdf 对应 001.png,实现了按编号自动命名。
如果文件只在局域网或本机使用,可以把二维码内容改为本地绝对路径:
content = os.path.abspath(os.path.join(source_dir, filename))
注意:本地路径二维码需要扫码工具支持打开本地文件,通用性不如在线链接,建议仅在内部场景使用。
实际归档时,编号往往需要统一位数,例如 001、002。同时建议输出一份 CSV 清单,记录编号、文件名和二维码路径,方便后续核对。
import csv
def batch_generate_with_manifest(source_dir, output_dir, url_prefix, width=3):
ensure_dir(output_dir)
manifest = []
files = sorted(
f for f in os.listdir(source_dir)
if os.path.splitext(f)[1].lower() in SUPPORTED_EXTS
)
for index, filename in enumerate(files, start=1):
name, ext = os.path.splitext(filename)
# 若原文件名不是纯数字,则按序号补零命名
code = name if name.isdigit() else str(index).zfill(width)
content = url_prefix + filename
save_path = os.path.join(output_dir, f"{code}.png")
generate_qrcode(content, save_path)
manifest.append({
"编号": code,
"源文件": filename,
"二维码内容": content,
"二维码路径": save_path,
})
# 输出清单
manifest_path = os.path.join(output_dir, "manifest.csv")
with open(manifest_path, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["编号", "源文件", "二维码内容", "二维码路径"])
writer.writeheader()
writer.writerows(manifest)
print(f"共生成 {len(manifest)} 个二维码,清单:{manifest_path}")
这样既保证了命名规范,又留下了可追溯的记录。
参数 | 说明 | 建议值 |
|---|---|---|
box_size | 每个小方块的像素大小 | 10(打印可调大) |
border | 二维码四周留白格数 | 4 |
error_correction | 容错级别,L/M/Q/H 依次增强 | M 或 Q |
如果二维码需要印刷,建议把 box_size 调大,并选择 ERROR_CORRECT_Q,提高破损情况下的识别率。
utf-8-sig 编码,Excel 打开才不会乱码。001.doc 和 001.pdf),需要额外加扩展名区分。qrcode 的 StyledPilImage 或第三方库添加 Logo、圆角,提升视觉效果。reportlab 或 Word 模板批量排版,直接输出可打印的 PDF。tkinter)或命令行参数,方便非技术同事使用。前面几节的方案适合需要深度定制、批量规模较大或要接入自有系统的场景。如果只是偶尔为一批文档生成二维码,或者希望二维码更美观、可随时修改内容,可以借助八木屋二维码这类在线平台,把「生成」和「美化」这两步交给现成工具完成。
结合本文的批量场景,八木屋二维码比较实用的功能点包括:
StyledPilImage 做美化的代码量,打印出来更符合品牌或档案规范。一个常见的组合做法是:本地脚本负责遍历文件夹、统一编号和生成清单,把文件按编号整理好后上传到八木屋二维码批量生成,再把生成的二维码图片按编号回填到清单中。这样既保留了脚本的规范化命名能力,又利用了在线工具在文件托管、美化和统计上的便利。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。