PyPDF2无法正确提取表格和换行,因其仅按操作符顺序拼接文本流,不还原视觉布局;适合纯文字PDF,不适用于表格、多栏、扫描件或复杂字体文档。

PyPDF2 读不到表格和换行,是因为它只解析文本流不还原布局
PyPDF2 的 extract_text() 本质是按 PDF 内部操作符顺序拼接字符串,不理解“段落”“列”“表格单元格”这些视觉结构。你看到的换行丢失、表格内容串行、中英文混排错位,都是这个原因。
- 适合场景:纯文字报告、无格式合同、页眉页脚简单的 PDF
- 不适合:带表格的财务报表、多栏排版的论文、扫描件(即使 OCR 过)、含复杂字体嵌入的文档
-
extract_text()的page_layout参数对多数 PDF 无效,别指望靠它修复排版 - 如果 PDF 是扫描件(
page.extract_text() == ""),PyPDF2 直接失效,必须先 OCR
pdfplumber 能保留坐标和框线,但默认不自动识别表格结构
pdfplumber 把每页当图像处理,返回字符级 x0/y0 坐标、字体大小、甚至检测到的线条(page.lines)。但它不会主动把几行文字+横线凑成“表格”——得你告诉它怎么切。
- 用
page.extract_tables()前先看page.to_image().draw_rects(page.chars)可视化字符分布,确认文字没被拆成单字 - 表格识别失败常见于:合并单元格没边框、字体大小不一致、列间距过小(
vertical_strategy="lines"可能漏掉隐式分隔线) - 想强制按列切,用
page.extract_text(x_tolerance=1, y_tolerance=3)调宽容差,但太大会把不同段落粘一起 -
pdfplumber.open()默认禁用图形对象解析,要提取图表标题得加laparams={"all_texts": True}
中文 PDF 提取乱码?八成是字体映射没对上
PDF 里中文常以 CID 字体形式嵌入,PyPDF2 和 pdfplumber 都依赖底层 poppler 或 pdfminer 的字体解码逻辑。乱码不是编码问题,是字体名到 Unicode 的映射缺失。
- 先用
page.chars[0]["fontname"]查字体名,再查该字体是否在系统字体缓存里(Linux 看/usr/share/fonts,macOS 看/Library/Fonts) - pdfplumber 中设置
pdfplumber.open("x.pdf", password="", laparams={"detect_vertical": True})可改善竖排中文识别 - PyPDF2 对 CID 字体基本无解,遇到
UnicodeDecodeError或一堆空格,直接换 pdfplumber - 别信“用
codecs.open(..., encoding="gbk")就能救”,PDF 文本流不是文件编码问题
混合内容(文字+表格+图片)该怎么选工具链
没有万能工具。真实 PDF 往往同时含标题、正文、三列表格、底部页码、右侧批注框——得按区域拆解处理。
立即学习“Python免费学习笔记(深入)”;
- 先用 pdfplumber 定位关键区域:
page.crop((x0, y0, x1, y1))切出表格区,再.extract_tables();切出正文区,再.extract_text() - 纯文字部分用 PyPDF2 更快(尤其千页 PDF),但一旦发现
extract_text()返回空或全是空格,立刻切到 pdfplumber - 有图片水印或背景图干扰文字?pdfplumber 的
page.filter()可按颜色/尺寸过滤掉干扰元素 - 批量处理时,先抽样 5–10 页人工检查结构一致性,再写规则——PDF 格式不统一,硬套一个参数跑全量必翻车











