Python实现为PDF去除水印的示例代码


Posted in Python onApril 03, 2022

前言

为什么做出这个?

就是有时候从网上下载的资料中的pdf有水印,看着不舒服。

比如说我从网上下载的试卷,然后去打印店打印,打印之后水印看着很不舒服,而去水印wps要会员,而我是一个程序员,为什么不做一个呢,何乐而不为。

虽然最后是做出来的,但是还是有限制。

原理

把pdf转化为图片,然后将图片去水印。

图片去水印,是又条件限制的,必须水印的颜色和pdf中文字的颜色的rgb相差很大,然后把水印的颜色改变成背景颜色。

特色

网上很多和我类似的原理去水印,但是都是先pdf转化为图片存起来,然后图片去水印之后,然后把图片拼接成pdf。

而我就不需要中间步骤,我是直接输入pdf文件,输出pdf文件。

成果

安装依赖

Image

pip install pillow

fitz

pip install PyMuPDF

代码

程序处理pdf需要的时间比较久(因为处理的是像素点),可以先用页数少的pdf进行测试之后再去页数比较多的pdf。

from PIL import Image
import os
import io
import fitz
import time


def single_pdf_clearwater(pdf_path: str):
    pdf = fitz.open(pdf_path)   # 打开pdf目录
    pdf_img = fitz.open()       # 打开空文件,用来存图片pdf
    for page_inf in pdf:
        definition = 3    # 清晰度,感觉输出的pdf不够清晰,可以调大,调大,文件大小也会变大
        matrix = fitz.Matrix(definition, definition)
        img = page_inf.get_pixmap(matrix=matrix).tobytes()
        img = Image.open(io.BytesIO(img))
        width, height = img.size
        for i in range(width):
            for j in range(height):
                if sum(img.getpixel((i, j))) > 600: # 这里的600你需要根据自己的水印的颜色进行更改。
                    img.putpixel((i, j), (255, 255, 255))
        img = img.tobytes()  # = img = np.asarray(img);img = bytearray(img)
        img = fitz.Pixmap(fitz.csRGB, width, height, img)
        img = img.tobytes()
        img = fitz.open("png", img)
        pdf_bytes = img.convert_to_pdf()
        pdf_img.insert_pdf(fitz.open("pdf", pdf_bytes))
    if not os.path.exists("output"):
        os.makedirs("output")  # 处理好的pdf存入了output目录下
    pdf_img.save("output/去水印pdf_" + os.path.basename(pdf_path))


def group_pdf_clearwater(path_array: list[str]):
    print("************去水印时间比较久***********")
    for pdf_path in path_array:
        print(pdf_path, "去水印中...")
        single_pdf_clearwater(pdf_path)
    print("完成")


def folder_pdf_files(folder: str) -> list[str]:  # 一个文件夹里面有多少pdf文件
    file_list = []
    for a, b, c in os.walk(folder):
        if b == []:
            for filename in c:
                if filename[-3:].lower() == 'pdf':
                    file_path = os.path.join(a, filename)
                    file_list.append(file_path)
    print(folder, ": 有", len(file_list), "个pdf文件")
    return file_list


if __name__ == '__main__':
    time_start = time.time()
    path_list = folder_pdf_files("pdf的目录")
    group_pdf_clearwater(path_list)
    time_end = time.time()
    print("程序运行时间:", round(time_end - time_start, 2), "秒")

想法

虽然最后实现了,但是有限制。

为了去除保存图片后取图片的中间步骤,我查阅了很多的文献和资料,后面发现只有我最不想看的英文文档才找到了问题的答案。我就感觉,比较偏的点,只有英文文献才有。

因为限制,我在想是不是可以和python-普通pdf的添加水印的逆向思维进行操作,就是把水印图层直接取出来。
如果处理的pdf文件比较多,并且页数很多,程序运行就要很久,我都感觉像深度学习了。

到此这篇关于Python实现为PDF去除水印的示例代码的文章就介绍到这了,更多相关Python PDF去水印内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中二维阵列的变换实例
Oct 09 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
Nov 29 Python
Python 实现数据结构中的的栈队列
May 16 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
python读取Kafka实例
Dec 23 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
Python实现文字pdf转换图片pdf效果
Apr 03 #Python
python 实现图片特效处理
教你使用Python获取QQ音乐某个歌手的歌单
Python os和os.path模块详情
如何通过一篇文章了解Python中的生成器
Python pyecharts绘制条形图详解
Python OpenCV超详细讲解读取图像视频和网络摄像头
You might like
php csv操作类代码
2009/12/14 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
tp5实现微信小程序多图片上传到服务器功能
2018/07/16 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
2019/05/28 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python中set与frozenset方法和区别详解
2016/05/23 Python
Python学生信息管理系统修改版
2018/03/13 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
详解Python的循环结构知识点
2019/05/20 Python
Python设计密码强度校验程序
2020/07/30 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
Java程序员面试90题
2013/10/19 面试题
贷款担保书
2015/01/20 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书