pdfplumber 入门指南:5 分钟从 PDF 提取文本和表格
【免费下载链接】pdfplumberPlumb a PDF for detailed information about each char, rectangle, line, et cetera — and easily extract text and tables.项目地址: https://gitcode.com/GitHub_Trending/pd/pdfplumber
拿到一份机器生成的 PDF 报告,你最想知道的往往是:里面的文字和表格能不能直接变成能算的数据?pdfplumber 把 PDF 里的每个字符、线条、矩形连坐标一起解析出来,帮你提取文本和表格。跟着本文做,5 分钟内你会从一份真实 PDF 里拿到整页文本、一张按行列排好的表格,以及一张标出词框位置的调试图。
准备工作:环境要求与安装验证
本节只解决一件事:让后面的命令和代码都能直接跑。
- ✅ 需要 Python 3.8 及以上,官方在 3.10 ~ 3.14 上完成过完整测试
- ✅ 跨平台,Windows、macOS、Linux 都能装
- ✅ 依赖自动带上:底层解析引擎 pdfminer.six、图片库 Pillow、渲染库 pypdfium2
执行 1 条命令完成安装,紧接着打印版本号确认依赖齐了:
pip install pdfplumber python -c "import pdfplumber; print(pdfplumber.__version__)"装好后先花 10 秒看清它的能力边界:
| 能力 | 一句话说明 |
|---|---|
| 逐对象解析 | 每个字符、线条、矩形的坐标和属性都能拿到 |
| 文本提取 | 整页文字一次取出,也可按版面还原 |
| 表格提取 | 沿表格线还原单元格,输出行列结构 |
| 可视化调试 | 把提取结果直接叠加画在页面图上 |
最小闭环:3 行代码拿到第一页文本
用 3 行核心代码走一遍"打开 → 取页 → 提文本",后面所有用法都建立在这一步之上。练习文件就用仓库自带的 examples/pdfs/background-checks.pdf,换成你手头的任何 PDF 同理。
import pdfplumber with pdfplumber.open("background-checks.pdf") as pdf: text = pdf.pages[0].extract_text() print(text)pdfplumber.open(...):打开 PDF,参数可以是文件路径或字节对象pdf.pages[0]:取第 1 页,索引从 0 开始.extract_text():按阅读顺序把整页字符拼成文本
核心场景实战
三个最高频场景,按"先看对象、再取数据、最后调参"的顺序来。
不写代码:命令行导出整份 PDF 的 CSV
什么时候用:想快速确认 PDF 里到底有多少对象、长什么样,或要把坐标数据直接交给 Excel。
在终端执行pdfplumber background-checks.pdf > background-checks.csv,输出的 CSV 包含这份 PDF 里每个字符、线条、矩形的位置和属性。三个参数最常用:
--format text:跳过对象数据,直接输出还原版面后的纯文本--pages 1 11-15:只处理第 1 页和第 11~15 页(从 1 开始数,空格分隔)--types char rect:只提取指定类型的对象
提取带边框的表格
什么时候用:PDF 里有可见表格线(机器生成的报表最典型),需要把"格子"变成结构数据。
import pdfplumber with pdfplumber.open("background-checks.pdf") as pdf: table = pdf.pages[0].extract_table() print(table)返回值是"行 → 单元格"的嵌套列表,可以直接交给 pandas 变成 DataFrame。关键参数是table_settings:默认用lines策略沿线条找格子,如果某个方向缺线导致漏行,改成{"vertical_strategy": "text"},让它改按文字位置推断边界。识别逻辑都在 pdfplumber/table.py 里。
提取不准时:把结果画出来
什么时候用:文本乱序、表格漏行,光看输出猜不出原因。
with pdfplumber.open("background-checks.pdf") as pdf: p0 = pdf.pages[0] im = p0.to_image() im.debug_tablefinder() im.show()debug_tablefinder()会把检测到的线条、交点和识别出的表格框直接叠加到页面上;换成im.draw_rects(p0.extract_words())则画出每个词的位置。在 Jupyter 里to_image()会自动把页面渲染进单元格,效果类似下图(红框即提取到的词):
结果不对时怎么排查
⚠️ 两个新手最常撞上的问题,都按"现象 → 原因 → 处理"说明。
空白或只有零星字符:extract_text()返回空串或几个乱码;多半是扫描件——页面本质是图片、没有文字层,pdfplumber 不做 OCR;先在 PDF 阅读器里选中一段文字试试,选不中就改走 OCR 方案。
文本顺序错乱:双栏排版提取出来左右交叉;原因是默认按坐标把字符聚成行,特殊版式会串栏;改用extract_text(layout=True)按版面还原,或先用crop切出单栏再分别提取。
继续深入的路径
- 官方功能总览:README.md,表格提取策略的完整说明都在里面
- 官方示例:examples/notebooks/ 有 4 个 Notebook,配套 PDF 在 examples/pdfs/,建议按表格调参的思路顺序看
- 结构损坏的 PDF 打不开:参考修复指南 docs/repairing.md
- 源码入口:pdfplumber/page.py 是页面对象的全部属性,pdfplumber/display.py 负责渲染和画框
打开终端装上 pdfplumber,随手挑一份 PDF 把第一页文本提取出来看看——后面的问题,画出来再解决。
【免费下载链接】pdfplumberPlumb a PDF for detailed information about each char, rectangle, line, et cetera — and easily extract text and tables.项目地址: https://gitcode.com/GitHub_Trending/pd/pdfplumber
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考