Python脚本如何读取PDF内容

wen 实用脚本 1

本文目录导读:

Python脚本如何读取PDF内容

  1. 使用 PyPDF2(推荐)
  2. 使用 pdfplumber(表格效果好)
  3. 使用 pdfminer.six(功能最全)
  4. 高级功能:处理扫描版PDF
  5. 完整的实用函数
  6. 安装依赖
  7. 选择建议

我来详细介绍几种读取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类型和需求,对于大多数场景,推荐使用 PyPDF2pdfplumber

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