当前位置: 首页 > news >正文

【python实用小脚本-194】Python一键给PDF加水印:输入文字秒出防伪文件——再也不用开Photoshop

Python一键给PDF加水印:输入文字秒出防伪文件——再也不用开Photoshop

PDF加水印, 本地脚本, 零会员费, 防伪标记, 瑞士军刀

故事开场:一把瑞士军刀救了投标的你

周五下午,你把 100 页标书 PDF 发给客户,却担心被同行盗用。
想加水印,打开 Photoshop 导出再合并?图层爆炸,电脑风扇狂转。
这时,你从桌面掏出“小白瑞士军刀”——main.py
终端里输入:

PDF file: bid.pdf
Enter the watermark text here: CONFIDENTIAL - 2024

30 秒后,finalDraft.pdf 生成,每页都斜着灰字“CONFIDENTIAL - 2024”,盗用者无从下手。
痛点解决:再也不用庞大设计软件,一句命令给 PDF 打防伪标签。


完整代码(≤1000字符,直接展示)

from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from PyPDF2 import PdfFileReader, PdfFileWriterdef make_watermark(text):c = canvas.Canvas("watermark.pdf", pagesize=A4)c.translate(inch, inch)c.setFillColor(colors.grey, alpha=0.6)c.setFont("Helvetica", 50)c.rotate(45)c.drawCentredString(400, 100, text)c.save()def add_watermark(pdf_file):watermark = 'watermark.pdf'merged = "finalDraft.pdf"with open(pdf_file, "rb") as inp, open(watermark, "rb") as wm:reader = PdfFileReader(inp)writer = PdfFileWriter()wm_page = PdfFileReader(wm).getPage(0)for i in range(reader.numPages):page = reader.getPage(i)page.mergePage(wm_page)writer.addPage(page)with open(merged, "wb") as out:writer.write(out)if __name__ == "__main__":text = input("水印文字: ")pdf_file = input("PDF 路径: ")make_watermark(text)add_watermark(pdf_file)

代码解析

功能块 1:快速画水印

reportlab 三行生成带旋转角度的透明水印 PDF,字体大小颜色可调。

c.setFillColor(colors.grey, alpha=0.6)
c.rotate(45)
c.drawCentredString(400, 100, text)

功能块 2:逐页合并

PyPDF2 把水印页当作图层,循环合并到每一页,顺序不变。

page.mergePage(wm_page)

功能块 3:零残留输出

合并完直接生成 finalDraft.pdf,无临时文件,干净清爽。

writer.write(out)

如果还想更厉害

扩展点子 1:批量文件夹

reports/ 里所有 PDF 一键加统一水印。

import glob
for pdf in glob.glob("reports/*.pdf"):add_watermark(pdf)

扩展点子 2:GUI拖放+预览

tkinter 做窗口,拖文件+实时预览水印位置。

import tkinter.filedialog as fd
pdf_file = fd.askopenfilename()

总结

main.py 这把 30 行瑞士军刀,把“打开PS→画水印→导出→合并”四步压缩成“输入文字+回车”。
你无需会员、无需联网,就能把任意 PDF 打上专属防伪水印。
再加两行批量或 GUI,它就从脚本升级成版权工厂。
下次再怕文件被转发,直接跑脚本,30 秒给 PDF 上锁!


源码获取

完整代码已开源,包含详细的注释文档:
🔗 [GitCode仓库] https://gitcode.com/laonong-1024/python-automation-scripts
📥 [备用下载] https://pan.quark.cn/s/654cf649e5a6 提取码:f5VG

http://www.dtcms.com/a/342422.html

相关文章:

  • 文字识别——PDF OCR
  • electron-vite_19配置环境变量
  • 亚马逊站外推广效能重构:自然排名提升的逻辑与实操边界
  • 底层逻辑颠覆者:Agentic BI如何通过“Data + AI Agent”架构重构数据价值链?
  • 【C++】继承(详解)
  • 开心实习之第二十九天
  • Bartender 5 多功能菜单栏管理(Mac电脑)
  • NPM组件 @angular_devkit/core 等窃取主机敏感信息
  • 消息中间件选型分析:RabbitMQ vs RocketMQ vs Kafka
  • java生成带水印的pdf文件
  • 【从零构建企业级线程池管理系统:Python并发编程实战指南】
  • 医疗智能体高质量问诊路径开发:基于数智立体化三维评估框架(go语言)
  • [新启航]长轴深孔检测 - 激光频率梳 3D 轮廓检测
  • Go语言中的迭代器模式与安全访问实践
  • Linux应用层开发--线程池介绍
  • 【网络运维】Shell:变量数值计算
  • redis-缓存-双写一致性
  • 【Django:基础知识】
  • 掌控不平等的力量:深入解析帕雷托分布与二八法则的数学内核
  • python测试开发django-1.开始hello world!
  • 《零基础入门AI:深度学习之NLP基础学习》
  • 在Python中, list相减 要从一个列表(valid_points)中排除另一个列表(yuanjian_jiaodian)的所有元素
  • Linux CentOS 安装 .net core 3.1
  • 银河麒麟V10系统离线安装zabbix-agent教程
  • 18维度解密·架构魔方:一览无遗的平衡艺术
  • nginx-重定向-正则表达式-路由匹配优先级
  • Qt截图工具项目开发教程 - 从零开始构建系统截图工具
  • 【ARM】Keil MDK如何指定单文件的优化等级
  • 牛津大学xDeepMind 自然语言处理(5)
  • 基于 Kubernetes 的 WordPress 网站部署(使用 ConfigMap)