文章目录

  • 前言
  • 一、PDF文件
  • 二、思路整理
    • 1、分割图片
    • 2、去除水印
    • 3、替换图片
  • 三、实现效果
  • 四、代码实现
  • 总结

前言

最近在下载PDF书籍的时候,发现有些PDF有水印,于是就寻思着能不能用Python去除这些讨厌的水印


一、PDF文件

关于PDF文件,想必大家都很熟悉了,这里就不过多的介绍了。PDF主要有两种类型,一种是文字版,另外一种就是扫描版(图片)。这个去除水印主要就是针对扫描版的PDF
代码路径

二、思路整理

在开始写代码之前,先捋一下实现的思路

1、分割图片

对于一个PDF文件,我们只需要图片信息就可以了,所以首先需要先提取里边的图片,再把图片存在一个目录下。这里需要用到fitz模块,直接安装即可,如下:

pip install PyMuPDF

模块安装完之后,代码就很简单了,只需要注意一下图片按顺序命名即可,如下:


def split_pdf(file_path, out_path):"""切割pdf为图片:param file_path: pdf路径:param out_path: 输出图片路径:return: 输出路径"""pdf = fitz.open(file_path)count = 0print("##### 开始保存切割图片 #####")for page in pdf:image_list = page.get_images()for img_info in image_list:pix = fitz.Pixmap(pdf, img_info[0])pix.save(os.path.join(out_path, '%d.jpg' % count))count += 1print("##### 保存切割图片完毕 #####")print("##### {0} 包含 {1} 张图片 #####".format(file_path, count))return out_path

2、去除水印

分割完图片后,接下来的问题也随之而来了,要如何区分水印和正常图片? 要替换成什么? 先来看第一个问题,如何区分水印

  • 按水印位置
    这个问题,最直观的想法就是根据水印的位置以及水印的大小,进行替换就可以。但是这样存在问题,首先就是不通用(PDF水印的位置可能不一样),再者就是水印和字混在一起就不好弄了

像这种水印,坐标和大小是可以去除的

像这种字和水印混在一起就难办了

  • 按颜色
        我们在观察下水印,发现水印的颜色一般偏亮一点,而字都是偏暗色的(黑色、灰色)。我们可以根据颜色将亮一点的颜色都替换掉。但这种方式也有问题,如果是彩色的,就够呛了

对于第二个问题:要替换成什么? 如果只有简单的颜色(黑白灰等),我们直接把水印替换成白色即可

接下来来看下代码吧,这里需要用到PIL模块,直接安装就行了,如下:

pip install pillow

思路有了,代码就简单了,如下:


def get_image_arr(img):"""获取图片三色数组:param img:图片:return: 图片编码、三色数组"""img_arr = np.asarray(img, dtype=np.double)# 分离通道r_img = img_arr[:, :, 0].copy()g_img = img_arr[:, :, 1].copy()b_img = img_arr[:, :, 2].copy()img = r_img * 256 * 256 + g_img * 256 + b_imgreturn img, r_img, g_img, b_imgdef replace_clr_color(img, src_clr, dst_clr):"""通过矩阵操作颜色替换程序@param  img:    图像矩阵@param  src_clr:    需要替换的颜色(r,g,b)@param  dst_clr:    目标颜色        (r,g,b)@return             替换后的图像矩阵"""img, r_img, g_img, b_img = get_image_arr(img)src_color = src_clr[0] * 256 * 256 + src_clr[1] * 256 + src_clr[2]# 索引并替换颜色r_img[img == src_color] = dst_clr[0]g_img[img == src_color] = dst_clr[1]b_img[img == src_color] = dst_clr[2]return compound_img(r_img, g_img, b_img)def compound_img(r_img, g_img, b_img):"""合并图片:param r_img: 红色:param g_img: 绿色:param b_img: 蓝色:return: 图片"""# 合并通道dst_img = np.array([r_img, g_img, b_img], dtype=np.uint8)# 将数据转换为图像数据(h,w,c)dst_img = dst_img.transpose(1, 2, 0)return dst_imgdef replace_pure_color(img, src_color, dst_color):"""通过矩阵操作颜色替换程序(纯色):param img: 图像矩阵:param src_color: 需要替换的颜色:param dst_color: 目标颜色:return: 图片"""img, r_img, g_img, b_img = get_image_arr(img)src_color = src_color * 256 * 256 + src_color * 256 + src_color# 索引并替换颜色r_img[img >= src_color] = dst_colorg_img[img >= src_color] = dst_colorb_img[img >= src_color] = dst_colorreturn compound_img(r_img, g_img, b_img)def wipe_watermark(img_file, start_color):"""去除图片水印:param start_color: 颜色起始替换位置:param img_file: 图片文件:return:"""img = replace_pure_color(Image.open(img_file).convert('RGB'), start_color, 255)res_img = Image.fromarray(img)res_img.save(img_file)

3、替换图片

保存完去除水印后的图片,接下来只要把他一个个替换进去就行了

由于原始PDF文件可以有其他东西(书签等),所以我们先把原始文件读取进去,在进行替换,代码如下:

