本文分享一个快速去除PDF水印的小程序,亲测有效。
写一点关于使用的说明:
程序最后的“if __name__ == '__main__‘: ”部分,这里边有两个自定义函数,分别是pdf_image和combine_imgs_pdf,下面作出解释说明:
①第一个函数是用来提取原PDF中的每一页,并且去除对应的水印,然后输出到指定路径。第一个函数需要传入五个参数,分别是原PDF的绝对路径、提取的图片想要输出的绝对路径、横轴像素点、纵轴像素点、旋转。
横纵轴像素点一般选相同即可,想要更加高清可设置更大的数字(但是运行时间也会随之边长),一般选取3和3即可,清晰度完全足够。旋转选择0(提取出来的图片不旋转)。
②第二个函数是把第一个函数已经提取出来的图片(已经去除水印并且高清提取)重新合成一个PDF,并且输出到一个新的路径(此处依然需要填写绝对路径)
需要注意的点是:
①路径分隔符在程序中不能写“\",而是需要写"\\",因为\会被程序判断为转义字符
②pdf_image函数的第二个参数,也就是图中的Picture_File,该绝对路径的末尾需要多加“\\”,例如"D:\\123\\"。
下面附上完整代码:
# -*- 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))