PyPDF2转换学术期刊PDF至文本时出现文本拼接异常求助
PyPDF2转换学术PDF时部分文件丢失换行导致单词拼接的问题解决
问题根源
- PDF文本结构差异:不同批次学术期刊PDF的生成方式不同(如LaTeX编译、Word导出等),第一批PDF的文本块自带换行布局信息,PyPDF2提取时能自然保留换行;第二批PDF的文本以离散块形式存储,无显式换行标记,直接拼接文本块会导致行尾与下一行开头单词相连。
- Visitor函数逻辑缺失:原代码仅筛选指定y坐标范围内的文本,未跟踪文本块的行位置变化,无法判断何时需要添加换行符。
修复后的代码
import re from pathlib import Path from PyPDF2 import PdfReader def pdf_convertor(pdf_path, new_path, h_f, l_b, u_b): reader = PdfReader(pdf_path) parts = [] last_y = None # 记录上一个文本块的纵向坐标 def visitor_body(text, cm, tm, fontDict, fontSize): nonlocal last_y y = tm[5] if y > l_b and y < u_b: # 根据字体大小动态计算行高阈值,判断是否换行了 line_threshold = fontSize * 1.2 if fontSize else 10 if last_y is not None and abs(y - last_y) > line_threshold: parts.append("\n") parts.append(text) last_y = y for current_page in range(len(reader.pages)): page = reader.pages[current_page] if h_f == "y": # 每页处理前重置行坐标记录,避免跨页干扰 last_y = None page.extract_text(visitor_text=visitor_body) elif h_f == "n": # 非裁剪模式直接提取带布局的文本 text = page.extract_text(layout_mode="layout") parts.append(text) else: print("请输入y裁剪页眉页脚,否则输入n") return text_body = "".join(parts) # 清理多余的连续换行 text_body = re.sub(r'\n+', '\n', text_body) # 用with语句自动管理文件关闭 with open(new_path, "w", encoding="utf-8") as newfile: newfile.write(text_body) # 批量处理逻辑 files = Path(directory).glob('*') i = 0 for file in files: temp_path = f"./temp_{i}.txt" # 避免多个文件复用同一个new_path导致覆盖 pdf_convertor(file, temp_path, 'y', 70, 700) with open(temp_path, "r", encoding="utf-8") as f: text = f.read() # 移除参考文献部分 text = re.sub(r"\nReference((.|\n)*)", " ", text) with open(f"{path}{i}_result.txt", 'w', encoding="utf-8") as p: p.write(text) i += 1
额外优化点
- 动态行高阈值:根据当前文本块的字体大小计算换行阈值,适配不同字号的PDF内容。
- 每页重置行坐标:避免跨页的文本块坐标干扰换行判断。
- 带布局的文本提取:非裁剪模式下使用
layout_mode="layout"参数,更好保留原始文本布局。 - 文件操作优化:用
with语句自动管理文件,避免手动关闭遗漏;批量处理时使用临时文件路径,防止多个文件复用同一路径导致内容覆盖。
内容的提问来源于stack exchange,提问作者e.g.
相关产品推荐
相关产品推荐

