Python脚本怎样实现批量把大量PDF文档加盖电子公章
PyMuPDF(fitz)支持在PDF页面叠加公章图片,而PyPDF2不支持图像渲染和alpha通道合成;需用fitz.Rect指定坐标、处理透明度/旋转/底纹,并注意大文件懒加载及交互元素保留。
用 PyPDF2 或 PyMuPDF(fitz)叠加公章图片到 PDF 页面
PyPDF2 本身不支持图像渲染,只能做页面合并、文本提取等基础操作;真正能“盖章”的是 PyMuPDF(即 fitz),它底层基于 MuPDF,可直接在 PDF 页面上绘制图像、文字、矢量图形。如果你用 PyPDF2 尝试 merge_page() 加一个带透明背景的 PNG 公章,大概率会失败或位置错乱——因为 PyPDF2 不解析图像坐标系,也不支持 alpha 通道合成。
实操建议:
- 安装
PyMuPDF:pip install PyMuPDF(注意不是fitz单独包,import fitz是它的模块名) - 公章图推荐用 300dpi 以上、带 Alpha 通道的
.png,避免白边;尺寸建议控制在宽高 200–400px,否则缩放易失真 - 盖章位置用绝对坐标(单位:PDF 默认用户空间,1/72 英寸),例如右下角常见位置:
x = page.rect.width - 250,y = page.rect.height - 100 - 调用
page.insert_image(rect, filename="seal.png"),其中rect是fitz.Rect(x0, y0, x1, y1),注意 y 轴向下为正,PDF 原点在左下角
批量处理时如何保持原 PDF 的书签、超链接、表单域不被破坏
PyMuPDF 在 doc.save() 时默认会丢弃交互式元素(如表单域、JavaScript)、弱化书签结构、且重写所有对象流——这不是 bug,是 MuPDF 渲染模型决定的。如果你的原始 PDF 含电子签名字段或填空表单,直接 insert_image 后保存,这些内容大概率失效。
实操建议:
- 优先用
doc.copy_page()+doc.insert_pdf()组合,把盖章后的页面插入新文档,而非覆盖原页;这样能保留源文档元数据和结构 - 若必须修改原文件,保存前加参数:
doc.save("out.pdf", garbage=4, deflate=True, clean=True),其中garbage=4可最大限度保留交叉引用表 - 书签需手动重建:遍历
doc.get_toc()获取原 TOC,盖章后用doc.setToC(toc_list)写回;不能依赖自动继承 - 超链接(
page.get_links())可读取并重新插入,但目标页码可能因插入操作偏移,需动态校准
公章透明度、旋转角度、防伪底纹怎么控制
公章不是简单贴图——实际业务中常要求 30% 透明度、逆时针旋转 15°、叠加浅灰底纹文字(如“仅供XX用途”)。这些在 fitz 中必须分步实现,无法靠单个参数搞定。
陌言AI
陌言AI是一个一站式AI创作平台,支持在线AI写作,AI对话,AI绘画等功能
下载
实操建议:
- 透明度:先用 PIL 打开公章图,调整
alpha通道,再保存为临时 PNG;fitz本身不提供图像混合参数 - 旋转:不要对图片预旋转,而是在
insert_image()前构造带变换矩阵的Rect,或更稳妥地用page.show_pdf_page()+clip区域 +transform参数 - 底纹文字:用
page.insert_textbox()绘制半透明白色文字,字体选无衬线(如helv),字号设小(8–10pt),颜色(0.8, 0.8, 0.8),再置于公章图层下方 - 防重叠检测:对每页检查是否已有类似区域(通过
page.get_image_info()提取所有图像 bbox),避免重复盖章
大文件(>50MB)或千页级 PDF 处理卡死、内存爆掉怎么办
PyMuPDF 默认把整个 PDF 解压进内存,遇到扫描版 PDF(每页是巨幅图像)或含大量嵌入字体的文档,doc = fitz.open("big.pdf") 可能瞬间吃光 4GB 内存。这不是代码写错了,是设计使然。
实操建议:
- 启用懒加载:
fitz.open("big.pdf", lazy=True),此时页面对象只在首次访问时解码,大幅降低启动内存 - 逐页处理 + 立即释放:
for i in range(doc.page_count): page = doc[i]; ...; page = None,避免 Python 引用计数延迟回收 - 跳过非目标页:用
page.get_text("text")快速判断是否含关键词(如“合同编号”),再决定是否盖章,避免全量渲染 - 导出为 PDF/A 或压缩图像:盖章后调用
doc.save("out.pdf", deflate=True, garbage=3),比默认设置体积小 30–60%
公章位置计算、多页适配、跨平台字体路径、CMYK 转 RGB 等细节,每个都可能让脚本在客户现场崩一次。别信“一键盖章”封装库——它们只是把上面这些坑帮你踩了两遍而已。