一、环境准备
1. 安装Python解释器
如果你的设备已经安装Python 3.8及以上版本,可以直接跳过本步骤。不同系统安装方式如下:
- Windows:直接点击链接下载安装包:
https://www.python.org/ftp/python/3.11.4/python-3.11.4-amd64.exe,安装时必须勾选「Add Python to PATH」选项,之后一路点击「下一步」完成安装。
- MacOS:执行终端命令安装:
```brew install python@3.11
```
- Linux(Debian/Ubuntu):执行终端命令安装:
```sudo apt update && sudo apt install python3 python3-pip -y
```
2. 安装项目依赖
安装完成后打开终端(Windows按Win+R输入cmd回车打开),执行以下命令安装所有需要的依赖:
```pip install pillow pymupdf
```
如果出现网络超时,换用国内镜像源安装:
```pip install pillow pymupdf -i https://pypi.tuna.tsinghua.edu.cn/simple
```
二、编写系统核心代码
在你电脑任意位置新建一个空白文件夹,新建一个名为watermark.py的文件,将以下完整代码直接复制进去,所有自定义配置都标注在文件开头,可直接修改:
```python
import os
from PIL import Image, ImageDraw, ImageFont
import fitz pymupdf 处理PDF
-- 可修改配置项 --
WATERMARK_TEXT = "内部档案 请勿外传"
OPACITY = 0.3 透明度,范围0-1,数值越小越透明
ANGLE = 30 水印旋转角度
SPACING = 150 水印之间的间距,单位像素
FONT_SIZE = 50 水印字体大小
-
def get_system_font():
"""自动适配不同系统默认中文字体"""
import platform
sys_name = platform.system()
if sys_name == "Windows":
return "C:/Windows/Fonts/simhei.ttf"
elif sys_name == "Darwin": MacOS
return "/Library/Fonts/PingFang.ttc"
else: Linux
return "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"
def add_watermark_to_image(image_path, output_path):
img = Image.open(image_path).convert("RGBA")
width, height = img.size
创建水印画布
watermark = Image.new("RGBA", img.size, (0,0,0,0))
draw = ImageDraw.Draw(watermark)
加载字体
font = ImageFont.truetype(get_system_font(), FONT_SIZE, encoding="utf-8")
计算单个水印尺寸
left, top, right, bottom = draw.textbbox((0,0), WATERMARK_TEXT, font=font)
text_width = right - left
text_height = bottom - top
铺满画布绘制水印
for i in range(-SPACING, width + SPACING, text_width + SPACING):
for j in range(-SPACING, height + SPACING, text_height + SPACING):
draw.text((i, j), WATERMARK_TEXT, font=font, fill=(255, 0, 0, int(255 OPACITY)))
旋转水印
watermark = watermark.rotate(ANGLE, expand=0)
合并原图和水印
result = Image.alpha_composite(img, watermark)
result = result.convert("RGB")
result.save(output_path)
def add_watermark_to_pdf(pdf_path, output_path):
doc = fitz.open(pdf_path)
watermark_doc = fitz.open()
font_path = get_system_font()
for page in doc:
new_page = watermark_doc.new_page(width=page.rect.width, height=page.rect.height)
new_page.show_pdf_page(new_page.rect, doc, page.number)
计算水印铺满页面
page_width = new_page.rect.width
page_height = new_page.rect.height
text_width = FONT_SIZE len(WATERMARK_TEXT) 0.6
text_height = FONT_SIZE
添加平铺水印
for i in range(-int(SPACING), int(page_width + SPACING), int(text_width + SPACING)):
for j in range(-int(SPACING), int(page_height + SPACING), int(text_height + SPACING)):
new_page.insert_text(
(i, j),
WATERMARK_TEXT,
fontfile=font_path,
fontsize=FONT_SIZE,
color=(1, 0, 0),
opacity=OPACITY,
rotate=ANGLE
)
watermark_doc.save(output_path)
watermark_doc.close()
doc.close()
if __name__ == "__main__":
创建输入输出文件夹
base_dir = os.path.dirname(os.path.abspath(__file__))
input_dir = os.path.join(base_dir, "input")
output_dir = os.path.join(base_dir, "output")
os.makedirs(input_dir, exist_ok=True)
os.makedirs(output_dir, exist_ok=True)
批量处理所有文件
for filename in os.listdir(input_dir):
file_path = os.path.join(input_dir, filename)
if not os.path.isfile(file_path):
continue
ext = filename.split(".")[-1].lower()
output_path = os.path.join(output_dir, filename)
if ext in ["jpg", "png", "jpeg"]:
print(f"正在处理图片:{filename}")
add_watermark_to_image(file_path, output_path)
elif ext == "pdf":
print(f"正在处理PDF:{filename}")
add_watermark_to_pdf(file_path, output_path)
print("所有档案处理完成!")
```
三、运行使用系统
1. 预处理待加水印的档案

在你存放watermark.py的文件夹下,系统会自动创建名为input的文件夹,把所有需要添加水印的档案文件放入支持.jpg、.png、.pdf三种格式,系统会自动批量处理所有文件。
2. 修改自定义配置(可选)
如果需要修改水印内容、透明度、角度,直接用记事本打开watermark.py,修改文件开头的配置变量即可:
- 修改
WATERMARK_TEXT = "你的水印内容"更换水印文字
- 修改
OPACITY = 0.3调整透明度,数值范围0-1
- 修改
ANGLE = 30调整水印旋转角度
- 修改
FONT_SIZE = 50调整水印字体大小
3. 运行生成带水印档案
打开终端,进入存放watermark.py的文件夹,执行以下命令:
```python watermark.py
```
等待执行完成后,打开同目录下的output文件夹,就能得到所有添加好水印的档案文件。
四、常见问题解决
- 提示字体找不到:手动指定字体路径,修改代码中
get_system_font函数的返回值为你电脑上已有的字体文件绝对路径即可
- 依赖安装失败:确认安装Python时勾选了PATH环境变量,重新执行换源后的pip命令即可
- PDF添加后打不开:确认PDF不是加密文件,加密档案需要先解密再进行处理
- 水印位置太密/太疏:修改配置项中的
SPACING参数,数值越大水印间距越大