如何使用Python或R从含文本、图片的PDF中提取表格?
从PDF中提取表格:Python & R 实用方案
嘿,我刚好处理过不少PDF表格提取的需求,给你分享两个主流语言的靠谱方案,亲测能解决大部分场景!
Python 实现
Python有几个专门处理PDF表格的库,这里推荐两个最常用的:
1. tabula-py
这个库对结构规整的表格支持很好,上手简单。
- 先安装:
pip install tabula-py - 示例代码:
import tabula # 提取单页表格(比如第2页) df = tabula.read_pdf("你的PDF文件路径.pdf", pages=2)[0] # 提取多页表格(比如1-5页) dfs = tabula.read_pdf("你的PDF文件路径.pdf", pages="1-5") # 把提取到的表格保存为CSV tabula.convert_into("你的PDF文件路径.pdf", "输出文件.csv", output_format="csv", pages="all")
2. Camelot
如果你的表格比较复杂(比如有合并单元格、不规则布局),Camelot会更给力,它还能评估表格提取的质量。
- 先安装(需要依赖OpenCV,所以带[cv]):
pip install camelot-py[cv] - 示例代码:
import camelot # 读取PDF并提取表格 tables = camelot.read_pdf("你的PDF文件路径.pdf", pages="all") # 查看提取到的表格数量 print(f"提取到 {len(tables)} 个表格") # 查看第一个表格的内容 print(tables[0].df) # 保存为CSV tables.export("输出文件.csv", f="csv", compress=True)
R 实现
R里用tabulizer包就很方便,注意它依赖Java,所以先确保你的环境装了Java。
步骤:
- 安装包:
install.packages("tabulizer") library(tabulizer) - 提取表格:
# 提取单页表格 tab <- extract_tables("你的PDF文件路径.pdf", pages = 1) # 转换成数据框(方便后续处理) df <- as.data.frame(do.call(rbind, tab), stringsAsFactors = FALSE) # 提取多页表格并合并 tabs <- extract_tables("你的PDF文件路径.pdf", pages = 1:5) combined_df <- do.call(rbind, lapply(tabs, function(x) as.data.frame(x, stringsAsFactors = FALSE)))
小提示
如果你的PDF是扫描件(图片型PDF),上面的方法直接用不了,得先做OCR(光学字符识别):
- Python可以搭配
pytesseract库,先把PDF转成图片,再OCR识别文字后提取表格; - R可以用
tesseract包做类似的操作。
内容的提问来源于stack exchange,提问作者TayyabRahmani




