目录:
PyMuPDF 用于处理 PDF、XPS、EPUB 等多种文档格式的解析、转换和操作。底层使用 C 语言实现,处理大型 PDF 文件时效率显著。
安装依赖:
$ pip install pymupdf
需要注意的是安装包的名称是 pymupdf, 但是导入包的名称是 fitz:
import fitz # PyMuPDF的导入名称
如下示例: 将 PDF 中每一页转换为一张图片。
import fitz
from pathlib import Path
# pdf 路径
pdf_path = Path(__file__).parent / 'test.pdf'
# 打开 PDF 文件
doc = fitz.open(pdf_path)
# PDF 中每一页转换为一张图片
for i, page in enumerate(doc):
# 设置缩放比例,dpi=300 左右通常能获得清晰的图片
pix = page.get_pixmap(dpi=300)
pix.save(f'page_{str(i).zfill(3)}.png')
# 关闭文档
doc.close()
import fitz
def merge_pdfs(pdf_list, output_path):
merged_document = fitz.open()
for pdf_file in pdf_list:
doc = fitz.open(pdf_file)
merged_document.insert_pdf(doc)
doc.close() # 及时关闭以节省内存
merged_document.save(output_path)
merged_document.close()
files = [ 'a.pdf', 'b.pdf', 'c.pdf' ]
merge_pdfs(files, 'merged_file.pdf')
output_folder 输出目录如果没有创建会报错,可以手动创建后再
from pathlib import Path
import fitz # PyMuPDF
def split_pdf_by_page(input_pdf_path, output_folder):
# 输出目录不存在就先创建目录
if not Path(output_folder).exists():
Path(output_folder).mkdir(parents=True, exist_ok=True)
pdf_document = fitz.open(input_pdf_path)
# 遍历每一页
for page_num in range(pdf_document.page_count):
# 创建一个新的空白PDF文档
new_pdf = fitz.open()
# 将当前页插入新文档
new_pdf.insert_pdf(pdf_document, from_page=page_num, to_page=page_num)
# 构建输出路径并保存
output_path = f"{output_folder}/Page_{page_num + 1}.pdf"
new_pdf.save(output_path)
new_pdf.close() # 关闭新文档以释放资源
pdf_document.close()
# 使用示例
split_pdf_by_page('demo.pdf', './output')
比如想要一个 20 页的 PDF 中只提取 4-6 页作为单独的 PDF,这个示例就非常有用。
from pathlib import Path
import fitz
def split_pdf_by_range(input_pdf_path, output_folder, page_ranges):
"""
按指定页码范围列表拆分PDF。
page_ranges: 一个列表,每个元素是一个元组 (起始页, 结束页),页码为从1开始。
"""
# 输出目录不存在就先创建目录
if not Path(output_folder).exists():
Path(output_folder).mkdir(parents=True, exist_ok=True)
pdf_document = fitz.open(input_pdf_path)
for i, (start_page, end_page) in enumerate(page_ranges, start = 1):
new_pdf = fitz.open()
# 插入指定页码范围(转换为从 0 开始的索引)
new_pdf.insert_pdf(pdf_document, from_page=start_page - 1, to_page=end_page - 1)
output_path = f"{output_folder}/Part_{i}.pdf"
new_pdf.save(output_path)
new_pdf.close()
pdf_document.close()
page_ranges = [(1, 5), (10, 13)]
split_pdf_by_range('demo.pdf', './output', page_ranges)
↶ 返回首页 ↶