深入了解 PyMuPDF:Python 处理 PDF 的全能工具

在 Python 的生态系统中,PyMuPDF 是一个功能强劲且用途广泛的库,专门用于处理 PDF 文件。无论是提取文本、图像,还是对 PDF 进行页面操作、格式转换等,PyMuPDF 都能提供高效且便捷的解决方案。接下来,让我们全方位探索 PyMuPDF 的各种功能。

一、安装 PyMuPDF

在开始使用之前,需要先安装 PyMuPDF 库。可以使用 pip 进行安装:

bash

pip install PyMuPDF

二、读取 PDF 内容

1. 提取文本

PyMuPDF 最常见的用途之一就是从 PDF 文件中提取文本。以下是一个简单的示例:

python

import fitz  # PyMuPDF的导入方式

def extract_text_from_pdf(pdf_path):
    doc = fitz.open(pdf_path)
    text = ""
    for page_num in range(doc.page_count):
        page = doc[page_num]
        text += page.get_text()
    doc.close()
    return text

pdf_path = "example.pdf"
extracted_text = extract_text_from_pdf(pdf_path)
print(extracted_text)

在上述代码中:

  • fitz.open(pdf_path)打开指定路径的 PDF 文件,返回一个文档对象。
  • 通过遍历文档的每一页(doc.page_count获取总页数),使用page.get_text()方法提取每页的文本内容,并累加到text变量中。
  • 最后关闭文档,并返回提取的完整文本。

2. 提取图像

除了文本,PyMuPDF 还能从 PDF 中提取图像。示例如下:

python

import fitz
import os

def extract_images_from_pdf(pdf_path, output_dir):
    doc = fitz.open(pdf_path)
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for page_num in range(doc.page_count):
        page = doc[page_num]
        images = page.get_images()
        for img_index, img in enumerate(images):
            xref = img[0]
            base_image = doc.extract_image(xref)
            image_bytes = base_image["image"]
            image_ext = base_image["ext"]
            image_name = f"page_{page_num + 1}_img_{img_index + 1}.{image_ext}"
            image_path = os.path.join(output_dir, image_name)
            with open(image_path, "wb") as f:
                f.write(image_bytes)
    doc.close()

pdf_path = "example.pdf"
output_dir = "extracted_images"
extract_images_from_pdf(pdf_path, output_dir)

这里:

  • 第一检查输出目录是否存在,不存在则创建。
  • 遍历每一页,使用page.get_images()获取该页的所有图像信息。
  • 对于每个图像,通过doc.extract_image(xref)提取图像数据,包括图像字节和扩展名。
  • 将图像数据写入到指定目录下的文件中。

三、页面操作

1. 合并 PDF

PyMuPDF 可以将多个 PDF 文件合并为一个。以下是实现代码:

python

import fitz

def merge_pdfs(pdf_paths, output_path):
    merged_doc = fitz.open()
    for pdf_path in pdf_paths:
        doc = fitz.open(pdf_path)
        merged_doc.insert_pdf(doc)
        doc.close()
    merged_doc.save(output_path)
    merged_doc.close()

pdf_paths = ["pdf1.pdf", "pdf2.pdf"]
output_path = "merged.pdf"
merge_pdfs(pdf_paths, output_path)

在这段代码中:

  • 创建一个新的空文档merged_doc。
  • 遍历每个要合并的 PDF 文件路径,打开对应的 PDF 文档,并使用insert_pdf方法将其插入到新文档中。
  • 最后保存并关闭合并后的文档。

2. 拆分 PDF

拆分 PDF 也是 PyMuPDF 的一项实用功能。例如,将一个 PDF 按页面拆分成多个 PDF 文件:

python

import fitz
import os

def split_pdf(pdf_path, output_dir):
    doc = fitz.open(pdf_path)
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for page_num in range(doc.page_count):
        new_doc = fitz.open()
        new_doc.insert_pdf(doc, from_page=page_num, to_page=page_num)
        output_path = os.path.join(output_dir, f"page_{page_num + 1}.pdf")
        new_doc.save(output_path)
        new_doc.close()
    doc.close()

pdf_path = "example.pdf"
output_dir = "split_pdfs"
split_pdf(pdf_path, output_dir)

此代码:

  • 检查输出目录,不存在则创建。
  • 遍历原 PDF 的每一页,为每一页创建一个新的 PDF 文档,并将该页插入新文档,然后保存。

四、其他功能

1. 加密与解密 PDF

PyMuPDF 可以对 PDF 文件进行加密和解密操作。以下是加密 PDF 的示例:

python

import fitz

def encrypt_pdf(pdf_path, output_path, password):
    doc = fitz.open(pdf_path)
    doc.save(output_path, encryption=fitz.PDF_ENCRYPT_AES_256, user_pw=password)
    doc.close()

pdf_path = "example.pdf"
output_path = "encrypted.pdf"
password = "mypassword"
encrypt_pdf(pdf_path, output_path, password)

解密 PDF 的操作类似,只需在打开加密 PDF 时提供密码:

python

import fitz

def decrypt_pdf(pdf_path, output_path, password):
    doc = fitz.open(pdf_path, password=password)
    doc.save(output_path)
    doc.close()

pdf_path = "encrypted.pdf"
output_path = "decrypted.pdf"
password = "mypassword"
decrypt_pdf(pdf_path, output_path, password)

2. 转换 PDF 格式

虽然 PyMuPDF 主要专注于 PDF 处理,但它也能在必定程度上实现 PDF 格式的转换,列如将 PDF 转换为图像格式(如 PNG)。以下是将 PDF 第一页转换为 PNG 图像的示例:

python

import fitz

def pdf_to_png(pdf_path, output_path):
    doc = fitz.open(pdf_path)
    page = doc[0]
    pix = page.get_pixmap()
    pix.save(output_path)
    doc.close()

pdf_path = "example.pdf"
output_path = "page1.png"
pdf_to_png(pdf_path, output_path)

PyMuPDF 为 Python 开发者提供了全面且强劲的 PDF 处理能力。无论是处理日常办公文档,还是进行复杂的文档处理任务,它都能满足需求。通过不断探索和实践 PyMuPDF 的各种功能,我们可以在 PDF 处理领域发挥出 Python 的最大潜力,实现高效、自动化的文档处理流程。

© 版权声明

相关文章

2 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    赤霄厨 投稿者

    PyMuPDF 为什么库名叫 fitz 呢?

    无记录
  • 头像
    不失礼de漂泊生长鸭 读者

    收藏了,感谢分享

    无记录