You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python移除PDF水印且无需将PDF转为图片作为中间步骤

移除PDF文本水印并保留可提取表格的Python解决方案

从你提供的水印样式来看,这是重复的文本类水印,PyPDF4这类库因无法精细操作PDF内容流导致失效。以下是基于PyMuPDF(fitz)的解决方案,直接操作PDF文本层,不会破坏原有可提取结构,完全适配camelot-py的表格提取需求:

步骤1:安装依赖

pip install pymupdf camelot-py[cv]

步骤2:编写水印移除代码

该代码通过匹配水印文本内容,直接从PDF内容流中删除水印相关的绘制指令,同时用白色矩形兜底覆盖残留水印:

import fitz  # PyMuPDF

def remove_text_watermark(input_path, output_path, watermark_keyword):
    # 打开PDF文档
    doc = fitz.open(input_path)
    
    for page in doc:
        # 提取页面内容流,过滤含水印的指令
        content_streams = page.get_contents()
        filtered_streams = []
        for stream in content_streams:
            stream_str = stream.decode("utf-8", errors="ignore")
            # 跳过包含水印关键词的内容行
            if watermark_keyword not in stream_str:
                filtered_streams.append(stream)
        # 替换页面内容流
        page.set_contents(filtered_streams)
        
        # 兜底:通过文本块定位,用白色矩形覆盖水印
        text_blocks = page.get_text("blocks")
        for block in text_blocks:
            block_text = block[4]
            if watermark_keyword in block_text:
                # 创建覆盖水印的矩形(白色填充)
                rect = fitz.Rect(block[:4])
                page.draw_rect(rect, color=(1, 1, 1), fill=(1, 1, 1), overlay=True)
    
    # 保存处理后的PDF
    doc.save(output_path)
    doc.close()

# 调用示例:替换为你的PDF路径和水印关键词
remove_text_watermark("原始文件.pdf", "去水印文件.pdf", "内部资料 请勿外传")

步骤3:验证表格提取

处理完成后,直接用camelot-py提取表格:

import camelot

# 提取表格
tables = camelot.read_pdf("去水印文件.pdf")
# 导出为CSV
tables.export("提取的表格.csv", f="csv")

注意事项

  • 需准确填写水印的关键词(如从水印图中识别的“内部资料 请勿外传”),若不确定可先通过page.get_text()提取页面所有文本确认
  • 该方案仅针对文本类水印,若水印是图像格式,需结合其他图像识别方案,但从你提供的水印样式看,属于文本水印,完全适用

内容的提问来源于stack exchange,提问作者npn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:57:42