def save_pdf(src_pdf, dest_pdf, file_list):"""生成最终pdf文件:param src_pdf: 源文件:param dest_pdf: 目标文件:param file_list: 图片列表:return:"""pdf = fitz.open(src_pdf)index = 0try:for page in pdf:# 去除超链接for link in page.get_links():page.delete_link(link)# 替换图片for img in page.get_images():page._insert_image(filename=file_list[index], _imgname=img[7])index = index + 1pdf.save(dest_pdf)finally:pdf.close()

三、实现效果

lu完代码,再来看一下效果怎么样,这边用了两个PDF做实验,第一个PDF效果如下:

去除水印前:


去除水印后:

第二个PDF效果如下:

去除水印前:

去除水印后:

感觉效果还阔以,哈哈。不过这里有个问题,对于文字logo,查了PyMuPDF文档没找到罒ω罒,像这种

四、代码实现

全部代码如下:

import osimport fitz
import numpy as np
from PIL import Imagedef split_pdf(file_path, out_path):"""切割pdf为图片:param file_path: pdf路径:param out_path: 输出图片路径:return: 输出路径"""pdf = fitz.open(file_path)count = 0print("##### 开始保存切割图片 #####")for page in pdf:image_list = page.get_images()for img_info in image_list:pix = fitz.Pixmap(pdf, img_info[0])pix.save(os.path.join(out_path, '%d.jpg' % count))count += 1print("##### 保存切割图片完毕 #####")print("##### {0} 包含 {1} 张图片 #####".format(file_path, count))return out_pathdef get_image_arr(img):"""获取图片三色数组:param img:图片:return: 图片编码、三色数组"""img_arr = np.asarray(img, dtype=np.double)# 分离通道r_img = img_arr[:, :, 0].copy()g_img = img_arr[:, :, 1].copy()b_img = img_arr[:, :, 2].copy()img = r_img * 256 * 256 + g_img * 256 + b_imgreturn img, r_img, g_img, b_imgdef replace_clr_color(img, src_clr, dst_clr):"""通过矩阵操作颜色替换程序@param  img:    图像矩阵@param  src_clr:    需要替换的颜色(r,g,b)@param  dst_clr:    目标颜色        (r,g,b)@return             替换后的图像矩阵"""img, r_img, g_img, b_img = get_image_arr(img)src_color = src_clr[0] * 256 * 256 + src_clr[1] * 256 + src_clr[2]# 索引并替换颜色r_img[img == src_color] = dst_clr[0]g_img[img == src_color] = dst_clr[1]b_img[img == src_color] = dst_clr[2]return compound_img(r_img, g_img, b_img)def compound_img(r_img, g_img, b_img):"""合并图片:param r_img: 红色:param g_img: 绿色:param b_img: 蓝色:return: 图片"""# 合并通道dst_img = np.array([r_img, g_img, b_img], dtype=np.uint8)# 将数据转换为图像数据(h,w,c)dst_img = dst_img.transpose(1, 2, 0)return dst_imgdef replace_pure_color(img, src_color, dst_color):"""通过矩阵操作颜色替换程序(纯色):param img: 图像矩阵:param src_color: 需要替换的颜色:param dst_color: 目标颜色:return: 图片"""img, r_img, g_img, b_img = get_image_arr(img)src_color = src_color * 256 * 256 + src_color * 256 + src_color# 索引并替换颜色r_img[img >= src_color] = dst_colorg_img[img >= src_color] = dst_colorb_img[img >= src_color] = dst_colorreturn compound_img(r_img, g_img, b_img)def list_file(path, suffix=None):"""获取指定目录下指定后缀文件:param path: 路径:param suffix: 后缀名:return: 文件集合"""file_names = os.listdir(path);# 获取文件名if suffix is not None:file_names = [file_name for file_name in file_names if file_name.endswith(suffix)]file_names.sort(key=lambda x: int(x[:(-len(suffix))]))# 文件名拼接路径return [os.path.join(path, file) for file in file_names]def wipe_watermark(img_file, start_color):"""去除图片水印:param start_color: 颜色起始替换位置:param img_file: 图片文件:return:"""img = replace_pure_color(Image.open(img_file).convert('RGB'), start_color, 255)res_img = Image.fromarray(img)res_img.save(img_file)def save_pdf(src_pdf, dest_pdf, file_list):"""生成最终pdf文件:param src_pdf: 源文件:param dest_pdf: 目标文件:param file_list: 图片列表:return:"""pdf = fitz.open(src_pdf)index = 0try:for page in pdf:# 去除超链接for link in page.get_links():page.delete_link(link)# 替换图片for img in page.get_images():page._insert_image(filename=file_list[index], _imgname=img[7])index = index + 1pdf.save(dest_pdf)finally:pdf.close()def start(file_path, dest_path, start_color, out_path=r'out'):if os.path.exists(out_path):# shutil.rmtree(out_path)raise FileExistsError('文件夹:{0} 已存在'.format(out_path))os.mkdir(out_path)print("####### 开始切割pdf:{0} #######".format(file_path))split_pdf(file_path, out_path)print("####### 切割pdf完毕:{0} #######".format(file_path))# 获取文件名file_list = list_file(out_path, ".jpg")print("####### 开始去除水印 #######")for img_file in file_list:wipe_watermark(img_file, start_color)print("####### 去除水印结束 #######")# 生成pdfprint("####### 生成pdf文件:{0} #######".format(dest_path))save_pdf(src_pdf=file_path, dest_pdf=dest_path, file_list=file_list)print("####### 生成pdf文件:{0} 完成 #######".format(dest_path))# make_pdf(dest_path, file_list)if __name__ == '__main__':# replace_pdf(src_pdf="深入剖析TOMCAT.pdf", dest_pdf='a.pdf', file_list=list_file('out', ".jpg"))# www.TopSage.comstart(file_path="重构-改善既有代码的设计.pdf", dest_path="b.pdf", start_color=175)

