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

Python修改可搜索PDF文本层去双空格无效,求解决方案

问题分析与解决方案

原脚本失效的原因

  • PDF文本流中的空格常以转义形式存在(如\ 或八进制编码\040),原正则仅匹配明文空格,无法识别转义后的空格。
  • pdfrw对OCR生成的复杂PDF内容流支持不足,无法正确解析或修改部分内容结构。
  • 部分OCR生成的“多空格”并非字符本身,而是通过文本位置偏移指令(如Td)模拟的,替换字符空格完全无效。

可行解决方案:使用PyMuPDF(fitz)

PyMuPDF能直接操作PDF的文本块,无需手动解析底层内容流,且可精准修改文本层同时保留图像外观。

步骤1:安装依赖

pip install pymupdf

步骤2:处理脚本

import fitz  # PyMuPDF
import re

def process_pdf(input_path, output_path):
    doc = fitz.open(input_path)
    for page in doc:
        # 获取页面所有文本块(包含文本、位置、格式信息)
        text_blocks = page.get_text("blocks")
        for block in text_blocks:
            block_text = block[4]
            # 替换连续多空格为单空格(如需保留换行,可将正则改为r' {2,}')
            cleaned_text = re.sub(r'\s{2,}', ' ', block_text)
            if cleaned_text != block_text:
                # 用新文本覆盖原文本块,保留原位置与格式
                page.add_redact_annot(block[:4], text=cleaned_text)
        # 应用修改,仅更新文本层,不影响图像
        page.apply_redactions()
    # 保存时清理冗余数据,压缩文件
    doc.save(output_path, garbage=4, deflate=True)
    doc.close()

if __name__ == "__main__":
    input_pdf = r"C:\example.pdf"
    output_pdf = r"C:\example_no_double_spaces.pdf"
    process_pdf(input_pdf, output_pdf)

脚本说明

  • get_text("blocks"):提取页面所有文本块,每个块包含位置坐标、文本内容等信息。
  • add_redact_annot:标记需要修改的文本区域,用清理后的文本替换原内容。
  • apply_redactions:执行修改,仅更新文本层,原图像层完全保留。
  • 正则r'\s{2,}'会匹配所有连续空白字符(空格、制表符等),若仅需替换空格,改为r' {2,}'即可。

特殊情况处理

若视觉上的“多空格”是OCR定位误差导致的文本位置偏移(而非字符本身),需进一步分析文本的位置指令。这种情况下可通过PyMuPDF提取内容流,解析Td等定位指令并调整偏移量,但实现复杂度较高,建议优先确认是否为字符层面的多空格问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:10:07