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

求可提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:53