您的位置:首页 > 游戏 > 游戏 > 一个去掉PDF背景水印的思路

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

2024/10/5 14:23:24 来源:https://blog.csdn.net/waitdeng/article/details/140003003  浏览:    关键词:一个去掉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

效果

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com