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

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

库安装

pillow库:基于PIL,支持python3

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

pip install pillow

PyMuPDFMuPDFPython接口形式

官方文档: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”问题的解决办法icon-default.png?t=M4ADhttps://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博客

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春风锤呀锤

碗在这 ,光光的T.T

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值