杰瑞科技汇

Python标准库如何处理PDF?

Python 的标准库中没有一个叫做 hormanHorman 的模块。

Python标准库如何处理PDF?-图1
(图片来源网络,侵删)

您很可能指的是 PyPDF2 这个非常流行的第三方库,因为它经常被用于处理 PDF,并且在很多教程和项目中与 Python 的标准库功能(如文件操作 os、数据结构 json 等)结合使用,它的名字发音可能与 "Horman" 有些相似,导致了这个可能的混淆。

我将分两部分来回答您的问题:

  1. Python 标准库中与 PDF 相关的功能(非常有限)
  2. 使用 PyPDF2 库(最常用的基础 PDF 处理库)进行详细讲解

第一部分:Python 标准库中的 PDF 能力

Python 的标准库本身不提供创建、读取或修改复杂 PDF 内容的功能,标准库的核心是提供语言的基础设施,而不是高级应用功能。

标准库中有一些模块可以用来生成最简单的、纯文本的 PDF 文件,这通常通过将文本写入到一个文件,并将其扩展名设置为 .pdf 来实现,这种方法生成的 PDF 文件结构非常简单,可以被大多数 PDF 阅读器打开,但它不包含格式、图片、字体等复杂元素。

Python标准库如何处理PDF?-图2
(图片来源网络,侵删)

实现这个功能的关键是 string 模块和一些基本的文件操作。

示例:使用标准库生成一个简单的文本 PDF

