本文介绍Python中高性能PDF解析库PyMuPDF的核心功能,包含文本提取、图像处理、文档操作等实战代码示例。
1. PyMuPDF简介
PyMuPDF(又名fitz
)是一个轻量级且功能强大的Python库,专为PDF、XPS和电子书格式处理设计。相较于PyPDF2等库,其优势在于:
- ⚡ 超快解析速度:C语言底层实现,处理大型文件效率显著
- 🖨️ 精准渲染:支持将PDF页面转为高质量图像
- 📑 全面操作:支持文本/图像提取、注释添加、文档合并拆分等
2. 环境安装
pip install PyMuPDF
3. 核心功能实战
3.1 基础操作
import fitz
# 打开PDF文件
doc = fitz.open("example.pdf")
# 获取元数据
print(f"页数: {doc.page_count}")
print(f"作者: {doc.metadata['author']}")
# 读取第一页文本
page = doc[0]
text = page.get_text()
print(text[:500]) # 打印前500字符
3.2 图像提取
# 提取页面中的所有图片
image_list = page.get_images(full=True)
for img_index, img in enumerate(image_list):
xref = img[0]
base_image = doc.extract_image(xref)
with open(f"image_{img_index}.png", "wb") as f:
f.write(base_image["image"])
3.3 页面操作
# 旋转页面并保存新文档
page.set_rotation(90) # 顺时针旋转90度
doc.save("rotated.pdf")
# 创建新PDF并添加页面
new_doc = fitz.open()
new_page = new_doc.new_page(width=400, height=600)
new_page.insert_text((50, 50), "Hello PyMuPDF!")
new_doc.save("new_doc.pdf")
3.4 高级搜索
# 使用正则表达式搜索文本
pattern = r"\b\d{3}-\d{4}-\d{4}\b" # 匹配电话号码
matches = page.search_for(pattern)
for rect in matches:
print(f"在位置 {rect} 发现匹配内容")
4. 性能优化建议
- 逐页处理:使用
for page in doc:
而非加载全部页面 - 及时释放资源:处理完成后调用
doc.close()
- 使用文本缓存:对重复访问的文本使用
page.get_text("dict")
5. 常见问题
Q:中文显示乱码怎么办?
A:确保使用支持中文的字体,或在提取文本时指定编码:
text = page.get_text("text", flags=fitz.TEXT_PRESERVE_WHITESPACE)
Q:如何处理加密PDF?
doc = fitz.open("encrypted.pdf", password="your_password")
6. 总结
PyMuPDF凭借其卓越的性能和丰富的功能,成为PDF自动化处理的首选工具。适合以下场景:
- 📊 大规模PDF数据抽取
- 🤖 自动化文档处理流程
- 🎨 高精度PDF渲染应用
资源推荐:
- 官方文档
- GitHub仓库:pymupdf/PyMuPDF
注意事项:
- 代码测试时请使用实际PDF文件路径
- 处理敏感文档时注意隐私保护
- 部分高级功能需要v1.18.0+版本支持