因为免费的考研资料里面有好多水印,但是别的免费去水印的软件处理水印的效果不好,处理完不是高糊就是去不干净。。。为了更好的学习,我选择自己搞一个去水印的代码。
思路就是:
(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)
这代码去除效果还行,就是暂时不能去除黑色水印,还有就是如果一次性资料太多,会炸内存。。。我需求不大,所以还能接受,如果后面资料特多的话,我估计会再优化吧。