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 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
详解Python Socket网络编程
Jan 05 Python
Python及PyCharm下载与安装教程
Nov 18 Python
Pandas 合并多个Dataframe(merge,concat)的方法
Jun 08 Python
Python使用googletrans报错的解决方法
Sep 25 Python
python 将大文件切分为多个小文件的实例
Jan 14 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
python根据文本生成词云图代码实例
Nov 15 Python
Python生成器实现简单"生产者消费者"模型代码实例
Mar 27 Python
一些关于python 装饰器的个人理解
Aug 31 Python
Python实现位图分割的效果
Nov 20 Python
Python实现文字pdf转换图片pdf效果
Apr 03 #Python
python 实现图片特效处理
教你使用Python获取QQ音乐某个歌手的歌单
Python os和os.path模块详情
如何通过一篇文章了解Python中的生成器
Python pyecharts绘制条形图详解
Python OpenCV超详细讲解读取图像视频和网络摄像头
You might like
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
csdn 博客的css样式 v3
2009/02/24 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
详解js闭包
2014/09/02 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
非常漂亮的相册集 使用jquery制作相册集
2016/04/28 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
jQuery AJAX应用实例总结
2020/05/19 jQuery
Vue 监听元素前后变化值实例
2020/07/29 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
python 测试实现方法
2008/12/24 Python
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
python fabric实现远程部署
2017/01/05 Python
Python中property属性实例解析
2018/02/10 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
办公室班子四风问题对照检查材料
2014/10/04 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
一篇文章学会Vue中间件管道
2021/06/20 Vue.js
python之django路由和视图案例教程
2021/07/26 Python