Python3,10行代码,给pdf文件去水印,再也不用花费冤枉钱了。

简介: Python3,10行代码,给pdf文件去水印,再也不用花费冤枉钱了。

1、引言


小屌丝:鱼哥,最近有点不像话了。

小鱼:嗯?? 啥个意思嘛~

小屌丝:一周了,没分享小知识了。

小鱼:就因为这个??

小屌丝:那是,我这么爱学习的人。

小鱼:怕是你有什么事情解决不了,想到我了吧?

小屌丝:呵 ~ 笑话 ~ 我 能有…什…么…事情…

小鱼:说吧,

小屌丝:这可是你让我说的,我可没主动要问的!

小鱼:说吧,咋还磨磨唧唧了呢

小屌丝:我在某站下载的pfd文档,有水印,如何去掉啊?

小鱼:我突然想起来,PPT还没写完。

小屌丝:我家楼下刚开一个烧烤店,据说还不错!

小鱼:PPT写不完,可以晚上写,助人为乐让我更快乐。


2、代码实战


在上一篇博文,我们知道了如何给pdf文档添加水印,

而本篇,我们就给pdf去水印


如果不知道如何添加水印,就看这篇:《Python3,2段代码,给pdf文件添加水印,原来watermark还可以这么玩。》


小屌丝:你这添加完水印,又去除水印,你这是闹哪样??

小鱼:我喜欢,我稀罕,我乐意!!


2.1 去除原理


去除方法:


1、用 PyMuPDF 打开 pdf 文件,将 pdf 的每一页都转换为图片 pixmap,

2、pixmap 有它自己的 RGB,只需要将 pdf 水印中的 RGB 改为(255, 255, 255),并保存图片

3、按照生成的图片,插入到pdf文档中

因为pfd文档无法直接去除水印,需要先将pfd文档转换成图片,在逐一对图片进行水印去除操作,最后在把图片插入到pdf文档中


2.2 代码解析


1、先查看PDF文档中的水印rgb值是多少

image.png

可以看到,RGB(179,179,179),因为这里要的是RGB色值总和,所以我们就认为,超过510,就认为是水印。


敲黑板


光学三原色是红绿蓝(RGB),也就是说它们是不可分解的三种基本颜色,其他颜色都可以通过这三种颜色混合而成,三种颜色等比例混合就是白色,没有光就是黑色。

在计算机中,可以用三个字节表示 RGB 颜色,1个字节能表示的最大数值是 255, 所以,(255, 0, 0)代表红色,(0, 255, 0)代表绿色,(0, 0, 255)代表蓝色。相应地,(255, 255, 255)代表白色,(0, 0, 0)代表黑色。从(0, 0, 0) ~ (255, 255, 255) 之间的任意组合都可以代表一个不同的颜色。

图片每个位置颜色由四元组表示,前三位分别是 RGB,第四位是 Alpha 通道

2、pdf转换成图片,并去除水印

代码示例:


# -*- coding:utf-8 -*-
# @Time   : 2022-02-23
# @Author : carl_DJ
from PIL import Image
from itertools import product
import fitz
''' 图片转为pdf'''
#图片所在的文件夹
pic_dir = 'D:\Project\watemark'
pdf = fitz.open()
#图片数字文件先转换成int类型进行排序
img_files = sorted(os.listdir(pic_dir), key=lambda x: int(str(x).split('.')[0]))
for img in img_files:
    print(img)
    imgdoc = fitz.open(pic_dir + '/' + img)
    #将打开后的图片转成单页pdf
    pdfbytes = imgdoc.convertToPDF()
    imgpdf = fitz.open("pdf", pdfbytes)
    #将单页pdf插入到新的pdf文档中
    pdf.insertPDF(imgpdf)
pdf.save("跟小鱼学习去水印_完成.pdf")
pdf.close()


执行完成,

查看生成图片:

image.png

查看图片内容:

image.png

3、图片转为pdf


代码示例:


# -*- coding:utf-8 -*-
# @Time   : 2022-02-23
# @Author : carl_DJ
from PIL import Image
from itertools import product
import fitz
''' 图片转为pdf'''
#图片所在的文件夹
pic_dir = 'D:\Project\watemark'
pdf = fitz.open()
#图片数字文件先转换成int类型进行排序
img_files = sorted(os.listdir(pic_dir), key=lambda x: int(str(x).split('.')[0]))
for img in img_files:
    print(img)
    imgdoc = fitz.open(pic_dir + '/' + img)
    #将打开后的图片转成单页pdf
    pdfbytes = imgdoc.convertToPDF()
    imgpdf = fitz.open("pdf", pdfbytes)
    #将单页pdf插入到新的pdf文档中
    pdf.insertPDF(imgpdf)
pdf.save("跟小鱼学习去水印_完成.pdf")
pdf.close()


执行代码,

查看生成的pdf文档

image.png


