【python 第三方库】PyMuPDF

2024-01-25 00:00:00

目录:

PyMuPDF 模块介绍

PyMuPDF 用于处理 PDF、XPS、EPUB 等多种文档格式的解析、转换和操作。底层使用 C 语言实现,处理大型 PDF 文件时效率显著。

安装依赖:

$ pip install pymupdf

需要注意的是安装包的名称是 pymupdf, 但是导入包的名称是 fitz:

import fitz     # PyMuPDF的导入名称

PDF 转图片

如下示例: 将 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()

将多个 PDF 合并为一个 PDF

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')

将一个 PDF 按单页拆分为多个 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')

将一个 PDF 按指定页码范围拆分为多个 PDF

比如想要一个 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)

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: