一个去掉PDF背景水印的思路

起因

昨天测试 使用“https://github.com/VikParuchuri/marker” 将 pdf 转 Markdown的过程中,发现转换后的文件中会保护一些背景图片,是转换过程中,程序把背景图识别为了内容。于是想着怎么把背景图片去掉。

背景水印图片的特征

我这里拿到的PDF图片都是文字类型的,背景水印应该都是后期加进去的。

总结出两个特征:

  • 每页都存在相同的背景图片
  • 作为背景覆盖了页面大部分区域

基于上面的特征,写代码将背景移除

  • 代码:
import fitzdef scan_background_images(pdf_path):doc = fitz.open(pdf_path)num_pages = len(doc)image_usage = {}  # 字典来记录每个图片的使用情况和页面面积覆盖# 遍历文档中的每一页for page in doc:page_area = abs(page.rect)  # 计算页面面积images = page.get_images(full=True)for img in images:xref = img[0]img_rect = page.get_image_rects(xref)img_area = sum([abs(rect) for rect in img_rect])  # 计算该图片在当前页面的总覆盖面积if img_area / page_area >= 0.5:  # 判断是否覆盖了超过50%的页面面积if xref in image_usage:image_usage[xref]['count'] += 1image_usage[xref]['pages'].add(page.number)else:image_usage[xref] = {'count': 1, 'pages': set([page.number])}# 确定在至少80%的页面上重复出现的图片background_images = []threshold = 0.8 * num_pages  # 计算至少需要出现在多少页面上for xref, data in image_usage.items():if data['count'] >= threshold:background_images.append(xref)# 移除背景图片for page in doc:for xref in background_images:page.clean_contents()  # 清理页面内容,准备删除操作page.delete_image(xref)# 保存修改后的PDFnew_pdf_path = pdf_path.replace('.pdf', '_no_bg.pdf')doc.save(new_pdf_path)doc.close()return new_pdf_path# 使用函数
pdf_path = "example.pdf"
new_pdf_path = scan_background_images(pdf_path)
print("Modified PDF saved to:", new_pdf_path)
  • 依赖
pip install PyMuPDF

效果

  • 去背景前
    在这里插入图片描述
  • 去背景后
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861564.shtml

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

相关文章

GPT-5的到来~

IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的成长。“像 GPT-4 这样的系统则更像是聪明的…

openGuass数据库极简版安装和远程连接实战(阿里云服务器操作)

