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

PyMuPDF提取PDF文本时空格丢失及乱码问题求助

PyMuPDF提取PDF文本:空格丢失与乱码问题修复

问题现象

处理目标PDF时出现两类异常:

  • 调用page.get_text()提取文本,空格保留但部分内容被未知字符“�”替换;
  • 使用page.get_text("dict", flags=11)遍历span,大量空格丢失(如闭括号后的空格消失)。

解决方案

1. 乱码(“�”)问题处理

这类字符通常是PDF中特殊字符编码未被正确识别,或字体嵌入不完整导致,可通过以下方式修复:

  • 调整提取flags:使用fitz.TEXTFLAGS_TEXT(值为2)基础flag,结合fitz.TEXT_PRESERVE_LIGATURES保留连字结构,避免编码解析错误。示例:
    print(page.get_text(flags=fitz.TEXTFLAGS_TEXT | fitz.TEXT_PRESERVE_LIGATURES))
    
  • 更新PyMuPDF版本:新版本对非嵌入字体、特殊字符的兼容性更好,能减少此类乱码问题。

2. dict模式下空格丢失问题

dict模式中,span文本本身不会包含span间的空格,空格是通过span的位置间距体现的,加上你使用的flags=11参数组合未正确启用空格保留,修复方式如下:

  • 修正flags参数:明确指定fitz.TEXT_PRESERVE_WHITESPACE(值为8)和fitz.TEXT_DEHYPHENATE(值为4),替代flags=11:
    blocks = page.get_text("dict", flags=fitz.TEXT_PRESERVE_WHITESPACE | fitz.TEXT_DEHYPHENATE)["blocks"]
    
  • 手动补充span间空格:遍历span时,通过对比前后span的边界坐标判断是否需要添加空格,示例代码:
    doc = fitz.open("40337_02.pdf")
    page = doc[3]
    blocks = page.get_text("dict", flags=fitz.TEXT_PRESERVE_WHITESPACE | fitz.TEXT_DEHYPHENATE)["blocks"]
    
    for block in blocks:
        for line in block["lines"]:
            last_span_right = None
            for span in line["spans"]:
                if last_span_right is not None:
                    # 计算两个span的间距,超过阈值则添加空格
                    gap = span["bbox"][0] - last_span_right
                    if gap > 1.5:  # 阈值可根据PDF实际排版调整
                        print(" ", end="")
                print(span["text"], end="")
                last_span_right = span["bbox"][2]
            print()
    

3. 通用优化建议

  • 优先使用page.get_text("text")提取完整文本,这种模式下PyMuPDF会自动处理大部分空格和排版,再针对乱码做局部修复;
  • 若需结构化提取(dict模式),务必依赖span的位置信息补充空格,不要仅依赖span文本内容;
  • 检查PDF本身的字体嵌入情况,若核心字体未嵌入,可尝试使用OCR模式提取(需额外依赖Tesseract)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:57:06