如何使用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
相关产品推荐
相关产品推荐

