Python PDF案例如何读取PDF文本内容

wen python案例 23

Python PDF案例:如何高效读取PDF文本内容?完整实战指南

📚 目录导读

  1. 为什么选择Python读取PDF?
  2. 必备工具与库:PyPDF2、pdfplumber、pdfminer.six
  3. 实战案例一:使用PyPDF2提取纯文本
  4. 实战案例二:使用pdfplumber保留表格与布局
  5. 实战案例三:处理扫描版PDF(OCR方案)
  6. 常见问题与性能优化建议
  7. Q&A:你关心的PDF读取难题

为什么选择Python读取PDF?

PDF(Portable Document Format)作为文档交换的标准格式,广泛用于报告、合同、学术论文等场景,但在数据分析和自动化处理中,PDF的“不可编辑性”成为一大障碍,Python凭借其丰富的第三方库生态,成为解决PDF文本提取的首选语言。

Python PDF案例如何读取PDF文本内容

相比手动复制粘贴,Python脚本可实现:

  • 批量处理:同时解析数百个PDF文件
  • 结构化提取、段落、表格层级
  • 跨平台兼容:Windows/Mac/Linux统一运行

必备工具与库:PyPDF2、pdfplumber、pdfminer.six

库名称 核心优势 适用场景 安装命令
PyPDF2 轻量、快速,支持提取元数据 纯文本PDF,不需要复杂布局 pip install PyPDF2
pdfplumber 保留页面坐标与表格结构 带表格、多栏布局的PDF pip install pdfplumber
pdfminer.six 高度定制化,支持中文等复杂字符 多语言、非标准编码PDF pip install pdfminer.six

选型建议

  • 如果PDF是“文字型”(非扫描),优先尝试PyPDF2pdfplumber
  • 若提取结果出现乱码或缺失字符,切换至pdfminer.six
  • 扫描PDF(图片格式)需配合OCR工具(如pytesseract)。

实战案例一:使用PyPDF2提取纯文本

基础代码

import PyPDF2
def extract_text_pypdf2(pdf_path):
    text = ""
    with open(pdf_path, 'rb') as file:
        reader = PyPDF2.PdfReader(file)
        for page_num in range(len(reader.pages)):
            page = reader.pages[page_num]
            text += page.extract_text()
    return text
print(extract_text_pypdf2("sample.pdf"))

关键点

  • PdfReader替代了老版本的PdfFileReader,兼容性更好。
  • 部分PDF因字体编码问题可能返回空字符串,此时可尝试strict=True参数。

小技巧

# 仅提取前5页,节省时间
for page in reader.pages[:5]:
    text += page.extract_text()

实战案例二:使用pdfplumber保留表格与布局

保留段落与坐标

import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
    for page in pdf.pages:
        # 提取文本并保留换行符
        text = page.extract_text(layout=True)
        print(text)
        # 提取表格(返回为列表字典)
        tables = page.extract_tables()
        for table in tables:
            for row in table:
                print(row)

处理多栏PDF

# 通过设定栏宽参数分段提取
width = page.width
left_col = page.within_bbox((0, 0, width/2, page.height))
right_col = page.within_bbox((width/2, 0, width, page.height))

应用场景
学术论文(两栏格式)、财务报表(多列表格)、简历(固定位置字段)。


实战案例三:处理扫描版PDF(OCR方案)

扫描版PDF本质上是图片集合,需先提取图片再执行OCR(光学字符识别)。

三步走方法

  1. 从PDF提取图片:使用pypdfium2pdf2image
  2. 图片预处理:灰度化、二值化、降噪(OpenCV)
  3. OCR识别pytesseract + Tesseract引擎

完整代码示例

from pdf2image import convert_from_path
import pytesseract
def ocr_pdf(pdf_path):
    images = convert_from_path(pdf_path, dpi=300)
    full_text = ""
    for img in images:
        # 预处理:转为灰度
        gray = img.convert('L')
        text = pytesseract.image_to_string(gray, lang='chi_sim+eng')
        full_text += text + "\n"
    return full_text
print(ocr_pdf("scanned_doc.pdf"))

注意事项

  • 需安装Tesseract-OCR引擎(Mac: brew install tesseract,Win: 下载exe)
  • 中文OCR需下载中文语言包:chi_sim

常见问题与性能优化建议

问题1:提取内容为空或乱码

  • 原因:PDF编码非标准(如CJK字符),或使用了自定义字体。
  • 解决
    # pdfminer.six方案
    from pdfminer.high_level import extract_text
    text = extract_text(pdf_path, password='', page_numbers=[0,1])

问题2:处理速度慢

  • 优化技巧
    1. 只处理需要的页面:reader.pages[start:end]
    2. 使用pdfplumber时关闭表格检测:page.extract_text(keep_blank_chars=True)
    3. 对大文件启用流式读取:PdfReader(pdf_path, strict=False)

问题3:提取结果格式混乱

  • 修复方法
    # 合并多余空格与换行
    import re
    clean_text = re.sub(r'\n+', '\n', text)
    clean_text = re.sub(r' {2,}', ' ', clean_text)

Q&A:你关心的PDF读取难题

Q1:如何从PDF中提取特定关键字所在段落?

A:先提取全文,再用正则定位,示例:

import re
text = extract_text_pypdf2("contract.pdf")
# 查找“甲方”之后的100个字符
match = re.search(r'甲方(.{100})', text, re.DOTALL)
if match:
    print(match.group(1))

Q2:PyPDF2和pdfplumber哪个更快?

A:PyPDF2速度通常快20-30%,但准确率较低,若需保留表格结构,选pdfplumber;纯文本首选PyPDF2。

Q3:如何从PDF中提取图片?

A:使用pdfplumberpage.images属性获取坐标,或使用PyPDF2reader.pages[0].images遍历。

from PyPDF2 import PdfReader
reader = PdfReader("doc.pdf")
for img in reader.pages[0].images:
    with open(img.name, 'wb') as f:
        f.write(img.data)

Q4:读取加密PDF怎么办?

A:需提供密码:

reader = PdfReader("encrypted.pdf")
if reader.is_encrypted:
    reader.decrypt("password")

Q5:如何批量处理文件夹内所有PDF?

A:结合os模块:

import os
for filename in os.listdir("pdf_folder"):
    if filename.endswith(".pdf"):
        text = extract_text_pypdf2(os.path.join("pdf_folder", filename))
        with open(f"output/{filename}.txt", 'w') as f:
            f.write(text)

选择最适合你的方案

从轻量的PyPDF2到强大的pdfplumber和OCR方案,Python为PDF文本提取提供了多层次解决方案,建议根据文档类型和提取精度需求选择工具:

  • 日常报告:PyPDF2 + 正则清洗
  • 学术论文或表格:pdfplumber
  • 扫描件/历史档案:OCR组合方案

如果你遇到特定类型的PDF(如表单、带水印、旋转页面),欢迎在评论区留言,我会给出针对性代码示例。


本文首发于技术博客,转载需注明来源。

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