boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

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


avatar
作者 2025年8月31日 11

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

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

2. 代码实现

以下代码演示了如何使用 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 文件具有完整的导航功能。 本教程提供了一个基本的示例,您可以根据实际需求进行修改和扩展。




评论(已关闭)

评论已关闭

text=ZqhQzanResources