在 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 的最大潜力,实现高效、自动化的文档处理流程。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
您必须登录才能参与评论!
立即登录
PyMuPDF 为什么库名叫 fitz 呢?
收藏了,感谢分享