用python制作去除 pdf 文件水印脚本

  • 前因后果
  • 去除水印原理
  • 代码剖析
    • 1、先查看PDF文档中的水印rgb值是多少
    • 2、pdf转换成图片,并去除水印
    • 3、图片转为pdf
  • 代码整合
  • 总结

前因后果

弟弟最近要考试,临时抱佛脚在网上找了一堆学习资料复习,这不刚就来找我了,说PDF上有水印,影响阅读效果,到时候考不好就怪资料不行,气的我差点当场想把他揍一顿!

算了,弟弟长大了,看在打不过他的份上,就不打他了~

稍加思索,我想起了Python不是可以去水印?说搞就搞!

去除水印原理

去除方法:

  1. 用 PyMuPDF 打开 pdf 文件,将 pdf 的每一页都转换为图片 pixmap
  2. pixmap 有它自己的RGB,只需要将 pdf 水印中的 RGB 改为(255, 255, 255),并保存图片 ;
  3. 按照生成的图片,插入到pdf文档中;

因为pfd文档无法直接去除水印,需要先将pfd文档转换成图片,在逐一对图片进行水印去除操作,最后在把图片插入到pdf文档中。

代码剖析

1、先查看PDF文档中的水印rgb值是多少

可以看到,RGB(179,179,179),因为这里要的是RGB色值总和,所以我们就认为,超过510,就认为是水印。

敲黑板

光学三原色是红绿蓝(RGB),也就是说它们是不可分解的三种基本颜色,其他颜色都可以通过这三种颜色混合而成,三种颜色等比例混合就是白色,没有光就是黑色。
在计算机中,可以用三个字节表示 RGB 颜色,1个字节能表示的最大数值是 255, 所以,(255, 0, 0)代表红色,(0, 255, 0)代表绿色,(0, 0, 255)代表蓝色。相应地,(255, 255, 255)代表白色,(0, 0, 0)代表黑色。从(0, 0, 0) ~ (255, 255, 255) 之间的任意组合都可以代表一个不同的颜色。
图片每个位置颜色由四元组表示,前三位分别是 RGB,第四位是 Alpha 通道

2、pdf转换成图片,并去除水印

代码示例:

from PIL import Image
from itertools import product
import fitz# 去除pdf的水印
def remove_pdfwatermark():#打开源pfd文件pdf_file = fitz.open("源码找落落阿.pdf")#page_no 设置为0page_no = 0#page在pdf文件中遍历for page in pdf_file:#获取每一页对应的图片pix (pix对象类似于我们上面看到的img对象,可以读取、修改它的 RGB)#page.get_pixmap() 这个操作是不可逆的,即能够实现从 PDF 到图片的转换,但修改图片 RGB 后无法应用到 PDF 上,只能输出为图片pix = page.get_pixmap()#遍历图片中的宽和高,如果像素的rgb值总和大于510,就认为是水印,转换成255,255,255-->即白色for pos in product(range(pix.width), range(pix.height)):if sum(pix.pixel(pos[0], pos[1])) >= 510:pix.set_pixel(pos[0], pos[1], (255, 255, 255))#保存去掉水印的截图pix.pil_save(f"./{page_no}.png", dpi=(30000, 30000))#打印结果print(f'第 {page_no} 页去除完成')page_no += 1if __name__ == '__main__':remove_pdfwatermark()

执行完成

查看生成图片:

查看图片内容

3、图片转为pdf

代码示例:

from PIL import Image
from itertools import product
import fitz''' 图片转为pdf'''
#图片所在的文件夹
pic_dir = 'F:\123'pdf = fitz.open()
#图片数字文件先转换成int类型进行排序
img_files = sorted(os.listdir(pic_dir), key=lambda x: int(str(x).split('.')[0]))
for img in img_files:print(img)imgdoc = fitz.open(pic_dir + '/' + img)#将打开后的图片转成单页pdfpdfbytes = imgdoc.convertToPDF()imgpdf = fitz.open("pdf", pdfbytes)#将单页pdf插入到新的pdf文档中pdf.insertPDF(imgpdf)
pdf.save("源码找落落阿_完成.pdf")
pdf.close()

执行代码

查看生成的pdf文档

代码整合

上面的内容都了解以后,我们就整合代码,直接运行就可以了。

from PIL import Image
from itertools import product
import fitz# 去除pdf的水印
def remove_pdfwatermark():# 打开源pfd文件pdf_file = fitz.open("源码找落落阿.pdf")# page_no 设置为0page_no = 0# page在pdf文件中遍历for page in pdf_file:# 获取每一页对应的图片pix (pix对象类似于我们上面看到的img对象,可以读取、修改它的 RGB)# page.get_pixmap() 这个操作是不可逆的,即能够实现从 PDF 到图片的转换,但修改图片 RGB 后无法应用到 PDF 上,只能输出为图片pix = page.get_pixmap()# 遍历图片中的宽和高,如果像素的rgb值总和大于510,就认为是水印,转换成255,255,255-->即白色for pos in product(range(pix.width), range(pix.height)):if sum(pix.pixel(pos[0], pos[1])) >= 510:pix.set_pixel(pos[0], pos[1], (255, 255, 255))# 保存去掉水印的截图pix.pil_save(f"./{page_no}.png", dpi=(30000, 30000))# 打印结果print(f'第 {page_no} 页去除完成')page_no += 1# 去除的pdf水印添加到pdf文件中
def pictopdf():# 水印截图所在的文件夹# pic_dir = input("请输入图片文件夹路径:")pic_dir = 'F:\123'pdf = fitz.open()# 图片数字文件先转换成int类型进行排序img_files = sorted(os.listdir(pic_dir), key=lambda x: int(str(x).split('.')[0]))for img in img_files:print(img)imgdoc = fitz.open(pic_dir + '/' + img)# 将打开后的图片转成单页pdfpdfbytes = imgdoc.convertToPDF()imgpdf = fitz.open("pdf", pdfbytes)# 将单页pdf插入到新的pdf文档中pdf.insertPDF(imgpdf)pdf.save("源码找落落阿_完成.pdf")pdf.close()if __name__ == '__main__':remove_pdfwatermark()pictopdf()

