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

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

该类水印特点

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

水印去除

安装pymupdf

pip install --upgrade pymupdf

清理水印代码如下:

"""
移除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.mzph.cn/news/890834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旧衣回收小程序开发,绿色生活,便捷回收

随着绿色生活、资源回收利用理念的影响,人们逐渐开始关注旧衣回收,选择将断舍离等闲置衣物进行回收,在资源回收的同时也能够减少资金浪费。目前,旧衣回收的方式也迎来了数字化发展,相比传统的回收方式更加便捷&#xf…

Bluetooth Spec【0】蓝牙核心架构

蓝牙核心系统由一个主机、一个主控制器和零个或多个辅助控制器组成蓝牙BR/ EDR核心系统的最小实现包括了由蓝牙规范定义的四个最低层和相关协议,以及一个公共服务层协议;服务发现协议(SDP)和总体配置文件要求在通用访问配置文件&a…

vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)

扫描出ip为192.168.121.161 访问该ip,发现只是一个静态页面什么也没有 使用dir dirsearch 御剑都只能扫描到/robots.txt /server-status 两个页面,前者提示我们什么也没有,后面两个没有权限访问 扫描端口,存在81端口 访问&#x…

Java - 日志体系_Apache Commons Logging(JCL)日志接口库

文章目录 官网1. 什么是JCL?2. JCL的主要特点3. JCL的核心组件4. JCL的实现机制5. SimpleLog 简介6. CodeExample 1 : 默认日志实现 (JCL 1.3.2版本)Example 2 : JCL (1.2版本) Log4J 【安全风险高,请勿使用】 7. 使用…

C++-----------映射

探索 C 中的映射与查找表 在 C 编程中,映射(Map)和查找表(Lookup Table)是非常重要的数据结构,它们能够高效地存储和检索数据,帮助我们解决各种实际问题。今天,我们就来深入探讨一下…

免费 IP 归属地接口

免费GEOIP,查询IP信息,支持IPV4 IPV6 ,包含国家地理位置,维度,asm,邮编 等,例如 例如查询1.1.1.1 http://geoip.91hu.top/?ip1.1.1.1 返回json 对象

Linux应用软件编程-多任务处理(进程)

多任务:让系统具备同时处理多个事件的能力。让系统具备并发性能。方法:进程和线程。这里先讲进程。 进程(process):正在执行的程序,执行过程中需要消耗内存和CPU。 进程的创建:操作系统在进程创…

认识计算机网络

单单看这一个词语,有熟悉又陌生,让我们来重新认识一下这位大角色——计算机网络。 一、是什么 以及 怎么来的 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路和通信设备连接起来,在网络操作…

3. Kafka入门—安装与基本命令

Kafka基础操作 一. 章节简介二. kafka简介三. Kafka安装1. 准备工作2. Zookeeper安装2.1 配置文件2.2 启动相关命令3. Kafka安装3.1 配置文件3.2 启动相关命令-------------------------------------------------------------------------------------------------------------…

【Redis】 数据淘汰策略

面试官询问缓存过多而内存有限时内存被占满的处理办法,引出 Redis 数据淘汰策略。 数据淘汰策略与数据过期策略不同, 过期策略针对设置过期时间的 key 删除, 淘汰策略是在内存不够时按规则删除内存数据。 八种数据淘汰策略介绍 no evision&…

meshy的文本到3d的使用

Meshy官方网站: 中文官网: Meshy官网中文站 ​编辑 Opens in a new window ​编辑www.meshycn.com Meshy AI 中文官网首页 英文官网: Meshy目前似乎还没有单独的英文官网,但您可以在中文官网上找到英文界面或相关英文资料。 链…

计算机网络压缩版

计算机网络到现在零零散散也算过了三遍,一些协议大概了解,但总是模模糊糊的印象,现在把自己的整体认识总结一下,(本来想去起名叫《看这一篇就够了》,但是发现网上好的文章太多了,还是看这篇吧&a…

C++-----线性结构

C线性结构模板 概念:线性结构是一种数据元素之间存在一对一线性关系的数据结构,如数组、链表、栈、队列等。C中的模板可以让我们编写通用的代码,适用于不同的数据类型,而不必为每种数据类型都重复编写相同的代码结构。作用&#…

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分,感知可能不明显;而如果丢字发生在高能量部分或关键音素上,感知…

支持向量机入门指南:从原理到实践

目录 1 支持向量机的基本概念 1.2 数学表达 2 间隔与支持向量 2.1 几何间隔 2.2 支持向量的概念 2.3 规范化超平面 2.4 支持向量的深入分析 2.4.1 支持向量的特征 2.4.2 支持向量的作用 2.4.3 支持向量的代数表示 2.5 KKT条件 3 最优化问题 3.1 问题的形成 3.2 规…

使用Webpack构建微前端应用

英文社区对 Webpack Module Federation 的响应非常热烈,甚至被誉为“A game-changer in JavaScript architecture”,相对而言国内对此热度并不高,这一方面是因为 MF 强依赖于 Webpack5,升级成本有点高;另一方面是国内已…

SQLite本地数据库的简介和适用场景——集成SpringBoot的图文说明

前言:现在项目普遍使用的数据库都是MySQL,而有些项目实际上使用SQLite既足矣。在一些特定的项目中,要比MySQL更适用。 这一篇文章简单的介绍一下SQLite,对比MySQL的优缺点、以及适用的项目类型和集成SpringBoot。 1. SQLite 简介 …

游戏引擎学习第62天

回顾 我们目前正在开发一把虚拟剑,目的是让角色可以用这把剑进行攻击。最初的工作中,我们使用了一个摇滚位图作为虚拟剑的模型,并且实现了一个基本的功能:角色可以丢下剑。但这个功能并没有达到预期的效果,因为我们想…

spring专题笔记(六):bean的自动装配(自动化注入)-根据名字进行自动装配、根据类型进行自动装配。代码演示,通俗易懂。

目录 一、根据名字进行自动装配--byName 二、根据类型进行自动装配 byType 本文章主要是介绍spring的自动装配机制, 用代码演示spring如何根据名字进行自动装配、如何根据类型进行自动装配。代码演示,通俗易懂。 一、根据名字进行自动装配--byName Us…

petalinux 中 cmake 需要用到的环境变量

自定义修改部分环境变量, 实测可用