我的知识记录

Python 批量生成电子签名图片 手写字体透明底教程

用 Pillow 把姓名批量渲染成带手写字体、透明背景的电子签名 PNG,支持指定字体、字号、颜色、倾斜角度,适合合同、审批单批量盖章。

场景痛点

HR 批量做劳动合同、采购审批单,每页都要盖同一个手写签名,设计同事在 PS 里改名字另存,一天出几十张还容易错字。用 Python 读一份姓名清单,自动套上手写字体渲染成透明底 PNG,文件名就是姓名,直接插进 PDF 或 Word 里。

用到的库

pip install Pillow

完整代码

# -*- coding: utf-8 -*-
# 根据姓名清单批量生成手写风格电子签名 PNG(透明底)
import os
from PIL import Image, ImageDraw, ImageFont

FONT_PATH = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
# Windows 示例:C:/Windows/Fonts/STKAITI.TTF  或  fonts/simkai.ttf
# 想要手写感,下载一个 ttf 手写字体放 fonts/ 目录即可

def make_signature(name, out_path, font_size=64,
color=(20, 20, 20, 255), skew=0):
# 字号大一点便于测量文字宽高
font = ImageFont.truetype(FONT_PATH, font_size)
# 先在临时画布上量文字尺寸
tmp = Image.new("RGBA", (10, 10))
d = ImageDraw.Draw(tmp)
bbox = d.textbbox((0, 0), name, font=font)
w, h = bbox[2] - bbox[0], bbox[3] - bbox[1]

# 留 20% 边距,避免切字
pad = int(font_size * 0.4)
canvas = Image.new("RGBA", (w + pad * 2, h + pad * 2),
(255, 255, 255, 0))
d = ImageDraw.Draw(canvas)
d.text((pad - bbox[0], pad - bbox[1]), name,
font=font, fill=color)

# 可选:轻微倾斜,更像手写
if skew:
canvas = canvas.rotate(skew, expand=True,
resample=Image.BICUBIC)
canvas.save(out_path)
print(f"签名生成:{out_path}  {canvas.size}")

def batch_from_list(names, out_dir):
os.makedirs(out_dir, exist_ok=True)
for name in names:
make_signature(name, os.path.join(out_dir, f"{name}.png"))

if __name__ == "__main__":
names = ["黄文康", "张三", "李四", "王五"]
batch_from_list(names, "./signatures")

代码讲解

  • 电子签名本质就是把文字用手写字体画到透明背景上。ImageFont.truetype 加载一个 ttf 字体文件,想要真手写感,找一个免费商用的手写体(比如"站酷快乐体"、"方正静蕾简体"的开源替代)放进 fonts/
  • textbbox 用来量文字实际宽高,因为不同字体基线不一样,直接 font.getsize 已经废弃,用 bbox 才准。
  • 画布铺 20% 边距,防止字体的上下伸部(比如"康"字下面那笔)被裁掉。
  • 背景色传 (255,255,255,0) 四个通道,第四个 0 表示完全透明,输出 PNG 直接叠到合同上就是签名效果。
  • rotate(skew) 给整行字轻微倾斜 -5° 左右,更像手写;不想要就传 skew=0

运行结果

names 列表换成真实员工姓名,运行后在 ./signatures 目录得到 黄文康.png张三.png 等透明底签名图,直接插入 Word 合同或 PDF 审批流即可。

注意事项

  • 中文字体路径在 Windows 是 C:/Windows/Fonts/xxx.ttc,macOS 是 /Library/Fonts/xxx.ttf,Linux 需要自己装,路径不对会抛 OSError
  • 商用前确认字体授权,别拿方正、汉仪的收费字体做公司签名。
  • 真要法律效力,电子签名和手写签名一样需要合规 CA 证书,本脚本只解决"图好看"的问题。
  • 批量名字有生僻字时,换一个支持 GBK 全字符集的字体,否则会出方框。

Python 批量生成电子签名图片 手写字体透明底教程

标签:

更新时间:2026-09-14 20:22:08

上一篇:Python PIL 打开图片获取尺寸 宽高大小教程

下一篇:Python 批量识别图片主色调 提取颜色值教程