用 PyPDF2 + reportlab 批量给多份装修合同 PDF 加骑缝水印和页码(附完整代码)
做装修项目最怕两件事合同版本混乱、纸质件被调包。把多份合同 PDF 统一加上骑缝水印 连续页码既能防篡改又能让归档一目了然。本文用一个纯 Python 脚本读完即可跑。为什么不用在线工具装修合同含业主姓名、电话、身份证号、房屋地址属于敏感个人信息。丢给第三方网站处理有泄露风险。本地用PyPDF2reportlab就能搞定零外传。环境pipinstallPyPDF2 reportlab核心思路用reportlab生成一张透明水印 PDF含水印文字 页码占位。用PyPDF2的PdfWriter把水印叠到每一页上merge_page。页码用PdfReader逐页计数写入页脚。遍历整个文件夹批量处理。完整代码importosimportglobfromPyPDF2importPdfReader,PdfWriterfromreportlab.pdfgenimportcanvasfromreportlab.lib.pagesizesimportA4 WATERMARK麦序子 · 装修合同 · 机密defmake_stamp(text,page_no,total,outstamp.pdf):生成单页水印(透明背景) pdf含斜向水印文字与页码。ccanvas.Canvas(out,pagesizeA4)c.setFillAlpha(0.18)# 透明不挡正文c.setFont(Helvetica-Bold,26)c.saveState()c.translate(A4[0]/2,A4[1]/2)c.rotate(45)c.drawCentredString(0,0,text)c.restoreState()# 页脚页码c.setFillAlpha(0.9)c.setFont(Helvetica,9)c.drawString(40,20,f{page_no}/{total})c.save()returnoutdefadd_watermark(src,dst):readerPdfReader(src)writerPdfWriter()totallen(reader.pages)fori,pageinenumerate(reader.pages,1):stampmake_stamp(WATERMARK,i,total)swPdfReader(stamp)page.merge_page(sw.pages[0])writer.add_page(page)withopen(dst,wb)asf:writer.write(f)print(f已处理:{os.path.basename(src)}-{dst}({total}页))defbatch(folder,out_dir):os.makedirs(out_dir,exist_okTrue)forpathinglob.glob(os.path.join(folder,*.pdf)):nameos.path.splitext(os.path.basename(path))[0]add_watermark(path,os.path.join(out_dir,f{name}_wm.pdf))if__name____main__:batch(rD:/合同原始,rD:/合同归档)三个常见坑中文水印乱码reportlab默认 Helvetica 不带中文字形。注册STSong-LightAdobe 自带 CJK 字体或换用matplotlib出图再叠才能正常显示中文水印。merge_page 后内容被盖setFillAlpha调低到 0.15 左右水印只做底纹不挡签字区。大文件慢逐页merge_page是 CPU 活几百页的合同建议多进程分桶处理别一把梭。小结本地批量加水印 页码几百份合同十分钟归档完敏感信息不出本机。需要把清单计价表也一起标准化归档可以参考 maixuzi.cn/resources/ 上的装修文档处理思路。

相关新闻

深挖 Harness Engineering:从 Codex 到 Agent 的工程化落地全解析

深挖 Harness Engineering:从 Codex 到 Agent 的工程化落地全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:12:09 阅读更多 →
C++右值引用与移动语义面试精讲:从入门到精通

C++右值引用与移动语义面试精讲:从入门到精通

C++右值引用与移动语义面试精讲:从入门到精通 本文深入讲解C++11右值引用、移动语义、完美转发的核心概念,配合大量代码示例和面试真题,助你彻底掌握现代C++的性能优化利器。 一、左值与右值 1.1 值类别 #include <iostream> #include <string>int main() {in…

2026/10/7 14:12:09 阅读更多 →
# TMS320F28388D 存储器架构

# TMS320F28388D 存储器架构

第 2 章 存储器体系 文档定位&#xff1a;TMS320F28388D 高性能伺服控制器开发——存储器体系学习笔记 文档风格&#xff1a;工程技术文档 / 论文式整理 主要资料&#xff1a; 《TMS320F2838x 数据手册》《TMS320F2838x Real-Time Microcontrollers With Connectivity Manager …

2026/10/7 14:12:09 阅读更多 →

最新新闻

干货盘点|2026 AI 论文工具横向测评,按你的毕设任务选工具

干货盘点|2026 AI 论文工具横向测评,按你的毕设任务选工具

导读&#xff1a;很多同学挑选 AI 论文工具容易踩坑&#xff0c;只看能不能生成文字&#xff0c;忽略国内毕业论文的真实需求。本次盘点不按简单的分数梯队排序&#xff0c;直接按照「毕设任务场景」分类测评&#xff0c;适合开题、文献、绘图、排版、答辩不同阶段按需挑选&…

2026/10/7 14:51:39 阅读更多 →
Claude Opus 4.8 来了:把 Cursor Base URL 改到 TaoToken 的 agentic coding 实测

Claude Opus 4.8 来了:把 Cursor Base URL 改到 TaoToken 的 agentic coding 实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:51:39 阅读更多 →
AI工作流 Workflow、Graph、Loop:把 Codex auth.json 改到 TaoToken 的实操大纲

AI工作流 Workflow、Graph、Loop:把 Codex auth.json 改到 TaoToken 的实操大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:51:39 阅读更多 →
高炉炼铁机器视觉与智能识别十八讲~系列文章05:炉顶料面识别:装料分布判读与布料制度优化

高炉炼铁机器视觉与智能识别十八讲~系列文章05:炉顶料面识别:装料分布判读与布料制度优化

第 05 期 | 炉顶料面识别&#xff1a;装料分布判读与布料制度优化高炉"吃什么、怎么吃"&#xff0c;直接决定煤气利用率和炉况稳定——而这一切都写在炉顶料面上。料面平不平、漏斗深浅、有没有偏析&#xff0c;都是炉况的重要信号。可炉顶空间狭小、粉尘弥漫&#x…

2026/10/7 14:51:39 阅读更多 →
城市编号递增约束下的线性DP解法

城市编号递增约束下的线性DP解法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:51:39 阅读更多 →
ESP32五大实战项目:从内嵌Web到边缘AI,带你填平环境与烧录的坑

ESP32五大实战项目:从内嵌Web到边缘AI,带你填平环境与烧录的坑

玩ESP32也有五六年了&#xff0c;从最早的ESP32-WROOM-32一路用到现在的S3、C3甚至C6&#xff0c;说实话这块芯片是我见过的开发板里最“全能”的一个。既能当个小服务器内嵌Web网页&#xff0c;又能跑蓝牙、摄像头、边缘AI&#xff0c;还能读SD卡放音乐&#xff0c;关键是价格…

2026/10/7 14:50:37 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:13 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →