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

如何避免PyMuPDF(Fitz)将单词间大间距识别为换行符?

解决PyMuPDF提取PDF文本时单词被错误换行的问题

你的问题核心是PyMuPDF默认根据字符间距阈值判断换行/空格,当单词间空白过大时会误判为换行。TEXT_INHIBIT_SPACES标志的作用是抑制自动插入空格,并不针对这种误换行场景,所以无效。以下是两种可行的解决方案:

方案一:通过提取单词位置自定义拼接文本

这种方法直接获取每个单词的坐标信息,通过计算单词间的位置关系来决定添加空格还是换行,完全可控:

def get_text(pdf_path):
    doc = fitz.open(pdf_path)
    text = ""
    for page in doc:
        # 提取带位置信息的单词列表,按阅读顺序排序
        words = page.get_text("words", sort=True)
        prev_x_end = prev_y_end = None
        
        for word in words:
            x0, y0, x1, y1, word_str = word[:5]
            font_height = y1 - y0  # 估算当前单词的字体高度
            
            if prev_x_end is not None:
                # 判断是否为同一行:垂直方向偏差小于字体高度的1/3
                is_same_line = abs(y0 - prev_y_end) < font_height / 3
                if is_same_line:
                    # 水平间距小于字体高度的一半,视为空格;否则视为换行
                    if x0 - prev_x_end < font_height / 2:
                        text += " "
                    else:
                        text += "\n"
                else:
                    text += "\n"
            
            text += word_str
            prev_x_end, prev_y_end = x1, y1
        text += "\n"  # 每页结束添加换行分隔
    return text

方案二:尝试调整文本提取标志

可以尝试使用TEXT_PRESERVE_WHITESPACE保留PDF原始空白,同时结合TEXT_SORT保证阅读顺序:

def get_text(pdf_path):
    doc = fitz.open(pdf_path)
    text = ""
    for page in doc:
        flags = fitz.TEXT_PRESERVE_WHITESPACE | fitz.TEXT_SORT
        text += page.get_text("text", flags=flags)
    return text

如果方案二无效,方案一的自定义处理是更可靠的选择,它完全绕过PyMuPDF的默认换行判断逻辑,精准控制文本拼接规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:05:09