Python读取PDF案例有哪些?一文详解5种实用方法与代码实战
📌 目录导读
- 为什么需要读取PDF?——应用场景与挑战
- Python读取PDF的5大主流库对比
- 1 PyPDF2 / PyPDF4:基础文本提取
- 2 pdfplumber:表格与结构化数据抽取
- 3 PDFMiner.six:复杂PDF的强力工具
- 4 camelot:表格提取专家
- 5 PyMuPDF(fitz):高性能与图像处理
- 实战案例一:从PDF中提取纯文本
- 实战案例二:从PDF中提取表格数据
- 实战案例三:PDF转图片与OCR识别
- 实战案例四:合并、拆分与旋转PDF页面
- 高频问答(Q&A)
- 如何选择最适合你的PDF读取方案?
为什么需要读取PDF?——应用场景与挑战
PDF(Portable Document Format)作为跨平台文档标准,在报告、合同、论文、发票等场景中广泛使用,但PDF的“固定布局”特性让数据提取变得棘手:文本可能被切割、表格没有结构、字体编码混乱、扫描件只有图像,Python凭借丰富的PDF处理生态,成为解决这些痛点的主流工具。
用户真实痛点:
- 从银行对账单PDF中提取交易明细?
- 从PDF论文中批量抓取参考文献?
- 将PDF发票内容录入数据库? 下面我们会用代码逐一解答。
Python读取PDF的5大主流库对比
| 库名称 | 擅长领域 | 是否支持表格 | 是否支持扫描件 | 性能 |
|---|---|---|---|---|
| PyPDF2 | 基础文本、页面操作 | 中 | ||
| pdfplumber | 表格、结构化文本 | 高 | ||
| PDFMiner.six | 复杂排版、自定义解析 | 中 | ||
| camelot | 高精度表格提取 | 高 | ||
| PyMuPDF | 高速文本、图片、OCR | ✅(需配合OCR) | 极快 |
安装提示(建议在虚拟环境中):
pip install PyPDF2 pdfplumber pdfminer.six camelot-py[cv] pymupdf
实战案例一:从PDF中提取纯文本
场景: 提取一份PDF合同的全部文字内容。
# 方法1:使用PyPDF2(最简单)
import PyPDF2
with open('contract.pdf', 'rb') as file:
reader = PyPDF2.PdfReader(file)
text = ""
for page in reader.pages:
text += page.extract_text()
print(text[:500]) # 打印前500字符
# 方法2:使用pdfplumber(更稳定,保留空格和换行)
import pdfplumber
with pdfplumber.open('contract.pdf') as pdf:
full_text = ""
for page in pdf.pages:
full_text += page.extract_text()
print(full_text[:500])
常见问题:
- 为什么PyPDF2有时提取中文乱码? → 尝试pdfplumber,它对Unicode支持更好。
- 提取的文本没有空格或换行? → 使用pdfplumber的
extract_text(layout=True)参数。
实战案例二:从PDF中提取表格数据
场景: 从一份PDF年报中提取财务表格。
# 使用pdfplumber提取表格
import pdfplumber
with pdfplumber.open('annual_report.pdf') as pdf:
# 假设表格在第5页
page = pdf.pages[4]
table = page.extract_table()
for row in table:
print(row)
# 使用camelot(更适合复杂表格,如跨行、合并单元格)
import camelot
tables = camelot.read_pdf('annual_report.pdf', pages='5')
print(tables[0].df) # 输出DataFrame格式
高级技巧:
- 自动检测表格:
camelot.read_pdf(file, flavor='stream')(流模式,适合无表格线的PDF)。 - 导出为Excel:
tables[0].to_excel('table.xlsx')。
实战案例三:PDF转图片与OCR识别
场景: 扫描件PDF(如手写签名的合同)提取文字。
# 使用PyMuPDF将PDF页面转图片
import fitz # PyMuPDF
doc = fitz.open('scanned_doc.pdf')
for page_num in range(doc.page_count):
page = doc.load_page(page_num)
pix = page.get_pixmap()
pix.save(f"page_{page_num}.png") # 保存为图片
# 然后使用Tesseract OCR(需要安装tesseract-ocr)
import pytesseract
from PIL import Image
img = Image.open('page_0.png')
text = pytesseract.image_to_string(img, lang='chi_sim') # 中文识别
print(text)
⚠️ 注意: 扫描件PDF本身无文字层,必须先转为图片再OCR。
实战案例四:合并、拆分与旋转PDF页面
场景: 将多个PDF合并,或提取某几页单独保存。
from PyPDF2 import PdfWriter, PdfReader
# 合并多个PDF
merger = PdfWriter()
for pdf_file in ['file1.pdf', 'file2.pdf']:
reader = PdfReader(pdf_file)
for page in reader.pages:
merger.add_page(page)
merger.write('merged.pdf')
merger.close()
# 拆分PDF(提取前3页)
reader = PdfReader('large.pdf')
writer = PdfWriter()
for i in range(min(3, len(reader.pages))):
writer.add_page(reader.pages[i])
with open('first_3_pages.pdf', 'wb') as f:
writer.write(f)
高频问答(Q&A)
Q1:读取PDF时出现“No module named ‘PyPDF2’”怎么办?
A:检查是否在正确的环境中安装,尝试 pip install PyPDF2,如果已安装但仍报错,可能是Python版本冲突(PyPDF2需Python 3.6+)。
Q2:pdfplumber提取表格时数据错乱怎么办?
A:尝试调整 table_settings 参数,
page.find_tables(table_settings={
"vertical_strategy": "lines",
"horizontal_strategy": "text"
})
Q3:如何处理加密的PDF?
A:使用PyPDF2的 decrypt('password') 方法:
reader = PdfReader('encrypted.pdf')
if reader.is_encrypted:
reader.decrypt('mypassword')
text = reader.pages[0].extract_text()
Q4:提取的表格中数字带有逗号(如1,000)如何转为纯数字?
A:提取后使用字符串处理:value.replace(',', '')。
clean_value = row[2].replace(',', '') # 假设第3列是金额
如何选择最适合你的PDF读取方案?
| 需求类型 | 推荐工具 | 理由 |
|---|---|---|
| 纯文本提取(合同、论文) | pdfplumber | 布局保留好,中文支持强 |
| 表格提取(财报、发票) | camelot + pdfplumber | camelot精度高,pdfplumber灵活 |
| 扫描件OCR | fitz + pytesseract | 转图+OCR成熟方案 |
| 页面操作(合并/拆分) | PyPDF2 | 轻量且稳定 |
| 高性能批量处理 | PyMuPDF | 速度是其他库的5-10倍 |
最后提醒: PDF解析没有银弹,实际项目中常需要组合多个库,先用PyMuPDF快速判断页面类型(扫描件 vs 文字版),再根据结果选择OCR或pdfplumber提取,通过本文的案例,你可以覆盖90%以上的Python读取PDF需求,如果遇到特定格式的怪问题,欢迎在评论区交流解决方案。
标签: PDF