现在需要对某一些文件加上时间印章,我们现在手头只有一个印章图片模版,要是时间少还可以一个个制作,但是需要成百上千个时间印章呢?打工人也得一个个编辑吗,有人说用AI,但是现在AI生成的次数有限,而且还有烦人的“水印”。别慌,python的pillow库能完美解决这个问题。🕹️ 印章日期批量替换攻略
适用场景:有一张印章扫描图,需要把图上的日期批量修改为多个不同日期,且要求新日期的字体、大小、位置与上方汉字完美匹配。
📌 第一步:环境准备(只需做一次)
安装 Python
在 python.org 下载安装 Python(建议 3.8 以上),安装时勾选 Add Python to PATH。
安装 Pillow 库
打开命令提示符(Win+R → 输入 cmd),执行:
准备字体文件(一般系统自带)
宋体常规:C:/Windows/Fonts/simsun.ttc
宋体加粗:C:/Windows/Fonts/simbd.ttf(或 simsunb.ttf)
如果找不到,去 C:\Windows\Fonts 里搜“宋体”确认实际文件名。
准备印章原图
将印章扫描件或图片放到一个文件夹中,比如:D:\印章项目\template.png。
要求:图片中日期所在位置背景为白色或可覆盖的颜色,便于擦除。
📐 第二步:测量印章上的关键尺寸
用 Windows 自带的“画图 ”打开印章原图,完成两个测量:
2.1 测量旧日期区域的坐标
将鼠标移到旧日期左上角外缘,记下状态栏显示的 (x, y) 坐标。
例如:(26, 67)
再移到右下角外缘,记下坐标。
例如:(193, 96)
建议稍微往外扩 2 像素,确保能完全擦除旧字。
2.2 测量上方汉字的像素高度
用选择工具框住印章上方最大的那个汉字(如“专”、“章”等)。
在状态栏查看选择区域的高度(像素)。
例如:29px(这个数值将决定日期的字号)。
🔢 第三步:找出与汉字等高的日期字号
运行以下 Python 脚本,它会列出不同字号下日期文字的像素高度,找到最接近汉字高度(如 29px)的字号。
from PIL import Image, ImageDraw, ImageFontimport os# 自动寻找可用宋体字体(优先加粗,次选常规)FONTS = [ r"C:/Windows/Fonts/simbd.ttf", r"C:/Windows/Fonts/simsunb.ttf", r"C:/Windows/Fonts/simsun.ttc",]font_path = Nonefor f in FONTS: if os.path.exists(f): font_path = f breakif not font_path: raise FileNotFoundError("未找到宋体字体文件")date_text = "2022-01-19" # 典型日期字符串,用于测量高度print("字号 → 日期像素高度")print("-" * 30)for size in range(30, 60, 2): # 如果高度很大,可扩大范围 font = ImageFont.truetype(font_path, size) tmp = Image.new('RGB', (400, 100), 'white') d = ImageDraw.Draw(tmp) bbox = d.textbbox((0, 0), date_text, font=font) h = bbox[3] - bbox[1] print(f"{size:3d}pt → {h:2d}px")
操作:
找到最接近目标高度(如 29px)的字号,比如 42pt → 29px。
如果希望加粗,可将 FONTS 第一项改为加粗字体路径(如 simbd.ttf),再测一次,并微调字号(加粗后可能需 +1pt)。
🛠️ 第四步:配置并运行批量生成脚本
把下面的代码保存为 generate_stamps.py,按照你的实际路径修改 前三个变量(模板路径、输出文件夹、字号)和 擦除坐标。
from PIL import Image, ImageDraw, ImageFontimport os# ========== 用户配置区(务必修改) ==========template_path = r"D:\印章项目\template.png" # 印章原图output_dir = r"D:\印章项目\output" # 输出文件夹font_path = r"C:/Windows/Fonts/simsun.ttc" # 宋体常规;加粗用 simbd.ttffont_size = 42 # 第三步找到的匹配字号ERASE_BOX = (24, 65, 195, 98) # 第二步测得的坐标(已外扩2px)# ===========================================# 需要生成的日期列表(示例原始数据)raw_dates = [ "13.5.31", "13.5.31", "13.6.19", "18.2.24", "19.8.21", "14.1.16", "22.1.19", "14.7.26", "20.5.11", "18.2.24", "23.2.28", "19.4.17", "14.6.5", "19.4.17", "19.9.27", "19.9.27", "19.9.27", "19.4.17", "13.8.20", "22.1.19", "12.9.25", "19.4.17", "22.1.19"]def format_date(d): parts = d.split('.') return f"20{parts[0]}-{int(parts[1]):02d}-{int(parts[2]):02d}"formatted_dates = list(set([format_date(d) for d in raw_dates]))os.makedirs(output_dir, exist_ok=True)# 加载字体try: font = ImageFont.truetype(font_path, font_size)except: print("字体加载失败,使用默认字体") font = ImageFont.load_default()# 打开原图img = Image.open(template_path)for date_text in formatted_dates: new_img = img.copy() draw = ImageDraw.Draw(new_img) # 测量文字尺寸 bbox = draw.textbbox((0, 0), date_text, font=font) tw, th = bbox[2] - bbox[0], bbox[3] - bbox[1] # 擦除旧日期 x0, y0, x1, y1 = ERASE_BOX draw.rectangle([x0, y0, x1, y1], fill="white") # 在擦除区域内居中写入新日期 box_cx = (x0 + x1) / 2 box_cy = (y0 + y1) / 2 tx = box_cx - tw / 2 ty = box_cy - th / 2 draw.text((tx, ty), date_text, font=font, fill=(255, 0, 0)) # 保存 save_path = os.path.join(output_dir, f"{date_text}.png") new_img.save(save_path) print(f"✅ {save_path}")print("🎉 全部完成!")
运行:双击脚本或在终端执行 python generate_stamps.py,所有新印章就会生成到输出文件夹。
使用时你需要将代码中的这个部分修改
# 需要生成的日期列表(原始数据)raw_dates = [ "13.5.31", "13.5.31", "13.6.19", "18.2.24", "19.8.21", "14.1.16", "22.1.19", "14.7.26", "20.5.11", "18.2.24", "23.2.28", "19.4.17", "14.6.5", "19.4.17", "19.9.27", "19.9.27", "19.9.27", "19.4.17", "13.8.20", "22.1.19", "12.9.25", "19.4.17", "22.1.19"]
按照上面的格式添加你需要的日期,比如13.5.31就代表2013年05月31日
路径也需要修改你电脑里面的本地路径
template_path = r"D:\印章项目\template.png" # 印章原图output_dir = r"D:\印章项目\output"
🔧 第五步:微调优化
数字仍比汉字小或大 微调 font_size,每次 ±1pt
擦除不干净,有旧日期痕迹 将 ERASE_BOX 的边界再向外扩 2~4 像素
新日期位置偏上或偏下 在计算 ty 时增加偏移量,例如 ty = box_cy - th/2 + 1
想要加粗效果 将 font_path 改为 C:/Windows/Fonts/simbd.ttf,并重新测试字号
字体找不到 在 C:/Windows/Fonts 中查看实际文件名,替换路径
💡 补充说明
如果印章背景不是纯白色,可将 fill="white" 改为与背景相同的颜色值,例如 fill=(240, 240, 240)(浅灰)。
若日期有不同长度(如 2012-09-25 和 2023-02-28),脚本会自动在擦除框内水平居中,完全不用操心。
按照这个流程,你就能在 5 分钟内 完成一套印章的日期替换,且数字和汉字完全等大、位置精准。如有任何细节调整,只需改动配置区的几个参数即可。