利用Python去除PDF水印

摘要

本文介绍了如何使用 Python 中的 PyMuPDF 和 OpenCV 库来从 PDF 文件中移除水印,并将每个页面保存为图像文件的方法。我们将深入探讨代码背后的工作原理,并提供一个简单的使用示例。

导言

  • 简介:水印在许多 PDF 文件中都很常见,但有时它们可能会干扰文档的可读性或美观性。本文将介绍一种利用 Python 编程语言移除 PDF 水印的方法。
  • 目标:本文将介绍一个使用 PyMuPDF 和 OpenCV 库的 Python 脚本,该脚本可以自动化地将 PDF 文件中(原文件)水印移除,并将每个页面保存为单独的图像文件,然后合成为新的PDF。

背景知识

  • PyMuPDF:PyMuPDF 是一个 Python 绑定库,用于与 MuPDF(一款用于解析和渲染 PDF 文件的开源软件)进行交互。
  • OpenCV:OpenCV 是一个开源计算机视觉库,提供了许多用于图像处理和计算机视觉任务的功能。

技术细节

remove_watermark 函数

  • 将图像转换为 OpenCV 格式。
  • 使用颜色阈值技术寻找特定颜色范围内的水印区域。
  • 进行膨胀和侵蚀操作以改善水印去除效果。
  • 将图像转换回 PIL 格式并返回处理后的图像。

remove_pdf 函数

  • 打开 PDF 文件并设置缩放因子。
  • 遍历每一页的内容,将其转换为图像格式。
  • 对每个图像应用 remove_watermark 函数,移除水印。
  • 将处理后的图像保存到指定文件夹中。

代码示例

python 复制代码
from itertools import product
import fitz  # PyMuPDF
from PIL import Image
import numpy as np
import cv2
import os


def remove_watermark(image, lower_bound, upper_bound):
    # 转换为OpenCV格式
    open_cv_image = np.array(image)
    open_cv_image = cv2.cvtColor(open_cv_image, cv2.COLOR_RGB2BGR)

    # 寻找特定颜色范围内的区域
    mask = cv2.inRange(open_cv_image, lower_bound, upper_bound)

    # 膨胀和侵蚀操作,用于改善水印去除效果
    kernel = np.ones((3, 3), np.uint8)
    mask = cv2.dilate(mask, kernel, iterations=1)
    mask = cv2.erode(mask, kernel, iterations=1)

    open_cv_image[mask != 0] = [255, 255, 255]

    # 转换回PIL格式
    return Image.fromarray(cv2.cvtColor(open_cv_image, cv2.COLOR_BGR2RGB))


def remove_pdf(pdf_file, output_folder, dpi=1800):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    zoom = dpi / 72  # 计算缩放因子
    mat = fitz.Matrix(zoom, zoom)  # 创建缩放矩阵

    pdf = fitz.open(pdf_file)

    for page_num, page in enumerate(pdf):
        pixmap = page.get_pixmap(matrix=mat)  # 使用缩放矩阵提高DPI

        img = Image.frombytes("RGB", [pixmap.width, pixmap.height], pixmap.samples)
        # 定义水印颜色的上下界(需要根据实际情况调整)
        lower_bound = np.array([168, 168, 168])
        upper_bound = np.array([172, 172, 172])

        # 去除水印
        img = remove_watermark(img, lower_bound, upper_bound)

        img_path = os.path.join(output_folder, f"{page_num}.png")
        img.save(img_path, format="PNG")

        print(f"第{page_num}页水印去除完成")

    pdf.close()


# 使用示例

pdf_path = input("请输入 PDF 地址:")
output_path = input("请输入保存处理后的图片的文件夹地址:")
remove_pdf(pdf_path, output_path)

使用示例

  • 输入要处理的 PDF 文件路径和输出文件夹路径。
  • 脚本将自动将水印从 PDF 中移除,并将处理后的图像保存到指定文件夹中。

对比前后

去除前

去除后

结论

  • 本文介绍了一种使用 Python 编程语言移除 PDF 文件中水印的方法,通过结合 PyMuPDF 和 OpenCV 库,我们可以轻松地实现这一目标。
  • 通过调整代码中的参数,可以适应不同类型和样式的水印,从而提高水印移除的准确性和效率。

展望

  • 未来可以进一步优化代码,提高水印移除的速度和稳定性。
  • 进一步研究和探索 PDF 处理技术,拓展其在文档处理领域的应用。

参考资料

相关推荐
zh路西法36 分钟前
【模型式强化学习】(二)PETS——从概率动力学模型到模型预测控制(MPC)
pytorch·python·强化学习·pe·mpc·ces·pets
HAPPY酷2 小时前
C++ 自定义内存池优化点云处理:从裸指针到 RAII 自动回收
开发语言·c++
梦帮科技2 小时前
量子纠缠网络与量子隐形传态攻防:量子中继器信道串扰、纠缠态保真度降解与量子路由劫持
开发语言·网络·人工智能·算法·自动化·php
Python自动化直播2 小时前
智能脚本批量管理拆开看:导入、导出、重写、试听
前端·python·ai·秒播
老王IT2 小时前
C语言语法基础语法介绍
c语言·开发语言·算法
开开心心就好2 小时前
发票信息录入太麻烦?离线工具一键转表格
运维·服务器·前端·pdf·ocr·maven·intellij-idea
code2cat3 小时前
Java高级篇之JDBC:连接数据库,完成查询、更新与事务
java·开发语言·数据库
hzxxxz3 小时前
PHP引擎两个高危漏洞复盘:计数顺序与旧地址缺陷的机理与处置清单
开发语言·php
马立杰3 小时前
PHP 未授权 RCE 应急响应:CVE-2026-109618 CVE-2026-109619 排查与加固实战
android·开发语言·php