Python:快速去除PDF水印

本文分享一个快速去除PDF水印的小程序,亲测有效。

写一点关于使用的说明:

程序最后的“if __name__ == '__main__‘: ”部分,这里边有两个自定义函数,分别是pdf_image和combine_imgs_pdf,下面作出解释说明:

        ①第一个函数是用来提取原PDF中的每一页,并且去除对应的水印,然后输出到指定路径。第一个函数需要传入五个参数,分别是原PDF的绝对路径、提取的图片想要输出的绝对路径、横轴像素点、纵轴像素点、旋转。

        横纵轴像素点一般选相同即可,想要更加高清可设置更大的数字(但是运行时间也会随之边长),一般选取3和3即可,清晰度完全足够。旋转选择0(提取出来的图片不旋转)。

        ②第二个函数是把第一个函数已经提取出来的图片(已经去除水印并且高清提取)重新合成一个PDF,并且输出到一个新的路径(此处依然需要填写绝对路径)

Python:快速去除PDF水印_第1张图片

需要注意的点是:

        ①路径分隔符在程序中不能写“\",而是需要写"\\",因为\会被程序判断为转义字符

        ②pdf_image函数的第二个参数,也就是图中的Picture_File,该绝对路径的末尾需要多加“\\”,例如"D:\\123\\"。

  Python:快速去除PDF水印_第2张图片

 下面附上完整代码:

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2022/11/19 0:40
from itertools import product
from PIL import Image
import os
import time
import fitz


def pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle):
    pdf = fitz.open(pdfPath)
    for pg in range(0, pdf.pageCount):
        page = pdf[pg]
        trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
        pm = page.getPixmap(matrix=trans, alpha=False)
        for pos in product(range(pm.width), range(pm.height)):
            rgb = pm.pixel(pos[0], pos[1])
            if (sum(rgb) >= 620):
                pm.set_pixel(pos[0], pos[1], (255, 255, 255))
        print(f"第{pg}页水印去除完成")
        pm.writePNG(imgPath + str(pg) + ".png")
    pdf.close()


def combine_imgs_pdf(folder_path, pdf_file_path):
    files = os.listdir(folder_path)
    png_files = []
    sources = []
    for file in files:
        if 'png' in file or 'jpg' in file:
            png_files.append(folder_path + file)
    png_files.sort()

    output = Image.open(png_files[0])
    png_files.pop(0)
    for file in png_files:
        png_file = Image.open(file)
        if png_file.mode == "RGB":
            png_file = png_file.convert("RGB")
        sources.append(png_file)
    output.save(pdf_file_path, "pdf", save_all=True, append_images=sources)


if __name__ == '__main__':
    start = time.perf_counter()
    PDF_File = r""
    Picture_File = r""
    outPut = r""
    pdf_image(PDF_File, Picture_File, 3, 3, 0)
    combine_imgs_pdf(Picture_File, outPut)
    end = time.perf_counter()
    print("成功去除水印\n用时:%s秒" % (end - start))

 

你可能感兴趣的:(python)