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

PyPDF2提取PDF文本换行错乱 无法按原排版逐行读取问题

问题根源

PyPDF2 自带的extractText()方法没有排版感知能力,它只会严格按照PDF内部内容流的文本写入顺序提取内容,完全不会参考字符在页面上的实际坐标位置判断排版关系。你遇到的单字、单个数字被硬插换行拆成单独行的问题,本质是测试用的这份PDF在生成时,把短文本片段甚至单个字符都作为独立对象写入了内容流,虽然视觉上这些内容是连在同一行的,但PyPDF2不会做自动拼接,就会输出错乱的换行。
你原来代码里用split(" ")拆分文本的逻辑也没有任何排版依据,只会进一步放大提取错乱的问题。

解决方法

方案1(推荐,成本最低)

换用带坐标排版判断能力的提取库pdfplumber,这个库会自动读取每个字符的X/Y轴坐标,按视觉位置自动拼接同行文本、过滤错误硬换行,不需要自己写排版判断逻辑,绝大多数常规PDF都能直接还原出和原文档一致的逐行内容。

  1. 先安装依赖:
    pip install pdfplumber
    
  2. 提取代码示例:
    import pdfplumber
    
    pdf_path = r'C:\Users\PDFExample\Desktop\Temp\sample.pdf'
    with pdfplumber.open(pdf_path) as pdf:
        for page_num, page in enumerate(pdf.pages):
            print(f"Page No: {page_num}")
            # 直接提取即可得到按视觉行排版的文本
            print(page.extract_text())
    
    跑提供的测试样例,这段代码可以直接输出预期的、和原PDF排版一致的逐行文本。

方案2(仅适合必须保留PyPDF2依赖的场景)

如果项目要求必须用PyPDF2不能换库,就需要手动提取每个字符的坐标信息,自行做排版聚类:

  • 先提取页面内所有带坐标的字符对象
  • 按字符的Y轴坐标做分组,Y轴差值在当前页字体行高阈值内的字符判定为同一行
  • 同一行内的字符按X轴坐标从左到右排序,拼接成完整行文本
    这个方案需要自己适配不同PDF的行高偏差、分栏、上下标等特殊排版,兼容成本很高,非必要不选择。

注意:不要尝试用正则、固定分隔符拆分PyPDF2直接输出的原始文本来还原排版,这类方法没有任何位置信息做依据,换一份PDF就会完全失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:24:27