求可提取PDF精确词间距的Python包,用于词移隐写分析
我之前做过类似的隐写分析任务,刚好能给你一些实用的建议!要获取PDF中单词间的精确间距,**PyMuPDF(也就是fitz库)**是个非常靠谱的选择——它能精准提取PDF文本的位置坐标,完全支持你计算单词间的间距数值。另外pdfplumber也是个不错的备选,API更直观。
用PyMuPDF实现的具体方案
首先安装库:
pip install pymupdf
然后是核心代码,它会提取指定页面的所有单词,计算同一行相邻单词的间距:
import fitz # 导入PyMuPDF def calculate_word_spaces(pdf_path, target_page=0): # 打开PDF文档 doc = fitz.open(pdf_path) page = doc[target_page] # 获取页面所有单词,每个元素格式:(x0, y0, x1, y1, text, ...) # x0=单词左边界x坐标,x1=单词右边界x坐标 words = page.get_text("words") space_list = [] # 遍历相邻单词,计算同一行的间距 for i in range(len(words) - 1): prev_word = words[i] next_word = words[i+1] # 判断两个单词是否在同一行(通过y坐标范围重叠判断) if prev_word[1] < next_word[3] and prev_word[3] > next_word[1]: # 间距 = 后一个单词左边界 - 前一个单词右边界 space_width = next_word[0] - prev_word[2] space_list.append(round(space_width, 2)) # 保留两位小数,按需调整 doc.close() return space_list # 调用示例 if __name__ == "__main__": spaces = calculate_word_spaces("your_target.pdf") print("单词间间距列表:", spaces)
转换成你需要的“空格计数”格式
你的示例里用下划线代表空格,输出是[1,2,1,...]这类数值——这其实是把实际间距转换成了“等效标准空格数”。你可以先在目标PDF里找一个已知的标准空格,测量它的宽度(比如用上面的代码提取包含单个空格的位置差值),然后把计算出的每个间距除以这个标准宽度,就能得到类似的结果。
比如假设标准空格宽度是6.2,那修改代码里的计算部分:
standard_space_width = 6.2 # 替换成你实际测量的数值 space_count = round(space_width / standard_space_width) space_list.append(space_count)
备选工具:pdfplumber
如果你觉得PyMuPDF的坐标逻辑有点绕,pdfplumber的API更贴近自然语言理解,安装和使用如下:
pip install pdfplumber
代码示例:
import pdfplumber def get_word_spaces_with_pdfplumber(pdf_path, target_page=0): with pdfplumber.open(pdf_path) as pdf: page = pdf.pages[target_page] # 提取单词,y_tolerance控制同一行的判断阈值 words = page.extract_words(x_tolerance=0, y_tolerance=5) space_list = [] for i in range(len(words)-1): prev_word = words[i] next_word = words[i+1] # 判断同一行 if abs(prev_word["top"] - next_word["top"]) < 5: space_width = next_word["x0"] - prev_word["x1"] space_list.append(round(space_width, 2)) return space_list
这两个工具都能完美满足你的需求,PyMuPDF的处理速度更快,适合大文档;pdfplumber的代码可读性更好,适合快速调试。
内容的提问来源于stack exchange,提问作者dqhuy78
相关产品推荐
相关产品推荐

