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脚本实现下载合并SAE日志
Feb 10 Python
python查看zip包中文件及大小的方法
Jul 09 Python
详解Python爬虫的基本写法
Jan 08 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
Django基础之Model操作步骤(介绍)
May 27 Python
Python分割指定页数的pdf文件方法
Oct 26 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
python中嵌套函数的实操步骤
Feb 27 Python
Python:type、object、class与内置类型实例
Dec 25 Python
python 写一个性能测试工具(一)
Oct 24 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 Python
Python实现文字pdf转换图片pdf效果
Apr 03 #Python
python 实现图片特效处理
教你使用Python获取QQ音乐某个歌手的歌单
Python os和os.path模块详情
如何通过一篇文章了解Python中的生成器
Python pyecharts绘制条形图详解
Python OpenCV超详细讲解读取图像视频和网络摄像头
You might like
php程序员应具有的7种能力小结
2014/11/27 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
『jQuery』.html(),.text()和.val()的概述及使用
2013/04/22 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Python中偏函数用法示例
2018/06/07 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
Java基础知识面试要点
2016/07/29 面试题
2019年Java面试必问之经典试题
2012/09/12 面试题
旅游市场营销方案
2014/03/09 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
入党函调证明材料
2014/12/24 职场文书
统计员岗位职责
2015/02/11 职场文书
绿里奇迹观后感
2015/06/15 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript