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笔记(2)
Oct 24 Python
讲解Python中for循环下的索引变量的作用域
Apr 15 Python
Django Web开发中django-debug-toolbar的配置以及使用
May 06 Python
django 解决manage.py migrate无效的问题
May 27 Python
Linux下python3.7.0安装教程
Jul 30 Python
python实现机器学习之多元线性回归
Sep 06 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
python语言是免费还是收费的?
Jun 15 Python
python实现PDF中表格转化为Excel的方法
Jun 16 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
python垃圾回收机制原理分析
Apr 13 Python
Python实现文字pdf转换图片pdf效果
Apr 03 #Python
python 实现图片特效处理
教你使用Python获取QQ音乐某个歌手的歌单
Python os和os.path模块详情
如何通过一篇文章了解Python中的生成器
Python pyecharts绘制条形图详解
Python OpenCV超详细讲解读取图像视频和网络摄像头
You might like
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
php实现分页显示
2015/11/03 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
accesskey 提交
2006/06/26 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
项目合作计划书
2014/01/09 职场文书
党员创先争优承诺书
2014/03/26 职场文书
指导教师评语
2014/04/26 职场文书
民事诉讼代理授权委托书范本
2014/10/08 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
Python 键盘事件详解
2021/11/11 Python
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers