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求crc32值的方法
Oct 05 Python
Python中join和split用法实例
Apr 14 Python
python生成器generator用法实例分析
Jun 04 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
Jul 07 Python
Python文件的读写和异常代码示例
Oct 31 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
对python生成业务报表的实例详解
Feb 03 Python
简单了解Django ContentType内置组件
Jul 23 Python
python字符串替换re.sub()方法解析
Sep 18 Python
Python中itertools的用法详解
Feb 07 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
Python实现文字pdf转换图片pdf效果
Apr 03 #Python
python 实现图片特效处理
教你使用Python获取QQ音乐某个歌手的歌单
Python os和os.path模块详情
如何通过一篇文章了解Python中的生成器
Python pyecharts绘制条形图详解
Python OpenCV超详细讲解读取图像视频和网络摄像头
You might like
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
PHP开发中常用的三个表单验证函数使用小结
2010/03/03 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
php格式化json函数示例代码
2016/05/12 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
php图片合成方法(多张图片合成一张)
2017/11/25 PHP
php生成HTML文件的类方法
2019/10/11 PHP
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
原生javascript实现图片放大镜效果
2017/01/18 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python开发常用的一些开源Package分享
2015/02/14 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Python如何调用外部系统命令
2019/08/07 Python
Windows下实现将Pascal VOC转化为TFRecords
2020/02/17 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
找到不普通的东西:Bonanza
2016/10/20 全球购物
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
诚信考试承诺书
2014/03/27 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
个人自荐书怎么写
2015/03/26 职场文书
安全生产协议书
2016/03/22 职场文书
自考生自我评价
2019/06/21 职场文书