ARTICLE · 1084748
几十份 PDF 要合并、拆分、加水印,AI 写了三段脚本一次搞定
「AI 帮我写」第 7 期
摘要:合并、按页拆分、给每一页盖水印,这三件事 AI 一共写了 30 行代码,复制就能跑。
手上有 PDF 的人都遇到过这三件事。
第一件,十几份材料要合成一份交上去,用在线工具合并,还得担心合同内容被谁看去了。
第二件,收到一份 200 页的汇总文件,你只要其中第 51 到 80 页。
第三件,文件要发给外部,得在每一页盖上仅限内部使用的字样。

图 1:合并、拆分与水印
这三件事,AI 一共给我写了 30 行代码。
第 1 段:合并
from pathlib import Path
from pypdf import PdfReader, PdfWriter
src = Path(r"D:\PDF")
# 新建一个空的写入器,用来装最终的文件
writer = PdfWriter()
# 按文件名排序,保证合并顺序是 01、02、03 而不是随机
for f in sorted(src.glob("待合并*.pdf")):
reader= PdfReader(str(f))
forpage in reader.pages:
#一页一页往总文件里加
writer.add_page(page)
writer.write(str(src / "合并结果.pdf"))
print("合并完成")

图 2:多份按顺序汇成一叠
第 2 段:按页拆分
from pypdf import PdfReader, PdfWriter
from pathlib import Path
src = Path(r"D:\PDF")
reader = PdfReader(str(src / "大文件.pdf"))
# range 的第三个参数是步长,每 10 页切一份
for i in range(0, len(reader.pages), 10):
w= PdfWriter()
forpage in reader.pages[i:i + 10]:
w.add_page(page)
#i // 10 + 1 算出这是第几份,从 1 开始数
w.write(str(src/ f"拆分_{i // 10 + 1}.pdf"))
print("拆分完成,共", (len(reader.pages) + 9) // 10, "份")
想要指定页码范围,比如只抽 51 到 80 页,把问 AI 的话说成这样:帮我改成只抽第 51 到 80 页,输出一份新文件。
第 3 段:加水印
先自己做一个水印 PDF,一页就行,中间写几个大字。然后用下面这段,把它盖到每一页上。
from pypdf import PdfReader, PdfWriter
from pathlib import Path
src = Path(r"D:\PDF")
# 水印页取第一页,所有页都盖同一张
water = PdfReader(str(src / "水印.pdf")).pages[0]
reader = PdfReader(str(src / "正文.pdf"))
w = PdfWriter()
for page in reader.pages:
#merge_page 是把水印叠在当前页上,不改动原内容
page.merge_page(water)
w.add_page(page)
w.write(str(src / "加好水印.pdf"))
print("水印完成")

图 3:加盖水印与按页裁剪
装库和 3 个高频坑
python -m pip install pypdf
1. 合并后页序乱了:sorted 是按文件名排的,文件名如果叫 1、10、2,顺序就会变成 1、10、2。统一改成 01、02、03 这种带前导零的名字
2. 水印把正文盖住了:纸质文件的习惯是水印要淡,做成浅灰色半透明,或者用 Python 生成一个透明度更低的图层
3. 有些 PDF 加了密码:读的时候会报错,让 AI 加一段带密码解密的代码,密码你得自己有

图 4:三段脚本跑通
安全红线
1. 三个脚本都是生成新文件,原文件不动,处理完整批核对一遍再清理
2. 加了水印的版本才是发出去的版本,别把没加过水印的原件顺手一起发了
3. 合同、报价单这类文件不要用在线合并工具,本地跑脚本是最稳的选择