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

如何用Python逐行提取PDF中单词间的间距?

提取PDF每行单词间距的Python实现

PDF中的单词间距大多不是通过普通空格字符实现的,而是依靠字符的坐标偏移来控制,这就是isspace()方法失效的原因。要准确提取间距,必须获取文本的精确位置信息,推荐使用**PyMuPDF(fitz)**库,它能直接拿到每个单词的坐标数据。

实现步骤

  1. 安装依赖
    先安装PyMuPDF库:

    pip install pymupdf
    
  2. 核心代码
    下面的代码会逐页、逐行提取单词,并计算相邻单词的间距:

    import fitz
    from itertools import groupby
    
    def extract_word_spaces(pdf_path):
        doc = fitz.open(pdf_path)
        for page_idx in range(len(doc)):
            page = doc[page_idx]
            # 获取所有单词的位置与文本信息,返回格式:(x0, y0, x1, y1, text, block_no, line_no, word_no)
            words = page.get_text("words")
            if not words:
                continue
            # 按「块+行」分组,确保同一行的单词被归为一组
            group_key = lambda word: (word[5], word[6])  # block_no, line_no
            for (block_id, line_id), line_words in groupby(words, key=group_key):
                line_words = list(line_words)
                print(f"第{page_idx+1}页,块{block_id},行{line_id+1}:")
                # 计算相邻单词的间距
                for i in range(len(line_words)-1):
                    prev_word = line_words[i]
                    curr_word = line_words[i+1]
                    # 间距 = 当前单词左边界x坐标 - 前一个单词右边界x坐标
                    space_width = curr_word[0] - prev_word[2]
                    print(f"  '{prev_word[4]}' 与 '{curr_word[4]}' 的间距: {space_width:.2f} 单位")
        doc.close()
    
    # 调用示例,替换为你的PDF路径
    extract_word_spaces("sample.pdf")
    

关键说明

  • page.get_text("words"):这是实现的核心,它返回的每个元素包含单词的矩形坐标(左、上、右、下)和文本内容,而非单纯的纯文本,所以能捕捉到PDF中靠坐标实现的间距。
  • 间距计算逻辑:通过相邻单词的x坐标差得到间距值,单位与PDF的内部坐标一致(通常为点,1点=1/72英寸)。
  • 兼容多种格式:不管是常规排版还是特殊样式的间距(比如加宽、紧缩),只要是可编辑的PDF,都能准确提取。

特殊情况处理

如果你的PDF是扫描件(图片型PDF),需要先通过OCR识别文本并获取位置信息,可以结合pytesseract库:先提取PDF中的图片,再对图片做OCR,然后从OCR结果中解析单词位置。这种场景下的代码复杂度会更高,需要额外处理图片提取与OCR的坐标映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:54:24