Python去除pdf中水印

399 阅读2分钟
目前看到有很多同学问:python怎么去除pdf中的水印?
那么今天就介绍下怎么去除水印,本博客有参考其他博主思路加以整理!

6666.jpeg

一、运行结果

image.png

二、思路呈现

主要是将pdf分割成n个图片,然后去除水印,再次合成pdf。

三、代码实现

import fitz
from itertools import product
import os
from functools import cmp_to_key
from tqdm import trange
 
# 打开pdf文件
pdf = fitz.open('../带水印的pdf文件.pdf')
page = pdf.new_page()  # 添加一个新的页面
def check_rgb(rgb):
    # 判断水印蓝色部分
    if rgb[2] >= 230:
        return True
    # 判断水印灰色部分
    elif sum(rgb) >= 560:
        return True
    return False
 
# 提高清晰度
rotate = int(0)
zoom_x = 2
zoom_y = 2
mat = fitz.Matrix(zoom_x, zoom_y)
# pixmap = pdf[page_num].get_pixmap(matrix=mat, alpha=False)
 
for page_num in trange(pdf.page_count):
    # 将每一页转换为图片pixmap
    pixmap = pdf[page_num].get_pixmap(matrix=mat, alpha=False)
    for pos in product(range(pixmap.width), range(pixmap.height)):
        # 删除指定高度以上的内容
        if pos[1] <= 75:
            pixmap.set_pixel(pos[0],pos[1],(255,255,255))
            continue
        # 删除指定左下角的内容
        elif pos[0] <= 600 and pos[1] >= 1615:
            pixmap.set_pixel(pos[0],pos[1],(255,255,255))
            continue
        rgb = pixmap.pixel(pos[0],pos[1])
        # 判断该像素点是否置为白色
        if check_rgb(rgb) == True:
            pixmap.set_pixel(pos[0],pos[1],(255,255,255))
    pixmap.pil_save(f'../pic/{page_num}.png')
# 过滤掉当前目录除jpg以外的文件
def file_filter(tmp):
    if tmp[-4:] in [".png"]:
        return True
    return False
jpg_names = list(filter(file_filter, os.listdir("./")))
 
# 按照数字大小排序,避免顺序错误
def cmp(x, y):
    return int(x[0:-4]) - int(y[0:-4])
jpg_names = sorted(jpg_names, key=cmp_to_key(cmp))
 
# 将jpg转成pdf后合并
pdf = fitz.open()
for i in range(len(jpg_names)):
    pdfbytes = fitz.open(jpg_names[i]).convert_to_pdf()
    imgpdf = fitz.open(f"{jpg_names[i][0:-4]}.pdf", pdfbytes)
    pdf.insert_pdf(imgpdf)
pdf.save("../combined.pdf")
pdf.close()

四、注意导包

1、可以看到代码中用了 import fitz

如果你在安装包的时候发生报错,那么请安装以下包。 pip install PyMuPDF

因为fitz库是PyMuPDF的一部分,所以你需要安装PyMuPDF。

最后祝大家成功!