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

PyPDF2转换学术期刊PDF至文本时出现文本拼接异常求助

PyPDF2转换学术PDF时部分文件丢失换行导致单词拼接的问题解决

问题根源

  1. PDF文本结构差异:不同批次学术期刊PDF的生成方式不同(如LaTeX编译、Word导出等),第一批PDF的文本块自带换行布局信息,PyPDF2提取时能自然保留换行;第二批PDF的文本以离散块形式存储,无显式换行标记,直接拼接文本块会导致行尾与下一行开头单词相连。
  2. 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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:30:51