python去水印代码

因为免费的考研资料里面有好多水印,但是别的免费去水印的软件处理水印的效果不好,处理完不是高糊就是去不干净。。。为了更好的学习,我选择自己搞一个去水印的代码。

思路就是:

(1)pdf 转 img

(2)使用pixmap把超出规定 像素和 的点置白

(3)img转pdf

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

def remove_pdf(filePath):
    page_num = 0
    pdf = fitz.open(filePath)
    for page in pdf:
        rotate = int(0)
        # 每个尺寸的缩放系数为7,这将为我们生成分辨率提高49倍的图像。
        zoom_x, zoom_y = 7, 7
        trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
        pixmap = page.get_pixmap(matrix=trans, alpha=False)
        # 去水印
        print(f"第{page_num}水印正在去除。。。。")
        # 水印位置固定,缩短检索区域,加快处理时间。【可以自己调试】 我的文件里面有两块水印,所以我单纯的分割了 450是RGB像素值的和,你们根据水印情况自行修改
        for pos in product(range(pixmap.width), range(1000, pixmap.height-2800)):
            rgb = pixmap.pixel(pos[0], pos[1])
            if sum(rgb) >= 450:
                pixmap.set_pixel(pos[0], pos[1], (255, 255, 255))
        for pos in product(range(1500, pixmap.width-1300), range(3500, pixmap.height-1800)):
            rgb = pixmap.pixel(pos[0], pos[1])
            if sum(rgb) >= 450:
                pixmap.set_pixel(pos[0], pos[1], (255, 255, 255))
        pixmap.pil_save(f"out1/{page_num}.png")
        print(f"第{page_num}水印去除完成")
        page_num = page_num + 1
# 去水印图片组转为pdf
def combine2Pdf(folderPath, pdfFilePath):
        files = os.listdir(folderPath)
        pngFiles = []
        sources = []
        for file in files:
            if 'png' in file:
                pngFiles.append(folderPath + file)
        output = Image.open(pngFiles[0])
        output = output.convert("RGB")
        pngFiles.pop(0)
        index = 0
        for file in pngFiles:
            # if index < 150: 容易炸内存!!!!
            pngFile = Image.open(file)
            if pngFile.mode == "RGB":
                pngFile = pngFile.convert("RGB")
            sources.append(pngFile)
            index = index + 1
            print(f"第{index}张图片正在合成。。。")
        output.save(pdfFilePath, "pdf", save_all=True, append_images=sources)
# 清除文件
def RemoveDir(filepath):
    # 如果文件夹不存在就创建,如果文件存在就清空!
    if not os.path.exists(filepath):
        os.mkdir(filepath)
    else:
        shutil.rmtree(filepath)
        os.mkdir(filepath)

if __name__ == '__main__':
    for i in range(2, 21):
        print(f"第{i}份pdf正在去水印")
        # 这个是需要去除水印的文件路径 我这边是批量处理 具体情况具体分析,根据自己的路径进行修改即可
        filepa = "E:/24考研/高数/讲义/考点"+str(i)+".pdf"
        remove_pdf(filepa)
        # 这个是去除完水印的img所在路径
        folder = "E:/开发工具/pycharm/pythonProject/out1/"
        # 这个是输出pdf文件的路径 
        pdfFile = "E:/24考研/高数/考点"+str(i)+".pdf"
        combine2Pdf(folder, pdfFile)
        print('over !')
        # 清除文件里面的图片
        RemoveDir(folder)

这代码去除效果还行,就是暂时不能去除黑色水印,还有就是如果一次性资料太多,会炸内存。。。我需求不大,所以还能接受,如果后面资料特多的话,我估计会再优化吧。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值