本文分享一个快速去除PDF水印的小程序,亲测有效。
写一点关于使用的说明:
程序最后的“if __name__ == '__main__‘: ”部分,这里边有两个自定义函数,分别是pdf_image和combine_imgs_pdf,下面作出解释说明:
①第一个函数是用来提取原PDF中的每一页,并且去除对应的水印,然后输出到指定路径。第一个函数需要传入五个参数,分别是原PDF的绝对路径、提取的图片想要输出的绝对路径、横轴像素点、纵轴像素点、旋转。
横纵轴像素点一般选相同即可,想要更加高清可设置更大的数字(但是运行时间也会随之边长),一般选取3和3即可,清晰度完全足够。旋转选择0(提取出来的图片不旋转)。
②第二个函数是把第一个函数已经提取出来的图片(已经去除水印并且高清提取)重新合成一个PDF,并且输出到一个新的路径(此处依然需要填写绝对路径)
需要注意的点是:
①路径分隔符在程序中不能写“\",而是需要写"\\",因为\会被程序判断为转义字符
②pdf_image函数的第二个参数,也就是图中的Picture_File,该绝对路径的末尾需要多加“\\”,例如"D:\\123\\"。
下面附上完整代码:
1. # -*- coding: utf-8 -*- 2. # @Author:︶ㄣ释然 3. # @Time: 2022/11/19 0:40 4. from itertools import product 5. from PIL import Image 6. import os 7. import time 8. import fitz 9. 10. 11. def pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle): 12. pdf = fitz.open(pdfPath) 13. for pg in range(0, pdf.pageCount): 14. page = pdf[pg] 15. trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle) 16. pm = page.getPixmap(matrix=trans, alpha=False) 17. for pos in product(range(pm.width), range(pm.height)): 18. rgb = pm.pixel(pos[0], pos[1]) 19. if (sum(rgb) >= 620): 20. pm.set_pixel(pos[0], pos[1], (255, 255, 255)) 21. print(f"第{pg}页水印去除完成") 22. pm.writePNG(imgPath + str(pg) + ".png") 23. pdf.close() 24. 25. 26. def combine_imgs_pdf(folder_path, pdf_file_path): 27. files = os.listdir(folder_path) 28. png_files = [] 29. sources = [] 30. for file in files: 31. if 'png' in file or 'jpg' in file: 32. png_files.append(folder_path + file) 33. png_files.sort() 34. 35. output = Image.open(png_files[0]) 36. png_files.pop(0) 37. for file in png_files: 38. png_file = Image.open(file) 39. if png_file.mode == "RGB": 40. png_file = png_file.convert("RGB") 41. sources.append(png_file) 42. output.save(pdf_file_path, "pdf", save_all=True, append_images=sources) 43. 44. 45. if __name__ == '__main__': 46. start = time.perf_counter() 47. PDF_File = r"" 48. Picture_File = r"" 49. outPut = r"" 50. pdf_image(PDF_File, Picture_File, 3, 3, 0) 51. combine_imgs_pdf(Picture_File, outPut) 52. end = time.perf_counter() 53. print("成功去除水印\n用时:%s秒" % (end - start))