本文目录导读:

我来详细介绍几种读取PDF内容的Python方法:
使用 PyPDF2(推荐)
import PyPDF2
def read_pdf_pypdf2(file_path):
"""使用PyPDF2读取PDF文件"""
try:
with open(file_path, 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
text = ""
# 遍历每一页
for page_num in range(len(pdf_reader.pages)):
page = pdf_reader.pages[page_num]
text += f"\n--- 第 {page_num + 1} 页 ---\n"
text += page.extract_text()
return text
except Exception as e:
return f"读取失败: {str(e)}"
# 使用示例
content = read_pdf_pypdf2("example.pdf")
print(content)
使用 pdfplumber(表格效果好)
import pdfplumber
def read_pdf_plumber(file_path):
"""使用pdfplumber读取PDF文件"""
try:
text = ""
with pdfplumber.open(file_path) as pdf:
for i, page in enumerate(pdf.pages):
text += f"\n--- 第 {i + 1} 页 ---\n"
text += page.extract_text()
# 如果需要提取表格
tables = page.extract_tables()
if tables:
text += "表格内容:\n"
for table in tables:
for row in table:
text += " | ".join(row) + "\n"
return text
except Exception as e:
return f"读取失败: {str(e)}"
# 使用示例
content = read_pdf_plumber("example.pdf")
print(content)
使用 pdfminer.six(功能最全)
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
def read_pdf_pdfminer(file_path):
"""使用pdfminer读取PDF文件"""
try:
laparams = LAParams()
text = extract_text(file_path, laparams=laparams)
return text
except Exception as e:
return f"读取失败: {str(e)}"
# 使用示例
content = read_pdf_pdfminer("example.pdf")
print(content)
高级功能:处理扫描版PDF
对于扫描版PDF(图片格式),需要先用OCR识别:
import pytesseract
from pdf2image import convert_from_path
from PIL import Image
def read_scanned_pdf(file_path, language='chi_sim'):
"""读取扫描版PDF(需要安装tesseract-ocr)"""
try:
# 将PDF转换为图片
images = convert_from_path(file_path)
text = ""
for i, image in enumerate(images):
text += f"\n--- 第 {i + 1} 页 ---\n"
# OCR识别
page_text = pytesseract.image_to_string(image, lang=language)
text += page_text
return text
except Exception as e:
return f"读取失败: {str(e)}"
# 使用示例
content = read_scanned_pdf("scanned_doc.pdf")
完整的实用函数
import PyPDF2
import os
class PDFReader:
"""PDF读取器类"""
def __init__(self, file_path):
self.file_path = file_path
self.validate_file()
def validate_file(self):
"""验证文件是否存在"""
if not os.path.exists(self.file_path):
raise FileNotFoundError(f"文件不存在: {self.file_path}")
if not self.file_path.lower().endswith('.pdf'):
raise ValueError("文件不是PDF格式")
def read_all(self):
"""读取所有内容"""
return self.read_pages()
def read_pages(self, start_page=1, end_page=None):
"""读取指定页面的内容"""
try:
with open(self.file_path, 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
total_pages = len(pdf_reader.pages)
# 设置页码范围
if end_page is None or end_page > total_pages:
end_page = total_pages
text = ""
for page_num in range(start_page - 1, end_page):
page = pdf_reader.pages[page_num]
text += f"\n--- 第 {page_num + 1} 页 ---\n"
text += page.extract_text() + "\n"
return text
except Exception as e:
return f"读取失败: {str(e)}"
def get_metadata(self):
"""获取PDF元数据"""
try:
with open(self.file_path, 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
meta = pdf_reader.metadata
return {
'标题': meta.get('/Title', '无'),
'作者': meta.get('/Author', '无'),
'主题': meta.get('/Subject', '无'),
'页数': len(pdf_reader.pages),
'是否加密': pdf_reader.is_encrypted
}
except Exception as e:
return f"获取元数据失败: {str(e)}"
# 使用示例
if __name__ == "__main__":
# 基本使用
reader = PDFReader("document.pdf")
# 读取所有内容
full_text = reader.read_all()
print(full_text[:500]) # 打印前500个字符
# 读取指定页面
page_1_3 = reader.read_pages(1, 3)
print(page_1_3)
# 获取元数据
metadata = reader.get_metadata()
for key, value in metadata.items():
print(f"{key}: {value}")
安装依赖
# 基础版本 pip install PyPDF2 # 更好的表格处理 pip install pdfplumber # 功能最全 pip install pdfminer.six # OCR功能(扫描版PDF) pip install pytesseract pdf2image # Windows下需要安装tesseract-ocr # 下载地址:https://github.com/UB-Mannheim/tesseract/wiki
选择建议
| 库名 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| PyPDF2 | 简单易用,无需依赖 | 中文支持一般 | 简单文本提取 |
| pdfplumber | 表格处理优秀 | 速度较慢 | 需要处理表格 |
| pdfminer.six | 功能全面,布局准确 | 安装包较大 | 复杂布局文档 |
| pdf2image+OCR | 支持扫描版 | 需要安装OCR引擎 | 图片型PDF |
选择哪个库主要取决于你的PDF类型和需求,对于大多数场景,推荐使用 PyPDF2 或 pdfplumber。