大家好,我是蔡哥。
有些网上下载的pdf学习资料会有水印image是什么文件夹可以删除吗,会很影响阅读。 例如下图就是从pdf文件中截取的。
所以今天分享一篇文章,就是用Python去除这些水印! !
安装模块
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模块获取宽高的笛卡尔积image是什么文件夹可以删除吗,以像素为单位。 每个像素的颜色由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。
可以看出水印的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')
示例结果:
从 PDF 中去除水印
PDF去水印的原理和图片去水印大致相同。 用PyMuPDF打开pdf文件后,将pdf的每一页转换成图片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
示例结果:
图片转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()
总结
pdf和图片上烦人的水印终于可以在强大的python面前消失了。 大家学会了吗?