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 相关文章推荐
python3.3实现乘法表示例
Feb 07 Python
Python 列表(List)操作方法详解
Mar 11 Python
python命令行参数解析OptionParser类用法实例
Oct 09 Python
举例讲解Python中装饰器的用法
Apr 27 Python
python的pip安装以及使用教程
Sep 18 Python
Django REST framework视图的用法
Jan 16 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 Python
python中的插入排序的简单用法
Jan 19 Python
Python第三方库安装缓慢的解决方法
Feb 06 Python
Python异常类型以及处理方法汇总
Jun 05 Python
Python实现文字pdf转换图片pdf效果
Apr 03 #Python
python 实现图片特效处理
教你使用Python获取QQ音乐某个歌手的歌单
Python os和os.path模块详情
如何通过一篇文章了解Python中的生成器
Python pyecharts绘制条形图详解
Python OpenCV超详细讲解读取图像视频和网络摄像头
You might like
php 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
php中file_exists函数使用详解
2015/05/08 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
python实现静态web服务器
2019/09/03 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
中式婚礼主持词
2014/03/13 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
2014年店长工作总结
2014/11/17 职场文书
入队仪式主持词
2015/07/04 职场文书
保护环境的宣传语
2015/07/13 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
SQL Server删除表中的重复数据
2022/05/25 SQL Server
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技