python为图片和PDF去水印详解

作者:Python 时间:2023-06-28 14:09:43 

网上下载的 pdf 学习资料有一些会带有水印,非常影响阅读。比如下面的图片就是在 pdf 文件上截取出来的。

python为图片和PDF去水印详解

安装模块

PIL:Python Imaging Library 是 python 上非常强大的图像处理标准库,但是只能支持 python 2.7,于是就有志愿者在 PIL 的基础上创建了支持 python 3的 pillow,并加入了一些新的特性。

pip install pillow

pymupdf 可以用 python 访问扩展名为*.pdf、.xps、.oxps、.epub、.cbz或*.fb2的文件。还支持了许多流行的图像格式,包括多页TIFF图像。

pip install PyMuPDF

导入需要用到的模块

from PIL import Image
from itertools import product
import fitz
import os

获取图片的 RGB

pdf 去水印的原理和图片去水印的原理差不多,小编先从去除上面那张图片的水印开始。

学过计算机的小伙伴们都知道 ,计算机中用 RGB 代表红绿蓝,用 (255, 0, 0) 表示红色,(0, 255, 0) 表示绿色,(0, 0, 255) 表示蓝色,(255, 255, 255) 表示白色,(0, 0, 0) 表示黑色,去水印的原理就是将水印的颜色变成白色(255, 255, 255)。

首先获取图片宽和高,用 itertools 模块获取宽和高的笛卡尔积作为像素点。每个像素点的颜色都由 前三位的 RGB 和 第四位的 Alpha 通道构成。Alpha 通道不需要,只要 RGB 数据。

def remove_img():
   image_file = input("请输入图片地址:")

img = Image.open(image_file)
   width, height = img.size

for pos in product(range(width), range(height)):
       rgb = img.getpixel(pos)[:3]
       print(rgb)

图片去水印

用微信截图的方式查看水印像素点的 RGB。

python为图片和PDF去水印详解

可以看到水印的 RGB 是 (210, 210, 210),这里用 RGB 的和超过 620 就判定是水印点,此时将像素颜色替换为白色。最后保存图片。

rgb = img.getpixel(pos)[:3]
if(sum(rgb) >= 620):
   img.putpixel(pos, (255, 255, 255))

img.save('d:/qsy.png')

示例结果:

python为图片和PDF去水印详解

PDF 去水印

PDF 去水印的原理和图片去水印的原理大致相同,用 PyMuPDF 打开 pdf 文件后,将 pdf 的每一页都转换为图片 pixmap,pixmap 有它自己的 RGB,只需要将 pdf 水印中的 RGB 改为(255, 255, 255) 最后保存为图片。

def remove_pdf():
   page_num = 0
   pdf_file = input("请输入 pdf 地址:")
   pdf = fitz.open(pdf_file);
   for page in pdf:
       pixmap = page.get_pixmap()
       for pos in product(range(pixmap.width), range(pixmap.height)):
           rgb = pixmap.pixel(pos[0], pos[1])
           if(sum(rgb) >= 620):
               pixmap.set_pixel(pos[0], pos[1], (255, 255, 255))
       pixmap.pil_save(f"d:/pdf_images/{page_num}.png")
       print(f"第{page_num}水印去除完成")
       page_num = page_num + 1

示例结果:

python为图片和PDF去水印详解

图片转为 pdf

图片转 pdf 需要注意的是图片的排序,数字文件名必须先转换为 int 类型后排序。用 PyMuPDF 模块打开图片后将图片用 convertToPDF() 函数转成单页的 pdf。插入到新的 pdf 文件中。

def pic2pdf():
   pic_dir = input("请输入图片文件夹路径:")

pdf = fitz.open()
   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)  
       pdfbytes = imgdoc.convertToPDF()  
       imgpdf = fitz.open("pdf", pdfbytes)
       pdf.insertPDF(imgpdf)      
   pdf.save("d:/demo.pdf")        
   pdf.close()

来源:https://blog.csdn.net/weixin_48923393/article/details/122532092

标签:python,图片,PDF,水印
0
投稿

猜你喜欢

  • python 将对象设置为可迭代的两种实现方法

    2023-08-24 18:01:39
  • python中@property和property函数常见使用方法示例

    2021-11-13 03:32:20
  • 原生JS封装Ajax插件(同域、jsonp跨域)

    2024-04-17 09:45:19
  • 解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题

    2024-04-27 16:17:33
  • mysql data文件夹位置查找

    2024-01-15 08:20:38
  • python中的路径拼接问题

    2021-02-06 11:28:56
  • python中pandas.DataFrame对行与列求和及添加新行与列示例

    2023-03-16 22:44:01
  • 分发服务器 系统抛出18483错误,未能连接服务器,因为'distributor_admin'未定义远程登陆

    2024-01-24 00:39:48
  • Java访问数据库实例详解

    2024-01-23 00:12:20
  • Python简繁体转换的简单实现步骤

    2023-10-03 05:02:20
  • Python 模块EasyGui详细介绍

    2022-04-27 22:55:39
  • Python 格式化输出字符串的方法(输出字符串+数字的几种方法)

    2021-05-03 21:25:00
  • 如何检测Oracle的ODBC是否连接成功?

    2009-11-24 20:31:00
  • Django打印出在数据库中执行的语句问题

    2024-01-21 04:26:41
  • Vue实现登录以及登出详解

    2023-07-02 16:59:51
  • asp下为什么韩文字后面显示分号?

    2011-03-10 11:07:00
  • python爬虫框架Scrapy基本应用学习教程

    2021-04-05 13:09:44
  • PyQT5速成教程之Qt Designer介绍与入门

    2023-05-18 22:23:36
  • python引用DLL文件的方法

    2021-01-17 03:35:19
  • javascript中mouseenter与mouseover的异同

    2024-05-02 16:11:54
  • asp之家 网络编程 m.aspxhome.com