如何用Python逐行提取PDF中单词间的间距?
提取PDF每行单词间距的Python实现
PDF中的单词间距大多不是通过普通空格字符实现的,而是依靠字符的坐标偏移来控制,这就是isspace()方法失效的原因。要准确提取间距,必须获取文本的精确位置信息,推荐使用**PyMuPDF(fitz)**库,它能直接拿到每个单词的坐标数据。
实现步骤
安装依赖
先安装PyMuPDF库:pip install pymupdf核心代码
下面的代码会逐页、逐行提取单词,并计算相邻单词的间距: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
相关产品推荐
相关产品推荐