总结

这里实现相对比较简单,只能去除一些纯色图片的PDF,这里没能去除文字logo(懂得大佬麻烦告知一下(〃‘▽’〃))。这里就作为个简单的demo吧。主要是用Python做点骚操作,用来熟悉一下Python语言

用Python去除PDF水印尝试相关推荐

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

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

  2. 利用 Python 去除 PDF 水印(和图片水印原理一样)

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

  3. Python:快速去除PDF水印

    本文分享一个快速去除PDF水印的小程序,亲测有效. 写一点关于使用的说明: 程序最后的"if __name__ == '__main__': "部分,这里边有两个自定义函数,分别是 ...

  4. python去除图片水印_Python | 图中使用类的水印

    python去除图片水印 Sometimes, we need to add watermark as a standard category of plots and therefore, we a ...

  5. Java 实现PDF转图片,去除PDF水印,图片转PDF

    1.依赖jar包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian& ...

  6. PDF怎么去水印,去除PDF水印的方法

    有些PDF文件会把文件中添加上水印,但我们在使用的时候感觉不是那么好,这个时候就需要去除水印了.那么PDF文件去除水印的方法是什么呢?估计有许多的小伙伴还不是懂,今天小编就来跟大家分享一下PDF去除水 ...

  7. PDF怎么编辑,如何去除PDF水印

    对于很多已经参加工作的小伙伴来说,PDF文件已经是再熟悉不过的了,那么,对于刚刚接触PDF文件的小伙伴们来说,PDF文件的修改编辑,估计还不知道该怎么操作吧.当你拿到PDF文件的时候,想要删除文件中的 ...

  8. 有哪些去除pdf水印的方法?说几个思路

    有哪些去除pdf水印的方法?PDF通常包含有版权信息.机构标识.文档名称.日期等水印信息,是一种常见的电子文件格式,但有时我们可能会遇到一些带有水印的PDF文件,这可能会影响我们的使用.这些水印旨在保 ...

  9. C# spire 去除PDF 水印

    C# spire 去除PDF 水印 引入包 FreeSpire.XLS 官网:https://www.e-iceblue.com/Tutorials/Spire.PDF/Program-Guide/T ...

最新文章

  1. ASP Win7旗舰版中的IIS配置asp.net的运行环境
  2. npm获取配置,设置代理
  3. 简单的客户端,服务端通信
  4. 【干货】求之不得的 Java 文档教程大汇总!
  5. 信息学奥赛一本通C++语言——1061:求整数的和与均值
  6. Android-opencv之CVCamera (转载)
  7. php用curl调用接口方法,get和post两种方式
  8. AI与大众最近的接触——智能语音交互
  9. HDX RealTime 避免回音
  10. 均线突破matlab编程,通达信均线粘合突破选股指标公式
  11. Java数据持久层框架
  12. 抓考研英语单词主要矛盾的经验分享,考研英语真题词频统计
  13. 2:0战胜Dota2世界冠军OG,OpenAI发起全网挑战,不服来战!
  14. Unity Shader数学基础——笛卡尔坐标,点,矢量
  15. rust服务器人数查询网站,Rust Web框架列表
  16. 软件企业出口退税计算机题,出口退税计算题解析
  17. 计算机专业未来规划作文英文,以“未来的职业”写一篇英语作文
  18. 在SQL中创建时间维度表
  19. python求真分数_Python 列出最简真分数序列*
  20. excel中录制宏只执行一半的命令,没有执行全部如何解决?

热门文章

  1. 国培_阶段性学习总结
  2. 圣思园——JAVA SE Lesson 1
  3. MySQL第三方客户端工具
  4. 虾皮春节期间的发货问题和物流设置
  5. 总结Criteria的简要使用概述(Hibernate5.2+)
  6. 侦测卡 变色龙侦测卡 chameleon-Mini(迷你变色龙) (二)
  7. Appollo高精度地图二——数据采集生产及产品实例
  8. 锁定计算机重启会变更ip吗,计算机更改IP不需要重启的方法
  9. mybatis源码-plugin源码
  10. eNSP:实现不同网段不同vlan主机之间的互访(配置单臂路由)