如何从pdftotext提取的PDF文本中提取段落(含跨页处理)
提取SSRN PDF段落并处理跨页问题
核心思路
SSRN PDF提取的文本里,段落内换行是单个换行符,段落间用空行分隔,跨页的段落则是上一页末尾和下一页开头无空行衔接。我们需要:
- 统一换行符,消除页面分隔的影响
- 合并跨页的连续内容
- 以空行为分隔,将连续非空行合并为完整段落
实现代码
from pdftotext import PDF def extract_paragraphs(pdf_path): with open(pdf_path, "rb") as f: pdf = PDF(f) all_lines = [] for idx, page in enumerate(pdf): # 统一换行符为\n,拆分每页文本为行列表 lines = page.replace('\r\n', '\n').split('\n') # 处理跨页段落:相邻页面首尾非空则合并 if idx > 0 and all_lines: prev_last = all_lines[-1].strip() curr_first = lines[0].strip() if lines else "" if prev_last and curr_first: # 合并上一页末尾与当前页开头 all_lines[-1] = f"{all_lines[-1]} {curr_first}" lines = lines[1:] all_lines.extend(lines) # 合并连续非空行为段落,空行作为分隔 paragraphs = [] current_para = [] for line in all_lines: stripped = line.strip() if stripped: current_para.append(stripped) else: if current_para: paragraphs.append(' '.join(current_para)) current_para = [] # 处理最后一个未收尾的段落 if current_para: paragraphs.append(' '.join(current_para)) return paragraphs # 调用示例 paragraphs = extract_paragraphs("SSRN-id4337484.pdf") # 查看前3个段落 for i, para in enumerate(paragraphs[:3], 1): print(f"段落{i}:\n{para}\n")
关键说明
- 换行统一:将
\r\n替换为\n,避免Windows格式换行带来的拆分问题 - 跨页处理:遍历页面时检查上一页最后一行和当前页第一行,若均为有效内容则合并,消除分页对段落的切割
- 段落合并:以空行作为段落边界,将段落内的多行文本用空格连接,还原完整语义段落
- 可选优化:如果PDF包含页眉/页脚,可添加额外逻辑过滤(比如匹配页码、SSRN编号等特征文本)
内容的提问来源于stack exchange,提问作者data-monkey
相关产品推荐
相关产品推荐

