栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

利用Python的PIL、PyMuPDF库为图片和PDF文件去水印

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用Python的PIL、PyMuPDF库为图片和PDF文件去水印

目标:净化电子书水印,供notability使用。 

库安装

pillow库:基于PIL,支持python3

官方文档:Pillow (PIL Fork) 9.2.0.dev0 documentation

pip install pillow

PyMuPDF:MuPDF的Python接口形式

官方文档:PyMuPDF Documentation — PyMuPDF 1.19.6 documentation

安装文件:PyMuPDF · PyPI

实际安装时,利用conda无对应库,利用pip会出现“Microsoft Visual C++ 14.0 or greater is required”的问题,参考下面文章:

利用pip安装PyMuPDF库时出现“Microsoft Visual C++ 14.0 or greater is required”问题的解决办法https://blog.csdn.net/u014363023/article/details/124761649

安装模块
from itertools import product
from PIL import Image
import os
import fitz
为图片去水印
def remove_for_img():
    img = Image.open('原图.png')

    # 增大分辨率
    width, height = img.size
    width *= 10
    height *= 10
    high_img = img.resize((width, height), Image.ANTIALIAS)

    # product(A,B):返回A和B中的元素组成的笛卡尔积的元组作为像素点
    # PIL-getpixel((a,b)):获取图像中某点的像素的RGB值(RED,GREEN,BLUE)
    # PIL-putpixel((4,4),(255,0,0)):写某个像素位置的值
    for pos in product(range(width), range(height)):
        if sum(high_img.getpixel(pos)[:3]) > 600:
            high_img.putpixel(pos, (255, 255, 255))
    high_img.save('去水印.png')

计算机中用 RGB (RED,GREEN,BLUE)代表红绿蓝,(255, 255, 255) 表示白色,(0, 0, 0) 表示黑色,目标就是将水印的颜色变成白色(255, 255, 255)。

600是经验值,也可以用相应工具获取水印RGB值;但过低容易导致文字轮廓虚化,根据实际情况调整。

为pdf去水印,并重新连接

过程:将pdf转为图片处理并保存,再依次转为pdf连接生成最终文件。

def remove_for_pdf():
    page_num = 1
    pdf_file = '原图.pdf'
    pdf = fitz.open(pdf_file)  # 打开原pdf
    total_pdfs = fitz.open()  # 创建新pdf
    for page in pdf:
        # 缩放倍数越大越耗时
        zoom_x = 4.0  # 水平缩放
        zomm_y = 4.0  # 垂直缩放
        mat = fitz.Matrix(zoom_x, zomm_y)  # 每个维度应用对应缩放因子-分辨率提高
        pixmap = page.get_pixmap(matrix=mat)
        # 生成PNG图像(通过参数matrix实现结果矩阵的缩放)
        # pixmap = page.get_pixmap()
        for pos in product(range(pixmap.width), range(pixmap.height)):
            rgb = pixmap.pixel(pos[0], pos[1])
            if(sum(rgb) >= 600):
                pixmap.set_pixel(pos[0], pos[1], (255, 255, 255))
        pixmap.pil_save(f"{page_num}.png")

        pixmapconvert = fitz.open(f"{page_num}.png")
        pdfbytes = pixmapconvert.convert_to_pdf()
        # open(type, buffer) - type: extension, buffer: bytes object.
        imgpdf = fitz.open("pdf", pdfbytes)
        total_pdfs.insert_pdf(imgpdf)

        print(f"第{page_num}页水印去除完成")
        page_num = page_num + 1
    total_pdfs.save('removed_pdf.pdf')
    total_pdfs.close()
效果 
原图
去水印​​​​

参考:超简单!为图片和 PDF 上去掉水印_Python 技术的博客-CSDN博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886614.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号