Python PyMupdf 去除PDF文档中Watermark标识水印

server/2024/12/27 2:40:17/

通过PDF阅读或编辑工具,可在PDF中加入Watermark标识的PDF水印,如下图:
PDF水印

该类水印特点

这类型的水印,会在文件的字节流中出现/WatermarkEMC等标识,那么,我们可以通过改变文件字节内容,清理掉这些水印。

水印去除

安装pymupdf

pip install --upgrade pymupdf

清理水印代码如下:

python">"""
移除PDF文件中的水印参数:input_pdf_path (str): 输入PDF文件的路径output_pdf_path (str): 输出PDF文件的路径
"""
def remove_pdf_watermark(input_pdf_path, output_pdf_path):# 打开PDF文件doc = fitz.open(input_pdf_path)for page in doc:page.clean_contents()  # 清理页面绘图命令xref = page.get_contents()[0]   # 获取页面字节流,以xref的形式返回        cont0 = doc.xref_stream(xref).decode()  # 将流解码为字符串if '/Watermark' in cont0:   # 找到水印标识start = cont0.index("/Artifact")    # 获取水印起始位置end = cont0.index("EMC", start) # 获取水印结束位置cont = cont0[:start] + cont0[end:]  # 替换掉水印doc.update_stream(xref, cont.encode())  # 更新流doc.save(output_pdf_path, garbage=4)    # 保存修改后的PDF文件        doc.close()

代码功能解析

这段代码的功能是移除PDF文件中的水印。具体步骤如下:

  • 打开输入的PDF文件。
  • 遍历每一页,清理页面绘图命令。
  • 获取页面字节流并解码为字符串。
  • 检查是否包含水印标识 /Watermark。
  • 如果找到水印,定位其起始和结束位置,并替换掉水印内容。
  • 更新页面字节流。
  • 保存修改后的PDF文件。

控制流图(CFG)

控制流图

代码原理

  • 开始:程序开始执行。
  • 打开PDF文件:使用 fitz.open 方法打开输入的PDF文件。
  • 遍历每一页:检查是否还有未处理的页面。
  • 清理页面绘图命令:调用 page.clean_contents 方法清理页面绘图命令。
  • 获取页面字节流并解码:获取页面字节流并将其解码为字符串。
  • 是否包含水印标识:检查解码后的字符串中是否包含水印标识 /Watermark
  • 定位水印起始和结束位置:如果找到水印标识,定位其起始和结束位置。
  • 替换掉水印内容:将水印部分从字符串中移除。
  • 更新页面字节流:将修改后的内容重新编码并更新页面字节流。
  • 保存修改后的PDF文件:保存修改后的PDF文件到指定路径。
  • 关闭PDF文件:关闭PDF文件。
  • 结束:程序结束执行。

程序运行效果

水印去除


http://www.ppmy.cn/server/153494.html

相关文章

设计模式の享元模板代理模式

文章目录 前言一、享元模式二、模板方法模式三、代理模式3.1、静态代理3.2、JDK动态代理3.3、Cglib动态代理3.4、小结 前言 本篇是关于设计模式中享元模式、模板模式、以及代理模式的学习笔记。 一、享元模式 享元模式是一种结构型设计模式,目的是为了相似对象的复用…

代码加入SFTP JAVA ---(小白篇3)

在 Java 中,您可以使用 JSch(Java Secure Channel)库 来连接和操作 SFTP 服务器。以下是一个完整的示例代码,展示如何使用 Java 接入 SFTP 服务器并上传文件。 1.服务器上加入SFTP------(小白篇 1) 2.加入SFTP 用户------(小白篇…

mysql,数据库数据备份

mysql 一.数据库备份概念1.备份分类2.备份策略3.备份三要素二.完全备份操作1.物理备份(还原),冷备份2.逻辑备份,温备份三.percona软件的xtrabackup工具备份(2备份,3还原),增量,差异1.percona软件安装2.增量备份(还原)3.差异备份四.binlog日志1.binlog日志概念2.查看binlog日志信…

【express-generator】02-路由基本使用+api工具测试路由

上篇回顾 上一篇,我们介绍了安装创建和初始化一个express-generator应用程序,并且给了一些注意点,相信跟着步骤,你也可以做到文章里呈现的效果。 这一篇,我们有两大主题:路由的基本使用、api工具测试路由。…

【Spark】架构与核心组件:大数据时代的必备技能(下)

🐇明明跟你说过:个人主页 🏅个人专栏:《大数据前沿:技术与应用并进》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Apache Spark 2、Spark 的应用场景&…

MySQL 查询优化案例分享

在日常开发中,SQL 查询性能直接影响到系统的响应速度和用户体验。随着数据量的增长,慢查询可能成为系统的瓶颈。本文将通过实际案例,分享几种常见的 MySQL 查询优化方法,帮助开发者快速定位和优化慢查询,提升数据库性能…

细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV

目录 一、工程配置 1、时钟、DEBUG 2、GPIO 3、SPI2 4、USART6 5、NVIC 二、软件设计 1、FALSH (1)w25flash.h (2) w25flash.c 1)W25Q16基本操作指令 2)计算地址的辅助功能函数 3)器…

Berlandesk 注册系统算法实现与解析

一、引言 在不久的将来,一款名为 “Berlandesk” 的电子邮件服务将在 Berland 地区开放,站点管理员希望尽快启动项目,其中很关键的一部分就是实现站点注册系统的原型。本文将详细介绍这个注册系统的功能要求以及使用 Python 语言实现的具体代…