兄弟们学习python,有时候不知道怎么学,从哪里开始学。掌握了基本的一些语法或者做了两个案例后,不知道下一步怎么走,不知道如何去学习更加高深的知识。
那么对于这些大兄弟们,我准备了大量的免费视频教程,PDF电子书籍,以及源代码!
直接在文末名片自取即可~








总结

需要理解的流程是:

  • pdf文档需要先转换成图片,进行水印去除;
  • 再转换成pdf ;
  • 最后插入到新的pdf文档中;

写到这里,今天的分享就差不多快结束了,咱们下次再见!

python一键去PDF水印,只需十行代码,超级简单...相关推荐

  1. 如何借助ImageAI轻松实现目标检测(只需十行代码)

    知乎转载https://www.zhihu.com/question/26483508/answer/447708695 只需10行Python代码,我们就能实现计算机视觉中目标检测. from im ...

  2. python操作Excel表格小妙招:只需十行代码,可以将多张Excel合并为一张

    前几天遇见这么一个问题,手上有很多张表格,这些表格中都只有一个 sheet,需要把这些表汇总到一张表. 一张表中有多个 sheet,每一个 sheet 的名称是每张表格的文件名. 如果手动合并,往往需 ...

  3. python一键去抖音视频水印工具,请勿用于学习以外的用途!

    一.前言 翻了翻爬虫代码存货,决定把抖音APP视频批量下载的代码拿出来做个文章. 二.实战背景 抖音越来越火,越刷越上瘾,总感觉下一个视频一定会更精彩,根本停不下来.想将抖音里喜欢的小哥哥/×××姐的 ...

  4. Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码

    在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使用 Python 封装发送邮件代码的. 一般发邮件方法 SMTP是发送邮件的协议, ...

  5. python实现英文新闻摘要自动提取_利用Python实现摘要自动提取,完美瘦身只需一行代码...

    原标题:利用Python实现摘要自动提取,完美瘦身只需一行代码 今天给大家推荐一个也可以用于关键字提取的算法TextRank,但主要实现的功能是快速从长篇新闻中抽取精准摘要. 前言介绍 TextRan ...

  6. Python第三方库巧用,制作图片验证码只需三行代码

    现在验证码的种类真的是越来越多,短信验证码.语音验证码.图片验证码.滑块验证码 - 我们在 PC 的网页端或者手机上的 app 进行登录或者注册时,应该总会遇见图片验证码,比如下面这类: 上面这些图片 ...

  7. python怎样实现封装_大牛教你如何封装 Python 代码,实现自动发送邮件只需三行代码...

    在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使用 Python 封装发送邮件代码的. 一般发邮件的方式 SMTP是发送邮件的协议 ...

  8. python封装sql脚本 github_Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码...

    原标题:Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码 在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使 ...

  9. Sweetviz:让你只需三行代码实现Python探索性数据分析

    Sweetviz 是一个开源 Python 库,它只需三行代码就可以生成漂亮的高精度可视化效果来启动EDA(探索性数据分析).输出一个HTML.文末提供技术交流群,喜欢点赞支持,收藏. 如上图所示,它 ...

最新文章

  1. 深度学习框架PyTorch学习——训练一个分类器
  2. linux系统中如何查看日志 (常用命令)
  3. mysql卸载工具下载_MySQL的卸载、下载与安装
  4. 动态箭头gif图标_别以为只有专业人士才能做出酷炫的#动态跑分图#
  5. linux下用ntp对时
  6. 均线策略---使用quartz实现策略
  7. 工具丨超好用的免费AWR分析工具
  8. jar导出与制作成exe在没jdk电脑下运行(图文教程+工具)
  9. 全球首发!计算机视觉Polygon Mesh Processing读书笔记6——微分几何中的Metric Properties
  10. 【等价转换】—— min/max 的转换与互相转换
  11. 服务器上发布的网站应用80端口时内网可以访问,外网不能访问
  12. 顶级区块链开发人员工具:涉及框架、IDE、安全工具、测试网络、区块链预言机和节点服务
  13. 服务器server怎么显示后缀名,window7系统怎么显示文件后缀名(图文)
  14. python django的查询语句
  15. puppet单机模型
  16. 利用Python+Gephi构建金庸人物知识图谱
  17. CF869 E. The Untended Antiquity
  18. Day41——Dp专题
  19. 汉谷拼形是克服“提笔忘字”最犀利的武器
  20. 网站收录查询,常用的2种网站收录查询方法

热门文章

  1. 2020年开春最新面试!今日头条 Android 面试题及答案 (已拿到 offer)
  2. 程序员毕业1-2年如何正确编写自己简历
  3. 【PCIe 5.0 - 1】PCIe Link属性
  4. SQL——基础语句练习
  5. js实现GeoHash算法
  6. 配置网站的快捷方式图标及收藏图标
  7. el-dialog改变中间内容的高度问题
  8. eNSP:实现不同网段不同vlan主机之间的互访(配置三层交换)
  9. Java单精度与双精度区别_java单精度和双精度的区别
  10. python中sep的用法:逗号的去除