Python读取PDF案例有哪些?

wen python案例 1

Python读取PDF案例有哪些?一文详解5种实用方法与代码实战

📌 目录导读

  1. 为什么需要读取PDF?——应用场景与挑战
  2. Python读取PDF的5大主流库对比
    • 1 PyPDF2 / PyPDF4:基础文本提取
    • 2 pdfplumber:表格与结构化数据抽取
    • 3 PDFMiner.six:复杂PDF的强力工具
    • 4 camelot:表格提取专家
    • 5 PyMuPDF(fitz):高性能与图像处理
  3. 实战案例一:从PDF中提取纯文本
  4. 实战案例二:从PDF中提取表格数据
  5. 实战案例三:PDF转图片与OCR识别
  6. 实战案例四:合并、拆分与旋转PDF页面
  7. 高频问答(Q&A)
  8. 如何选择最适合你的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

抱歉,评论功能暂时关闭!