2.3 代码整合


上面的内容都了解以后,我们就整合代码,直接运行就可以了。


# -*- coding:utf-8 -*-
# @Time   : 2022-02-23
# @Author : carl_DJ
from PIL import Image
from itertools import product
import fitz
# 去除pdf的水印
def remove_pdfwatermark():
    #打开源pfd文件
    pdf_file = fitz.open("跟小鱼学习去水印.pdf")
    #page_no 设置为0
    page_no = 0
    #page在pdf文件中遍历
    for page in pdf_file:
        #获取每一页对应的图片pix (pix对象类似于我们上面看到的img对象,可以读取、修改它的 RGB)
        #page.get_pixmap() 这个操作是不可逆的,即能够实现从 PDF 到图片的转换,但修改图片 RGB 后无法应用到 PDF 上,只能输出为图片
        pix = page.get_pixmap()
        #遍历图片中的宽和高,如果像素的rgb值总和大于510,就认为是水印,转换成255,255,255-->即白色
        for pos in product(range(pix.width), range(pix.height)):
            if sum(pix.pixel(pos[0], pos[1])) >= 510:
                pix.set_pixel(pos[0], pos[1], (255, 255, 255))
        #保存去掉水印的截图
        pix.pil_save(f"./{page_no}.png", dpi=(30000, 30000))
        #打印结果
        print(f'第 {page_no} 页去除完成')
        page_no += 1
#去除的pdf水印添加到pdf文件中
def pictopdf():
  #水印截图所在的文件夹
    # pic_dir = input("请输入图片文件夹路径:")
  pic_dir = 'D:\Project\watemark'
  pdf = fitz.open()
  #图片数字文件先转换成int类型进行排序
  img_files = sorted(os.listdir(pic_dir), key=lambda x: int(str(x).split('.')[0]))
  for img in img_files:
     print(img)
     imgdoc = fitz.open(pic_dir + '/' + img)
     #将打开后的图片转成单页pdf
     pdfbytes = imgdoc.convertToPDF()
     imgpdf = fitz.open("pdf", pdfbytes)
     #将单页pdf插入到新的pdf文档中
     pdf.insertPDF(imgpdf)
  pdf.save("跟小鱼学习去水印_完成.pdf")
  pdf.close()
if __name__ == '__main__':
    remove_pdfwatermark()
    pictopdf()


3、总结


写到这里,今天的分享就差不多快结束了。

需要理解的流程是,


pdf文档需要先转换成图片,进行水印去除,

再转换成pdf

最后插入到新的pdf文档中。

关于图片及pdf如何添加水印,可以参照小鱼的这两篇博文:


《Python3,2行代码添加水印》

《Python3,2段代码,给pdf文件添加水印》


目录
相关文章
|
5天前
|
并行计算 C语言 开发者
优化Python代码的五大技巧
Python作为一种流行的编程语言,在各种应用场景中广泛使用。然而,随着项目规模的增长和需求的变化,Python代码的性能和可维护性也成为了关键问题。本文将介绍优化Python代码的五大技巧,帮助开发者提升代码效率和质量。
|
2天前
|
人工智能 Python
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
20 0
|
2天前
|
人工智能 Python
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
6 0
|
2天前
|
Linux 网络安全 开发工具
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
10 0
|
2天前
|
数据安全/隐私保护 Python
Python中的装饰器:提升代码可读性和灵活性
Python中的装饰器是一种强大的编程工具,能够提升代码的可读性和灵活性。本文将深入探讨装饰器的原理和用法,以及如何利用装饰器来简化代码、实现日志记录、权限控制等功能,从而让你的Python代码更加优雅和高效。
|
7天前
|
存储 Python
用Python实现批量下载文件——代理ip排除万难
用Python实现批量下载文件——代理ip排除万难
|
7天前
|
JSON 关系型数据库 数据库
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
33 0
|
7天前
|
数据挖掘 索引 Python
Python 读写 Excel 文件
Python 读写 Excel 文件
12 0
|
7天前
|
数据安全/隐私保护 Python
Python文件与目录操作:面试中的高频考点
【4月更文挑战第15天】本文介绍了Python文件和目录操作的面试重点,包括文件的读写、目录遍历及权限管理。强调了文件关闭、异常处理、特殊文件判断以及权限位和权限字符串的理解。提供了代码示例,如读写文件、遍历目录和更改文件权限,帮助读者在面试中表现出色。掌握这些技能将对编程求职之路大有裨益。
17 0
|
8天前
|
数据安全/隐私保护 Python
Python中的装饰器:提升代码可读性与灵活性
Python中的装饰器是一种强大的工具,可以在不改变函数原有逻辑的情况下,为函数添加额外的功能。本文将介绍装饰器的基本概念和用法,并通过实例演示如何利用装饰器提升代码的可读性和灵活性,使代码更加简洁、易于维护。

热门文章

最新文章