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
相关产品推荐
相关产品推荐

