十行Python3代码实现去除pdf文件水印
作者:Carl_奕然 发布时间:2022-02-27 10:50:15
1、引言
小 * 丝:鱼哥,最近有点不像话了。
小鱼:嗯?? 啥个意思嘛~
小 * 丝:一周了,没分享小知识了。
小鱼:就因为这个??
小 * 丝:那是,我这么爱学习的人。
小鱼:怕是你有什么事情解决不了,想到我了吧?
小 * 丝:呵 ~ 笑话 ~ 我 能有…什…么…事情…
小鱼:说吧,
小 * 丝:这可是你让我说的,我可没主动要问的!
小鱼:说吧,咋还磨磨唧唧了呢
小 * 丝:我在某站下载的pfd文档,有水印,如何去掉啊?
小鱼:我突然想起来,PPT还没写完。
小 * 丝:我家楼下刚开一个烧烤店,据说还不错!
小鱼:PPT写不完,可以晚上写,助人为乐让我更快乐。
2、代码实战
在上一篇博文,我们知道了如何给pdf文档添加水印,
而本篇,我们就给pdf去水印
如果不知道如何添加水印,就看这篇:2行Python代码实现给pdf文件添加水印
小 * 丝:你这添加完水印,又去除水印,你这是闹哪样??
小鱼:我喜欢,我稀罕,我乐意!!
2.1 去除原理
去除方法:
1、用 PyMuPDF 打开 pdf 文件,将 pdf 的每一页都转换为图片 pixmap,
2、pixmap 有它自己的 RGB,只需要将 pdf 水印中的 RGB 改为(255, 255, 255),并保存图片
3、按照生成的图片,插入到pdf文档中
因为pfd文档无法直接去除水印,需要先将pfd文档转换成图片,在逐一对图片进行水印去除操作,最后在把图片插入到pdf文档中
2.2 代码解析
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转换成图片,并去除水印
代码示例:
# -*- coding:utf-8 -*-
# @Time : 2022-02-23
# @Author : carl_DJ
from PIL import Image
from itertools import product
import fitz
# 去除pdf的水印
def remove_pdfwatermark():
#打开源pfd文件
pdf_file = fitz.open("跟小鱼学习去水印.pdf")
#page_no 设置为0
page_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
if __name__ == '__main__':
remove_pdfwatermark()
执行完成,
查看生成图片:
查看图片内容:
3、图片转为pdf
代码示例:
# -*- coding:utf-8 -*-
# @Time : 2022-02-23
# @Author : carl_DJ
from PIL import Image
from itertools import product
import fitz
''' 图片转为pdf'''
#图片所在的文件夹
pic_dir = 'D:\Project\watemark'
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)
#将打开后的图片转成单页pdf
pdfbytes = imgdoc.convertToPDF()
imgpdf = fitz.open("pdf", pdfbytes)
#将单页pdf插入到新的pdf文档中
pdf.insertPDF(imgpdf)
pdf.save("跟小鱼学习去水印_完成.pdf")
pdf.close()
执行代码,
查看生成的pdf文档
2.3 代码整合
上面的内容都了解以后,我们就整合代码,直接运行就可以了。
# -*- coding:utf-8 -*-
# @Time : 2022-02-23
# @Author : carl_DJ
from PIL import Image
from itertools import product
import fitz
# 去除pdf的水印
def remove_pdfwatermark():
#打开源pfd文件
pdf_file = fitz.open("跟小鱼学习去水印.pdf")
#page_no 设置为0
page_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 = 'D:\Project\watemark'
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)
#将打开后的图片转成单页pdf
pdfbytes = imgdoc.convertToPDF()
imgpdf = fitz.open("pdf", pdfbytes)
#将单页pdf插入到新的pdf文档中
pdf.insertPDF(imgpdf)
pdf.save("跟小鱼学习去水印_完成.pdf")
pdf.close()
if __name__ == '__main__':
remove_pdfwatermark()
pictopdf()
3、总结
写到这里,今天的分享就差不多快结束了。
需要理解的流程是,
1.pdf文档需要先转换成图片,进行水印去除,
2.再转换成pdf
3.最后插入到新的pdf文档中。
来源:https://blog.csdn.net/wuyoudeyuer/article/details/123084385
猜你喜欢
- 简介scrapy 是一个 python 下面功能丰富、使用快捷方便的爬虫框架。用 scrapy 可以快速的开发一个简单的爬虫,官方给出的一个
- Python批量替换文件内容,支持嵌套文件夹import ospath="./"for root,dirs,files
- 1、解决方法(1)忽视元组。缺少类别标签时,通常这样做(假设挖掘任务与分类有关),除非元组有多个属性缺失值,否则该方法不太有效。当个属性缺值
- 1. 定义本质是函数,用来装饰其他函数,为其他函数添加附加功能2. 原则a. 不能修改被装饰函数的源代码b. 不能修改被装饰的函数的调用方式
- 如果你在学校读的是计算机科学专业,那么可能学过 Lambda 表达式, 不过可能从来没有用过它。如果你不是计算机科学专业,它们看着可能 有点
- 本文实例讲述了Python实现清理微信僵尸粉功能。分享给大家供大家参考,具体如下:原理通过Pyhton调用itchat模块登录网页版微信,给
- 三遍记忆,让你记住海量素材的准确位置和用途,提高其可用性.这仅仅是一个示意图.在以往的日子里,我做到了只要脑袋里冒出一个想法,立刻就能知道我
- 帮网友小改了一下主题. 任务比较简单, 只是为一个三栏主题添加对 Widget 的支持而已,就先从这次简单的案例开始说吧.单侧边栏funct
- 1. 图像缩放1.2. 使用命令import cv2# 缩放def resize(img, k, inter):
- subprocess.run()运行并等待args参数指定的指令完成,返回CompletedProcess实例。参数:(*popenargs
- 很早之前就在PJ的blog上看到可以用VS2005调试ASP程序,但是没有写出具体的步骤,后来一次偶尔也让我找到了方法,但是一直没把它写出来
- 内容摘要: Request和Response这两个对象是ASP所提供的内置对象中最常用的两个。在浏览器(或其他用户代理)和Web服
- 本文实例讲述了Python筛选及提取序列中元素的方法。分享给大家供大家参考,具体如下:问题:提取出序列中的值或者根据某些标准对序列做删减解决
- 方法1: X:\oracle\ora81\bin\wrap iname=XXX oname=XXX 方法2:9i在win2000下使用wra
- 永远不要相信用户输入的内容具有适当的大小或者包含适当的字符。在使用其做出决策之前应该始终对用户输入进行验证。最佳的选择是创建一个
- PHP从主流来看,是一门面向过程的语言,它的最大缺点就是无法实现多线程管理,其程序的执行都是从头到尾,按照逻辑一路执行下来,不可能出现分支,
- 前言随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还
- 1.字符串的驻留机制字符串:在Python中字符串是基本的数据类型,是一个不可变的字符序列2.什么叫字符串的驻留机制仅保存一份相同且不可变字
- 最近一段时间一直在研究yolo物体检测,基于网络上很少有yolo的分类预训练和yolo9000的联合数据的训练方法,经过本人的真实实验,对这
- PHP信息函数包含的一些函数概念总结如下。PHP信息函数之getenv适用版本:PHP3, PHP4函数功能:取得环境变量数值。函数语法:s