【python】PyMuPDF操作pdf
PyMuPDF,也被称为fitz(这是其导入时的常用别名),是一个功能强大的Python库,用于处理PDF和其他文档格式。与 PyPDF2相比,PyMuPDF提供了更多的功能和更好的性能,特别是在处理复杂的PDF文件时。
安装PyMuPDF
首先,你需要安装PyMuPDF库。你可以使用pip来安装它:
pip install pymupdf
读取PDF文件
读取PDF文件并打印其页数:
import fitz
# 使用pymupdf读取pdf文件
if __name__ == '__main__':
# 打开 PDF 文件
doc = fitz.open('example.pdf')
print(doc.page_count)
提取文本
从PDF文件中提取文本:
import fitz
# 使用Pymupdf读取pdf文本
if __name__ == '__main__':
# 打开 PDF 文件
doc = fitz.open('example1.pdf')
print(doc.load_page(0).get_text())
拆分PDF文件
将PDF文件拆分为两个文件,一个文件包含奇数页,一个文件包含偶数页:
import fitz
# 使用pymupdf将PDF文件拆分为两个文件,一个文件包含奇数页,一个文件包含偶数页:
if __name__ == '__main__':
# 创建一个 PDF 写入器对象
odd_writer = fitz.open()
even_writer = fitz.open()
doc = fitz.open('example.pdf')
for page_num in range(doc.page_count):
if page_num % 2 == 0:
odd_writer.insert_pdf(doc, from_page=page_num, to_page=page_num)
else:
even_writer.insert_pdf(doc, from_page=page_num, to_page=page_num)
odd_writer.save('example1.pdf')
even_writer.save('example2.pdf')
合并PDF文件
你可以将多个PDF文件合并为一个:
import fitz
# 使用PymuPDF合并两个pdf文件
if __name__ == '__main__':
# 打开要合并的 PDF 文件
pdf_files = ['example1.pdf', 'example2.pdf']
# 创建一个新的 PDF 文档对象
merged_doc = fitz.open()
# 遍历每个要合并的 PDF 文件
for pdf_file in pdf_files:
# 打开当前的 PDF 文件
temp_doc = fitz.open(pdf_file)
# 将当前 PDF 文件的所有页面添加到合并后的文档中
for page_num in range(len(temp_doc)):
merged_doc.insert_pdf(temp_doc, from_page=page_num, to_page=page_num)
# 关闭当前的 PDF 文件(不需要保存,因为我们只是读取它)
temp_doc.close()
# 保存合并后的 PDF 文件
merged_doc.save("merged.pdf")
裁剪PDF页面
PyPDF2并不直接支持裁剪页面,但你可以通过提取页面的部分内容并创建一个新的页面来实现这一功能。以下是一个简单的示例,演示如何裁剪页面的上半部分:
import fitz
# 使用pymupdf裁剪PDF页面
if __name__ == '__main__':
# 打开 PDF 文件
doc = fitz.open("example.pdf")
# 选择要裁剪的页面(例如第一页)
page = doc.load_page(0)
# 定义裁剪区域(矩形,格式为 [x0, y0, x1, y1])
# 这里我们裁剪页面的上半部分
rect = [page.rect.x0, page.rect.y0, page.rect.x1, page.rect.y0 + (page.rect.height / 2)]
# 裁剪页面(这会改变原始页面)
page.set_cropbox(rect)
page.clean_contents() # 清理页面内容(可选,但推荐)
# 保存修改后的 PDF 文件
doc.save("cropped_example.pdf")
加密PDF
import fitz
# 使用PyPDF2加密pdf
if __name__ == '__main__':
doc = fitz.open("example.pdf")
# 设置加密参数
doc.save(
"encrypted.pdf",
encryption=fitz.PDF_ENCRYPT_AES_256, # 加密算法
user_pw="password123", # 用户密码(打开密码)
owner_pw="password123", # 所有者密码
permissions=0b1111000000, # 权限标志
garbage=3, # 清理冗余数据
deflate=True, # 压缩内容
)
与pypdf2的比较
PyPDF2:
-
基础操作:专注于PDF的合并、拆分、页面旋转、加密/解密、添加水印等基础功能。
-
文本提取:支持简单文本提取,但对复杂布局(如双栏排版、表格)的支持较弱,可能破坏文本顺序。
-
轻量级:适合轻量级任务,如快速合并多个文档或添加密码保护。
-
大文件处理:处理大文件(如7000页以上)时速度较慢(需数百秒),内存占用较高。
-
复杂文档兼容性:对含复杂图形、表单或加密文件的处理可能失败,文本提取易出现乱码。
PyMuPDF:
-
全能处理:支持PDF的读取、编辑、合并、拆分,同时能提取文本、图像、表格,甚至支持OCR识别和PDF转图像。
-
高级功能:可解析表格(保留列表结构)、处理注释和表单、生成PDF/A格式文档,以及通过Tesseract集成实现OCR。
-
多格式支持:兼容PDF、XPS、CBZ等格式,适用场景更广泛。
-
大文件处理:基于MuPDF引擎,采用优化算法,处理同样文件仅需几秒,支持多线程加速,渲染图像效率更高。
-
复杂文档兼容性:在处理扫描件、加密文档时表现更稳定,且能保留双栏文本的原始顺序