openGauss部署之后,在服务器上提供了在命令行下运行的数据库连接工具gsql。此工具除了具备操作数据库的基本功能,还提供了若干高级特性,便于用户使用。但图形化工具除了官方的Data Studio外,还可以使用SQLynx进行连接(…

Taro + vue3 中微信小程序中实现拉起支付

在前端开发中 H5 的拉起支付和微信小程序的拉起支付 是不太一样的 现在分享一下微信小程序中的拉起支付 逻辑都在后端 我是用的Taro 框架 其实就是一个Api Taro 文档

酷开系统丨开启家庭智能教育让学习成为一种乐趣

在数字化时代,孩子们接触的信息日益增多,而酷开系统洞察到了家长对孩子成长环境的关切。酷开系统,作为家庭娱乐与教育的融合平台,不仅注重提供丰富的教育资源,更致力于创造一个健康、有益的学习和娱乐环境。 在酷开系…

【数据同步】什么是ETL增量抽取?

目录 一、什么是ETL增量抽取 二、企业如何应用ETL增量抽取 三、如何进行ETL增量抽取 1.基于时间戳的增量抽取 2.基于主键的增量抽取 在当今信息化时代,数据的快速增长和多样化使得企业面临着巨大的数据管理挑战。为了高效地处理和利用数据,ETL&#xff0…

BeanFactoryPostProcessor源码分析

BeanFactoryPostProcessor是Spring框架中的一个重要接口,它允许开发者在容器实例化和属性赋值完成后,初始化Bean之前,执行一些自定义逻辑。BeanFactoryPostProcessor接口定义了一个方法: public interface BeanFactoryPostProces…

地球地图:快速进行先进土地监测和气候评估的新工具Earth Map

地球地图:快速进行先进土地监测和气候评估的新工具 这个工具是居于GEE 开发的多功能的一个APP应用,主要进行土地监测和气候评估 Earth Map 什么是地球地图? 地球地图是联合国粮食及农业组织(粮农组织)在粮农组织与谷歌合作框架内开发的一个创新、免费和开放源码的工具。…

NC65[Cloud]用户密码SQL实现

--NC65用户密码加密方式为:U_U--V MD5(用户的CUSERID字段值密码明文)SELECT U_U--VSTUFF(master.dbo.fn_varbintohexstr(HASHBYTES(MD5,CONVERT(VARCHAR(50), cuserid密码))),1,2,) AS NC65 FROM sm_user --NC Cloud用户密码加密方式为:S_S Base64编码(SHA256(用户的CUSERID…

EasyExcel动态表头多sheet录入,单元格操作样式,自动修改单元格格式

EasyExcel动态表头多sheet录入,单元格操作样式,自动修改单元格格式 说明 EasyExcel是一款开源的Java库,用于读取、写入和操作Excel文件。它是阿里巴巴集团开发的一款高效、功能丰富且易于使用的Excel操作工具。 EasyExcel提供了简洁的API,使得读写Excel…

定个小目标之刷LeetCode热题(31)

238. 除自身以外数组的乘积 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法&#…

安装docker版redis集群

本文介绍在docker中搭建一个redis集群,之前讲过 一文搞定Redis主从复制,哨兵集群,Cluster集群搭建与测试,还有 安装docker版redis并挂载配置文件redis.conf,结合这两篇文章,也可以搭建redis集群,需要的朋友可以回顾一以下~ 一、环境准备 这次的redis集群将搭建在一台…

零知识证明基础:对称加密与非对称加密

1、绪论 在密码学体系中,对称加密、非对称加密、单向散列函数、消息认证码、数字签名和伪随机数生成器被统称为密码学家的工具箱。其中,对称加密和非对称加密主要是用来保证机密性;单向散列函数用来保证消息的完整性;消息认证码的…

权限 chmod

参考: Linux chmod 命令 | 菜鸟教程 (runoob.com) Linux chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令 Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner Users)用户组&#xff08…

Arduino - MG996R

Arduino - MG996R In this tutorial, we are going to learn how to use the MG996R high-torque servo motor with Arduino. 在本教程中,我们将学习如何将MG996R高扭矩伺服电机与Arduino一起使用。 Hardware Required 所需硬件 1Arduino UNO or Genuino UNO Ard…

windows系统如何快速查看显卡详情信息

winR,输入dxdiag 打开DirectX诊断工具,可以看到显卡的详细硬件信息

面试经典sql题

假设有两张表,表1为份额表,表2为行业表。份额表与行业表依靠产品id相关联。现在需要查询表2中行业分类字段为1的所有行业的占比变动情况,占比变动计算公式为:最后一天(假设为20240531)的行业占比减去第一天…

小抄 20240625

1 先照顾好自己,有余力,再去帮助别人,否则,帮了别人,自己落得个生活不能自理,整体并没有变得更好。 2 如果几十年的沉默没有给你带来任何好处,一定要试着去表达,去主动暴露自己&am…

Vue原生写全选反选框

效果 场景:Vue全选框在头部,子框在v-for循环内部。 实现:点击全选框,所有子项选中,再次点击取消;子项全选中,全选框自动勾选,子项并未全选,全选框不勾选;已选…

国产音频放大器工作原理以及应用领域

音频放大器是在产生声音的输出元件上重建输入的音频信号的设备,其重建的信号音量和功率级都要理想:如实、有效且失真低。音频范围为约20Hz~20000Hz,因此放大器在此范围内必须有良好的频率响应(驱动频带受限的扬声器时要…

什么是抽象语法树(AST),以及 AST 在前端的应用。

定义 抽象语法树(Abstract Syntax Tree,AST)是一种抽象表示源代码结构的树形数据结构它以直观的方式展现了代码的逻辑组成。通过 AST,编程语言的复杂结构被简化为一系列节点和边,便于程序理解和操作。 AST 的使用使前…