# 使用 PyMuPDF 按页码范围分割 PDF 并保留目录(页码.分割.保留.目录.PyMuPDF...)

wufei123 发布于 2025-09-02 阅读(5)

# 使用 PyMuPDF 按页码范围分割 PDF 并保留目录

本文档介绍如何使用 PyMuPDF 库,根据指定的页码范围分割 PDF 文件,并在分割后的 PDF 文件中保留对应的目录 (Table of Contents)。我们将详细讲解如何提取、修改和应用目录,以确保分割后的文档具有完整的导航功能。同时,也会针对目录结构的特殊规则进行说明,并提供相应的解决方案,确保生成的 PDF 文件符合标准。 ## 使用 PyMuPDF 分割 PDF 并保留目录 在处理大型 PDF 文档时,有时需要将其分割成更小的部分,以便于管理和分发。如果原始 PDF 文档包含目录,那么在分割后的文档中保留相应的目录信息就显得尤为重要。PyMuPDF (fitz) 库提供了强大的 PDF 处理功能,可以方便地实现这一目标。 ### 1. 安装 PyMuPDF 首先,需要安装 PyMuPDF 库。可以使用 pip 命令进行安装: ```bash pip install pymupdf2. 代码实现

以下代码演示了如何使用 pymupdf 分割 pdf 文件,并根据页码范围保留对应的目录:

import fitz

def split_pdf_with_toc(input_pdf_path, output_folder, page_ranges):
    """
    分割 PDF 文件,并保留对应页码范围的目录。

    Args:
        input_pdf_path (str): 输入 PDF 文件的路径。
        output_folder (str): 输出文件夹的路径。
        page_ranges (list): 一个包含元组的列表,每个元组表示一个页码范围 (起始页码, 结束页码)。
    """

    pdf_document = fitz.open(input_pdf_path)
    original_toc = pdf_document.get_toc()

    for i, (start_page, end_page) in enumerate(page_ranges, start=1):
        chapter_pdf = fitz.open()
        chapter_pdf.insert_pdf(pdf_document, from_page=start_page - 1, to_page=end_page - 1)

        # 提取对应页码范围的目录
        chapter_toc = []
        for level, title, page in original_toc:
            if start_page <= page <= end_page:
                chapter_toc.append([level, title, page - start_page + 1]) # 更新页码

        # 处理目录结构,确保符合规范
        if chapter_toc:
            if chapter_toc[0][0] != 1:
                # 添加 dummy items 直到 level 为 1
                current_level = chapter_toc[0][0]
                for j in range(1, current_level):
                    chapter_toc.insert(0, [j, "dummy", 1])

        chapter_pdf.set_toc(chapter_toc)

        output_pdf_path = f"{output_folder}/Chapter_{i}.pdf"
        chapter_pdf.save(output_pdf_path)
        chapter_pdf.close()

    pdf_document.close()

# 示例用法
input_pdf_path = "input.pdf" # 替换为你的输入 PDF 文件路径
output_folder = "output"      # 替换为你的输出文件夹路径
page_ranges = [(1, 50), (51, 100)] # 指定要分割的页码范围
split_pdf_with_toc(input_pdf_path, output_folder, page_ranges)
3. 代码解释
  • split_pdf_with_toc(input_pdf_path, output_folder, page_ranges) 函数:
    • 接受输入 PDF 文件路径、输出文件夹路径和页码范围列表作为参数。
    • 打开输入的 PDF 文件,并使用 pdf_document.get_toc() 获取原始目录。
    • 遍历页码范围列表,为每个范围创建一个新的 PDF 文件。
    • 使用 chapter_pdf.insert_pdf() 将指定页码范围的内容插入到新的 PDF 文件中。
    • 遍历原始目录,提取对应页码范围的目录项,并更新页码,使其在新 PDF 文件中有效。
    • 目录结构处理: 检查提取的目录,如果第一个目录项的层级 (level) 不是 1,则添加 "dummy" 条目,直到层级为 1,以符合 PyMuPDF 的目录结构要求。
    • 使用 chapter_pdf.set_toc() 将新的目录应用到分割后的 PDF 文件中。
    • 保存分割后的 PDF 文件,并关闭文件。
    • 关闭原始 PDF 文件。
4. 注意事项
  • 目录结构规则: PyMuPDF 对目录结构有严格的要求。目录项必须按照层级顺序排列,且第一个目录项的层级必须为 1。如果提取的目录不符合这些规则,需要进行调整,例如添加 "dummy" 条目。
  • 页码更新: 在提取目录时,需要更新页码,使其在新 PDF 文件中有效。
  • 异常处理: 在实际应用中,建议添加异常处理机制,以处理文件不存在、权限不足等问题。
  • 性能优化: 对于大型 PDF 文件,分割过程可能比较耗时。可以考虑使用多线程或多进程来提高分割效率。
5. 总结

使用 PyMuPDF 可以方便地分割 PDF 文件,并保留对应的目录信息。通过理解 PyMuPDF 的目录结构规则,并进行相应的处理,可以确保分割后的 PDF 文件具有完整的导航功能。 本教程提供了一个基本的示例,您可以根据实际需求进行修改和扩展。

 

以上就是# 使用 PyMuPDF 按页码范围分割 PDF 并保留目录的详细内容,更多请关注知识资源分享宝库其它相关文章!

标签:  页码 分割 保留 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。