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


    起因

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

    背景水印图片的特征

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

    总结出两个特征:

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

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

    • 代码:
    import fitz
    
    def 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'] += 1
                        image_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)
    
        # 保存修改后的PDF
        new_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
    

    效果

    • 去背景前
      在这里插入图片描述
    • 去背景后
      在这里插入图片描述
  • 相关阅读:
    又一个新指标可以写,氧化平衡评分,源自膳食以及生活方式
    .net使用nacos配置,手把手教你分布式配置中心
    找高清、4K图片素材就上这6个网站,免费下载!
    MyBatis流式查询
    如何在Word中插入代码片段
    虚拟DOM的原理和理解
    Java excel poi 读取已有文件 ,动态插入一列数据
    java 数据脱敏
    设计模式_单例模式(C++)
    多态的详解
  • 原文地址:https://blog.csdn.net/waitdeng/article/details/140003003