前言

今天介绍下用 Python 去除 PDF (图片)的水印。思路很简单,代码也很简洁。

首先来考虑 Python 如何去除图片的水印,然后再将思路复用到 PDF 上面。

原理

这张图片是前几天整理《数据结构和算法》PDF里的一个截图,带着公众号的水印。

从上图可以明显看到,为了不影响阅读正文,水印颜色一般比较浅。因此,我们可以利用颜色差这个特征来去掉水印。即:用 Python 读取图片的颜色,并将浅颜色部分变白。

准备工作

  • Python 标准库 PIL 可以获取图片的颜色,Python2 是系统自带的,Python3 需要自己安装,我用的 Python 3.8,需要执行以下命令安装:

pip install pillow 
  • 安装完成,读取图片,并获取图片的尺寸(宽度和高度)

from PIL import Image img = Image.open('watermark_pic.png') width, height = img.size 

进行下一步之前,先简单介绍下计算机里关于颜色的知识。光学三原色是红绿蓝(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

for i in range(width): for j in range(height): pos = (i, j) print(img.getpixel(pos)[:3]) 

图片每个位置颜色由四元组表示,前三位分别是 RGB,第四位是 Alpha 通道,我们不需要关心。

有了 RGB ,我们就可以对其修改。

从图中可以发现,水印的 RGB 是 #d9d9d9,这里是用十六进制表示的,其实就是(217, 217, 217)。

这三个颜色值都越靠近 255,颜色就越淡,当它们都变成 255,也就成了白色。所以只要 RGB 都大于 217 的位置,我们都可以给它填成白色。即:RGB 三位数之和大于等于 651。

if sum(img.getpixel(pos)[:3]) >= 651: img.putpixel(pos, (255, 255, 255))
完整代码如下:from PIL import Image img = Image.open('watermark_pic.png')
width, height = img.size for i in range(width): for j in range(height): pos = (i, j) if sum(img.getpixel(pos)[:3]) >= 651: img.putpixel(pos, (255, 255, 255)) img.save('watermark_removed_pic.png') 

有了上面的基础,去除 PDF 的水印就简单了

代码实现

思路

思路是将每页 PDF 转成图片,然后修改水印的 RGB,最后输出图片即可。

1.安装 pymupdf 库,用来来操作 PDF

pip install pymupdf 

2.读取 PDF,并转图片

import fitz doc = fitz.open("数据结构和算法手册@公众号渡码.pdf") for page in doc: pix = page.get_pixmap() 

该 PDF 共 480 页,所以需要遍历每一页,并获取每一页对应的图片pix。pix对象类似于我们上面看到的img对象,可以读取、修改它的 RGB。

page.get_pixmap() 这个操作是不可逆的,即能够实现从 PDF 到图片的转换,但修改图片 RGB 后无法应用到 PDF 上,只能输出为图片。

修改水印 RGB 跟刚才一样,区别是这里的 RGB 是一个三元组,没有 Alpha 通道,代码如下:

from itertools import product for pos in product(range(pix.width), range(pix.height)): if sum(pix.pixel(pos[0], pos[1])) >= 651: pix.set_pixel(pos[0], pos[1], (255, 255, 255)) 

完整代码如下:

from itertools import product import fitz doc = fitz.open("数据结构和算法手册@公众号渡码.pdf") page_no = 0 for page in doc: pix = page.get_pixmap() for pos in product(range(pix.width), range(pix.height)): if sum(pix.pixel(pos[0], pos[1])) >= 651: pix.set_pixel(pos[0], pos[1], (255, 255, 255)) pix.pil_save(f"pdf_pics/page_{page_no}.png", dpi=(30000, 30000)) print(f'第 {page_no} 页去除完成') page_no += 1 

缺点

这种方案是有缺点的,

第一,输出并非 PDF 格式;

第二,输出的图片比较模糊,后续还有待优化,最好是能直接修改 PDF。

利用 Python 去除 PDF 水印(和图片水印原理一样)相关推荐

  1. 如何利用Python将PDF转化为图片?

    python的功能真是强大,可以做词云图.可以优雅地八卦.可以做游戏外挂.还可以将PDF转化成图片,这个功能你还不知道吧,赶紧随小编我一起来看看吧: 之前收集了很多优秀的 PDF文档,但是需要看的时候 ...

  2. 用 Python 去除 PDF 水印,你学会吗?

    今天介绍下用 Python 去除 PDF (图片)的水印.思路很简单,代码也很简洁. 首先来考虑 Python 如何去除图片的水印,然后再将思路复用到 PDF 上面. 这张图片是前几天整理<数据 ...

  3. 【itext学习之路】--4.给pdf增加文本水印和图片水印

    来源:[itext学习之路]-------(第四篇)给pdf增加文本水印和图片水印_tomatocc的博客-CSDN博客_itext添加水印 一般而言,许多公司在做pdf之后,都会将公司的logo或者 ...

  4. java为PDF添加水印,图片水印和文字水印

    java为PDF添加水印,文字水印和图片水印 一个需求,下载pdf.word.excel文件时要带有水印,要求铺满.先分开,先介绍为PDF文件添加文字水印和图片水印. 所需jar包:itext-2.0 ...

  5. 如何用java给PDF添加一个图片水印?

    以下代码需要添加jar包: itextpdf-5.3.2.jar import java.io.File; import java.io.FileOutputStream; import com.it ...

  6. java实现给PDF文件添加图片水印,java实现给PDF文件添加文字水印

    接上一篇,pdf跟tif 是一起做的 java实现 1.给PDF文件添加图片水印: public static void waterMark1(String inputFile,String outp ...

  7. 如何批量去除PDF文档的水印 .

    现在的互联网时代是一个共享的时代,我们会经常从网络上面下载一些文件资料等等,那么是不是经常会遇到一些网站上的PDF文件会含有该网站的水印或者网址链接等等,接下来我们就是要讲怎样去水印. 单个PDF页的 ...

  8. 【itext学习之路】-------(第四篇)给pdf增加文本水印和图片水印

    版权声明:如需转载使用,请注明原文地址 一般而言,许多公司在做pdf之后,都会将公司的logo或者网址以水印的方式添加到pdf文件中.本篇文章,我们将介绍在制作pdf的时候,如何将水印加入到pdf中去 ...

  9. php 文字水印去除毛边_php实现文字水印和图片水印,支持透明效果

    有时上传图片时需要给网站加上水印,水印可以分为文字水印和图片水印. 文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件.效果图如下: php文字水印效 ...

最新文章

  1. 电热水器技术性能指标
  2. 酷炫的深度学习网络图怎么绘制出来的?
  3. windows下bat处理执行Mysql的sql语句
  4. iOS定义静态变量、静态常量、全局变量
  5. 初等数学O 集合论基础 第六节 商集
  6. 在IIS express 下用ajax调用webmethod
  7. cmake中的变量和命令的大小写
  8. OOP组合和继续的优缺点
  9. iis php网站500错误原因_因为曾经错误安装过PHP5.2而导致IIS7无法正常工作,显示500错误提示,大家帮忙看看!...
  10. mac wmware 无网络_无线网络中常用的技术名词
  11. Android知识体系框架
  12. 学软件测试看什么书籍推荐?
  13. php循环的应用案例,php for循环的实例分享
  14. Python爬虫初探——天涯
  15. 刻录光驱只能读不能写怎么办?来看看!
  16. Spring Spring-data-redis 实现的消息队列
  17. 网络知识:水晶头网线和网线插座接法制作过程介绍
  18. 【无人机摄影测量技术必备知识】地面像控点布设经验整理-大比例尺
  19. android和ios测试环境搭建,iOS自动化测试环境搭建
  20. uni-app开发h5 发布后背景图片找不到路径

热门文章

  1. 随笔0006 个人作业——软件产品评测
  2. blackberry 7100
  3. 低功耗稳压芯片HT73XX系列
  4. iOS 画板的简单实现
  5. javacv学习之实现matlab中imfill算法(孔洞填充)
  6. 索尼WH-1000XM4 win11PC下声音音质差的解决方案
  7. HiJackThis(HJT)日志在线自动分析服务
  8. 周六日闲暇之余,做一些轻松浪漫的事情 二
  9. win2008r2 禁止ping
  10. OpenWrt开发必备软件模块——无线技术与PPPoE