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

PyMuPDF无法识别空白间隔的PDF段落,求替代方案

解决PyMuPDF无法识别PDF段落空白分隔的问题

针对PyMuPDF提取文本时无法识别段落间空白分隔的问题,推荐以下两种可行方案:

方案一:优化PyMuPDF的提取逻辑

PyMuPDF的get_text('text')模式会自动压缩多余空白,导致段落边界丢失。改用get_text('blocks')模式可以获取每个文本块的坐标与内容,通过比较相邻文本块的垂直间距判断段落分隔(段落间的空白对应更大的垂直距离):

import fitz

def extract_paragraphs_with_pymupdf(pdf_path, page_num):
    doc = fitz.open(pdf_path)
    page = doc.load_page(page_num)
    # 获取所有文本块,格式为(x0, y0, x1, y1, text, block_no, type)
    blocks = page.get_text('blocks')
    # 按文本块的垂直位置从上到下排序
    blocks.sort(key=lambda x: x[1])
    
    paragraphs = []
    current_paragraph = []
    # 垂直间距阈值:超过该值则判定为新段落(需根据PDF实际情况调整,单位为点)
    line_spacing_threshold = 15

    for i, block in enumerate(blocks):
        text = block[4].strip()
        if not text:
            continue
        if not current_paragraph:
            current_paragraph.append(text)
        else:
            # 计算当前块与上一个块的垂直间距
            prev_block = blocks[i-1]
            spacing = block[1] - prev_block[2]
            if spacing > line_spacing_threshold:
                paragraphs.append(' '.join(current_paragraph))
                current_paragraph = [text]
            else:
                current_paragraph.append(text)
    # 添加最后一个段落
    if current_paragraph:
        paragraphs.append(' '.join(current_paragraph))
    return paragraphs

# 使用示例
paragraphs = extract_paragraphs_with_pymupdf('IT_past.pdf', 0)
for idx, para in enumerate(paragraphs, 1):
    print(f"段落{idx}:\n{para}\n")

方案二:使用pdfplumber库(更简便)

pdfplumber专注于PDF的布局解析,能更好保留原始文本的段落结构,提取的文本会自带段落间的空白换行,直接分割即可:

import pdfplumber
import re

def extract_paragraphs_with_pdfplumber(pdf_path, page_num):
    with pdfplumber.open(pdf_path) as pdf:
        page = pdf.pages[page_num]
        text = page.extract_text()
        # 按空白行分割段落,兼容多个连续换行的情况
        paragraphs = [para.strip() for para in re.split(r'\n\s*\n', text) if para.strip()]
    return paragraphs

# 使用示例
paragraphs = extract_paragraphs_with_pdfplumber('IT_past.pdf', 0)
for idx, para in enumerate(paragraphs, 1):
    print(f"段落{idx}:\n{para}\n")

如果你的PDF存在特殊排版,pdfplumber还支持获取更精细的行、字符级别的位置信息,方便进一步自定义处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:09:22