python-特殊pdf的去水印操作

  • 为什么做出这个?
  • 原理
  • 特色
  • 成果
    • 安装依赖
    • 代码
  • 想法
  • 参考文献

为什么做出这个?

  • 就是有时候从网上下载的资料中的pdf有水印,看着不舒服。
  • 比如说我从网上下载的试卷,然后去打印店打印,打印之后水印看着很不舒服,而去水印wps要会员,而我是一个程序员,为什么不做一个呢,何乐而不为。
  • 虽然最后是做出来的,但是还是有限制

原理

  • 把pdf转化为图片,然后将图片去水印
  • 图片去水印,是又条件限制的,必须水印的颜色和pdf中文字的颜色的rgb相差很大,然后把水印的颜色改变成背景颜色。

特色

  • 网上很多和我类似的原理去水印,但是都是先pdf转化为图片存起来,然后图片去水印之后,然后把图片拼接成pdf。
  • 而我就不需要中间步骤,我是直接输入pdf文件,输出pdf文件

成果

安装依赖

  • Image
pip install pillow
  • fitz
pip install PyMuPDF

代码

  • 程序处理pdf需要的时间比较久(因为处理的是像素点),可以先用页数少的pdf进行测试之后再去页数比较多的pdf。
from PIL import Image
import os
import io
import fitz
import timedef single_pdf_clearwater(pdf_path: str):pdf = fitz.open(pdf_path)   # 打开pdf目录pdf_img = fitz.open()       # 打开空文件,用来存图片pdffor page_inf in pdf:definition = 3    # 清晰度,感觉输出的pdf不够清晰,可以调大,调大,文件大小也会变大matrix = fitz.Matrix(definition, definition)img = page_inf.get_pixmap(matrix=matrix).tobytes()img = Image.open(io.BytesIO(img))width, height = img.sizefor i in range(width):for j in range(height):if sum(img.getpixel((i, j))) > 600: # 这里的600你需要根据自己的水印的颜色进行更改。img.putpixel((i, j), (255, 255, 255))img = img.tobytes()  # = img = np.asarray(img);img = bytearray(img)img = fitz.Pixmap(fitz.csRGB, width, height, img)img = img.tobytes()img = fitz.open("png", img)pdf_bytes = img.convert_to_pdf()pdf_img.insert_pdf(fitz.open("pdf", pdf_bytes))if not os.path.exists("output"):os.makedirs("output")  # 处理好的pdf存入了output目录下pdf_img.save("output/去水印pdf_" + os.path.basename(pdf_path))def group_pdf_clearwater(path_array: list[str]):print("************去水印时间比较久***********")for pdf_path in path_array:print(pdf_path, "去水印中...")single_pdf_clearwater(pdf_path)print("完成")def folder_pdf_files(folder: str) -> list[str]:  # 一个文件夹里面有多少pdf文件file_list = []for a, b, c in os.walk(folder):for filename in c:if filename[-3:].lower() == 'pdf':file_path = os.path.join(a, filename)file_list.append(file_path)print(folder, ": 有", len(file_list), "个pdf文件")return file_listif __name__ == '__main__':time_start = time.time()path_list = folder_pdf_files("pdf的目录")group_pdf_clearwater(path_list)time_end = time.time()print("程序运行时间:", round(time_end - time_start, 2), "秒")

想法