import string
# 1. 准备要写入的文本内容
# 我们使用 string 模块生成一些示例文本
lorem_ipsum = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Sed non risus. Suspendisse lectus tortor, dignissim sit amet,
adipiscing nec, ultricies sed, dolor.
Cras elementum ultrices diam. Maecenas ligula massa,
varius a, semper congue, euismod non, mi.
"""
# 2. 以二进制写入模式 ('wb') 打开一个文件
# 注意:扩展名是 .pdf,但内容是纯文本
with open("simple_text.pdf", "wb") as f:
    # 3. 将文本字符串编码为字节流(UTF-8编码)并写入文件
    f.write(lorem_ipsum.encode('utf-8'))
print("简单的文本 PDF 'simple_text.pdf' 已生成。")

如何验证: 运行上述代码后,你会得到一个名为 simple_text.pdf 的文件,用记事本打开它,你会看到原始的文本,用 Adobe Acrobat Reader 或其他 PDF 阅读器打开它,它会显示一个空白的 PDF 页面,但如果你尝试复制文本,就能复制出 lorem_ipsum 的内容。

标准库只能做到这种“伪 PDF”的生成,对于任何实际应用,如合并、拆分、提取文本、加密等,都必须使用第三方库。

Python标准库如何处理PDF?-图3
(图片来源网络,侵删)

第二部分:使用 PyPDF2 库(最接近“荷尔曼”功能的库)

PyPDF2 是一个纯 Python 编写的库,用于拆分、合并、裁剪和转换 PDF 文件的页面,它也可以从 PDF 中提取文本和元数据。注意:它不能直接编辑 PDF 的现有文本或图片内容(把一页的 "Hello" 改成 "World"),但可以添加新的空白页。

安装 PyPDF2

在使用之前,你需要先安装它,打开你的终端或命令行,运行:

pip install PyPDF2

核心功能详解

PyPDF2 的核心是 PdfReaderPdfWriter 类。

  • PdfReader: 用于读取一个现有的 PDF 文件。
  • PdfWriter: 用于将修改后的页面写入到一个新的 PDF 文件。

示例 1:提取 PDF 中的所有文本

这是 PyPDF2 最常用的功能之一。

import PyPDF2
# 确保你有一个名为 'example.pdf' 的文件在当前目录下
pdf_file_path = 'example.pdf'
try:
    # 1. 创建一个 PdfReader 对象
    with open(pdf_file_path, 'rb') as file: # 必须以二进制模式 'rb' 打开
        reader = PyPDF2.PdfReader(file)
        # 2. 获取 PDF 的页数
        num_pages = len(reader.pages)
        print(f"PDF 总共有 {num_pages} 页。")
        # 3. 遍历每一页并提取文本
        for page_num in range(num_pages):
            page = reader.pages[page_num]
            print(f"--- 第 {page_num + 1} 页的文本 ---")
            # extract_text() 方法会尝试提取页面上的文本
            text = page.extract_text()
            if text:
                print(text)
            else:
                print("这一页没有可提取的文本(可能是图片或扫描件)。")
            print("-" * 20)
except FileNotFoundError:
    print(f"错误:文件 '{pdf_file_path}' 未找到。")
except Exception as e:
    print(f"处理 PDF 时发生错误: {e}")

重要提示: PyPDF2 的文本提取能力有限,对于扫描的 PDF(图片型 PDF)或布局复杂的 PDF,提取效果可能很差或完全失败,对于这类文件,需要使用 OCR(光学字符识别)技术,pytesseract 库配合 pdf2image 库。

示例 2:合并两个 PDF 文件

import PyPDF2
def merge_pdfs(pdf_list, output_path):
    """
    合并多个 PDF 文件。
    :param pdf_list: PDF 文件路径列表
    :param output_path: 输出合并后的 PDF 路径
    """
    merger = PyPDF2.PdfMerger()
    for pdf in pdf_list:
        try:
            merger.append(pdf)
            print(f"已添加: {pdf}")
        except Exception as e:
            print(f"无法添加文件 {pdf}: {e}")
    # 将合并后的内容写入新文件
    with open(output_path, 'wb') as output_file:
        merger.write(output_file)
    print(f"合并完成,新文件已保存为: {output_path}")
# --- 使用示例 ---
pdf_files_to_merge = ['file1.pdf', 'file2.pdf']
output_merged_pdf = 'merged_document.pdf'
# 假设 file1.pdf 和 file2.pdf 存在
# merge_pdfs(pdf_files_to_merge, output_merged_pdf)

示例 3:拆分一个 PDF 文件(按页拆分)

import PyPDF2
import os
def split_pdf(pdf_path, output_dir='split_pages'):
    """
    将一个 PDF 拆分成单页的多个 PDF。
    :param pdf_path: 源 PDF 文件路径
    :param output_dir: 存放拆分后文件的目录
    """
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"已创建目录: {output_dir}")
    with open(pdf_path, 'rb') as file:
        reader = PyPDF2.PdfReader(file)
        for page_num in range(len(reader.pages)):
            writer = PyPDF2.PdfWriter()
            # 将当前页添加到 writer 对象中
            writer.add_page(reader.pages[page_num])
            # 定义输出文件名
            output_filename = os.path.join(output_dir, f"page_{page_num + 1}.pdf")
            # 将单页写入文件
            with open(output_filename, 'wb') as output_file:
                writer.write(output_file)
            print(f"已创建: {output_filename}")
# --- 使用示例 ---
# source_pdf = 'example.pdf'
# split_pdf(source_pdf)

示例 4:旋转 PDF 页面

import PyPDF2
def rotate_page(input_pdf_path, output_pdf_path, page_number, rotation_angle):
    """
    旋转 PDF 的指定页面。
    :param rotation_angle: 90, 180, 270, 360 (360等同于不旋转)
    """
    reader = PyPDF2.PdfReader(input_pdf_path)
    writer = PyPDF2.PdfWriter()
    # 复制所有页面,但旋转指定页
    for i in range(len(reader.pages)):
        page = reader.pages[i]
        if i == page_number:
            page.rotate(rotation_angle)
        writer.add_page(page)
    with open(output_pdf_path, 'wb') as output_file:
        writer.write(output_file)
    print(f"页面 {page_number + 1} 已旋转 {rotation_angle} 度,并保存为 {output_pdf_path}")
# --- 使用示例 ---
# rotate_page('example.pdf', 'rotated_example.pdf', page_number=0, rotation_angle=90)

总结与对比

特性 Python 标准库 PyPDF2 第三方库
核心功能 基础语言功能 PDF 处理
PDF 能力 极其有限,只能生成无格式的文本文件 强大,支持读取、合并、拆分、旋转、提取文本/元数据
文本编辑 不支持 不支持(不能修改现有文本内容)
图片/表格 不支持 不支持(不能提取或修改)
OCR 扫描件 不支持 不支持
加密/解密 不支持 支持
安装 无需安装 pip install PyPDF2
适用场景 快速生成一个可以被识别为 PDF 的文本文件 日常的 PDF 文档自动化处理,如批量合并、拆分、提取元数据等

更高级的 PDF 库

如果你的需求超出了 PyPDF2 的能力范围,可以考虑以下更强大的库:

  • pdfplumber: 基于 pdfminer.six,在 PyPDF2 的基础上,提供了更精确的文本提取和表格识别能力,对于处理结构化文档非常好用。
  • PyMuPDF (fitz): 性能极高,功能非常全面,除了 PyPDF2 的所有功能外,它还能渲染页面为图片、精确提取文本和路径、修改文本和图片、处理表单等,是目前功能最强大的 Python PDF 库之一。
  • reportlab: 用于从零开始创建复杂的 PDF 文档,你可以用它来生成包含图表、表格、自定义字体和复杂布局的报告。

希望这个详细的解释能帮助你理解 Python 中处理 PDF 的不同选项!

分享:
扫描分享到社交APP
上一篇
下一篇