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

如何使用Python和PyMuPDF提取PDF文件的文本及相关信息

解决PDF字符实际间距提取与转换器框架搭建

核心问题:获取字符实际前进间距

你当前代码用平均宽度计算字符位置的方式,无法适配不等宽字体(如中文、含特殊字符的文本),PyMuPDF提供了直接获取单个字符精确位置的方法,无需手动平均分配宽度。

优化后的代码(含框架搭建)

以下代码完整覆盖你需要的基础功能,并预留扩展接口:

  • 提取每个文本块的起始位置
  • 获取每个字符的精确坐标与相对间距(delta)
  • 提取字体名称、字号信息
  • 预留图片提取的框架逻辑
import sys
import fitz  # PyMuPDF

def extract_pdf_content(pdf_path):
    doc = fitz.open(pdf_path)
    
    for page_num in range(len(doc)):
        page = doc[page_num]
        prev_char_x, prev_char_y = None, None
        
        print(f"--- 第 {page_num + 1} 页开始 ---")
        
        # 获取页面完整内容结构(文本+图片块)
        text_dict = page.get_text("dict")
        for block_idx, block in enumerate(text_dict['blocks']):
            if 'lines' not in block:
                # 识别图片块,预留提取逻辑
                if block['type'] == 1:
                    print(f"图片块 {block_idx + 1},位置:{block['bbox']}")
                continue
            
            # 输出文本块起始位置
            block_x0, block_y0 = block['bbox'][0], block['bbox'][1]
            print(f"\n文本块 {block_idx + 1},起始位置:({block_x0:.2f}, {block_y0:.2f})")
            
            for line in block['lines']:
                for span in line['spans']:
                    # 提取当前span的字体信息
                    font_name = span['font']
                    font_size = span['size']
                    print(f"  字体:{font_name},字号:{font_size:.2f}")
                    
                    # 获取当前页所有字符的精确信息,筛选属于当前span的字符
                    all_chars = page.get_text("chars")
                    span_chars = [c for c in all_chars if 
                                  span['bbox'][0] <= c['bbox'][0] <= span['bbox'][2] and
                                  span['bbox'][1] <= c['bbox'][1] <= span['bbox'][3]]
                    # 按x坐标排序,保证字符顺序与PDF显示一致
                    span_chars.sort(key=lambda x: x['bbox'][0])
                    
                    for char_info in span_chars:
                        char = char_info['text']
                        char_x0, char_y0 = char_info['bbox'][0], char_info['bbox'][1]
                        
                        # 计算相对偏移量
                        delta_x = char_x0 - prev_char_x if prev_char_x is not None else 0
                        delta_y = char_y0 - prev_char_y if prev_char_y is not None else 0
                        
                        print(f"    字符:'{char}',位置:({char_x0:.2f}, {char_y0:.2f}),相对X偏移:{delta_x:.2f},相对Y偏移:{delta_y:.2f}")
                        
                        # 更新上一个字符的坐标
                        prev_char_x, prev_char_y = char_x0, char_y0
        
        print(f"--- 第 {page_num + 1} 页结束 ---\n")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("使用方法:python extract_pdf_content.py <PDF文件路径>")
    else:
        pdf_path = sys.argv[1]
        extract_pdf_content(pdf_path)

关键改进说明

  • 字符精确位置:通过page.get_text("chars")获取每个字符的独立边界框(bbox),彻底替代平均宽度估算,完全匹配PDF中字符的实际布局。
  • 框架扩展性:
    • 文本块信息:直接读取block的bbox起始坐标
    • 字体信息:从span字段中直接提取font和size
    • 图片提取:识别类型为1的block,后续可添加page.get_pixmap(bbox=block['bbox'])等代码完成图片提取保存。
  • 逻辑严谨性:对字符按x坐标排序,确保输出顺序与PDF视觉顺序一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:09:59