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

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

本文档旨在提供一个使用 PyMuPDF 库分割 PDF 文件并保留对应目录的教程。我们将介绍如何提取原始 PDF 的目录,针对分割后的每个部分,调整目录结构以符合 PyMuPDF 的规范,并将调整后的目录添加到分割后的 PDF 文件中,确保分割后的文档仍然具有完整的导航功能。### 前提条件确保已经安装了 PyMuPDF 库。如果没有安装,可以使用 pip 进行安装:“`bashpip install pymupdf

提取目录

首先,我们需要从原始 pdf 文件中提取目录。pymupdf 提供了 document.get_toc() 方法来获取目录信息。目录信息以嵌套列表的形式返回,每个子列表代表一个目录项,包含层级、标题和页码。

import fitzdef extract_toc(input_pdf_path):    """    从 PDF 文件中提取目录。    Args:        input_pdf_path (str): 输入 PDF 文件的路径。    Returns:        list: 目录列表,每个元素是一个包含层级、标题和页码的列表。    """    pdf_document = fitz.open(input_pdf_path)    toc = pdf_document.get_toc()    pdf_document.close()    return toc

分割 PDF 并调整目录

接下来,我们需要根据指定的页码范围分割 PDF 文件,并为每个分割后的文件调整目录。关键在于,分割后的每个 PDF 的目录必须符合 PyMuPDF 的目录规则:

第一个目录项的层级必须为 1。后续目录项的层级只能与前一个目录项相同、高一级或低于前一个目录项。

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):        # 创建新的 PDF 文件        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:            first_level = chapter_toc[0][0]            if first_level != 1:                for j in range(1, first_level):                    chapter_toc.insert(0, [j, "dummy", 1])        # 设置目录        chapter_pdf.set_toc(chapter_toc)        # 保存新的 PDF 文件        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, 10), (11, 20), (21, 30)]  # 定义页码范围split_pdf_with_toc(input_pdf_path, output_folder, page_ranges)

在这个例子中,我们将 input.pdf 文件分割成三个部分,分别包含第 1-10 页、第 11-20 页和第 21-30 页。分割后的文件将保存在 output 文件夹中,文件名分别为 Chapter_1.pdf、Chapter_2.pdf 和 Chapter_3.pdf。每个分割后的 PDF 文件都将包含与其内容对应的目录。

注意事项

页码计算: 在调整目录时,需要重新计算分割后 PDF 文件的页码。目录规则: 确保调整后的目录符合 PyMuPDF 的规则,否则可能导致目录显示不正确。错误处理: 在实际应用中,应该添加适当的错误处理机制,例如处理文件不存在、页码范围无效等情况。目录提取的准确性: 某些PDF可能存在目录结构复杂或不规范的情况,提取的目录可能不完全准确,需要根据实际情况进行调整。

总结

通过使用 PyMuPDF 库,我们可以方便地分割 PDF 文件并保留目录。关键在于理解 PyMuPDF 的目录规则,并根据这些规则调整分割后 PDF 文件的目录结构。希望本教程能够帮助你更好地处理 PDF 文件。


以上就是使用 PyMuPDF 按页码范围分割 PDF 并保留目录的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369397.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
分割PDF并动态生成目录(TOC)的PyMuPDF专业指南
上一篇 2025年12月14日 09:37:54
高效拆分PDF并精确保留目录结构(PyMuPDF教程)
下一篇 2025年12月14日 09:38:01

相关推荐

  • Golang安装及环境验证命令详解

    安装Go需根据操作系统选择对应包并正确配置PATH;2. 通过go version、go env验证安装;3. 运行hello.go测试程序确认环境正常。 Go语言(Golang)的安装和环境验证是开始开发前的关键步骤。正确配置后,才能顺利编写和运行Go程序。下面介绍如何安装Go,并通过命令行验证环…

    2025年12月15日
    000
  • Golangreader writer锁在并发中的应用

    RWMutex适用于读多写少场景,通过RLock/RUnlock允许多个读操作并发,Lock/Unlock保证写操作独占,提升并发性能。 在Go语言中,sync.RWMutex 是一种重要的同步机制,适用于读多写少的并发场景。它通过区分读锁和写锁,提升程序在高并发下的性能表现。 读写锁的基本原理 R…

    2025年12月15日
    100
  • Golangsync.WaitGroup并发任务同步技巧

    WaitGroup通过计数器协调并发任务,Add在启动前增加计数,Done在协程结束时减1,Wait阻塞主协程直至计数归零,需避免在goroutine中调用Add或重复使用未重置的WaitGroup,结合context可实现超时控制,确保程序健壮性。 在Go语言中,sync.WaitGroup 是处…

    2025年12月15日
    000
  • Golang使用context管理网络请求生命周期

    Context用于管理Go中请求的生命周期,传递取消信号、超时控制和请求数据。通过r.Context()获取并传递上下文,可设置超时如WithTimeout控制请求时长,使用WithValue传递元数据如用户ID,同时通过ctx.Done()监听取消信号,确保goroutine及时退出,避免资源浪费…

    2025年12月15日
    000
  • Golang微服务CI/CD流水线实现示例

    Golang微服务CI/CD流水线的核心组成部分包括代码仓库管理、持续集成、容器化、镜像管理和持续部署。开发者提交代码至Git仓库后,CI工具(如GitLab CI)自动触发流水线:首先通过Go模块下载依赖并编译二进制文件完成构建;接着运行单元测试和集成测试确保质量;随后使用多阶段Dockerfil…

    2025年12月15日
    100
  • Golang反射与注解标签解析结合实践

    利用Golang反射解析自定义结构体标签,需通过reflect.TypeOf获取类型信息,遍历字段并提取StructField中的Tag,使用Tag.Get(key)获取指定键的标签值;当标签包含复杂结构(如db:”column:user_id;type:int”)时,需进一…

    2025年12月15日
    100
  • Go语言包管理:自定义GOPATH实现本地化安装与环境隔离

    本文详细介绍了如何通过配置GOPATH环境变量,实现Go语言包的本地化安装与环境隔离。通过将go get下载的包安装到自定义目录,开发者可以避免污染系统默认的Go安装路径,从而更好地管理全局工具和旧版项目依赖,保持开发环境的整洁与高效。 理解Go语言的工作区与GOPATH 在go语言中,gopath…

    2025年12月15日
    000
  • Golang在微服务中错误传递与记录

    微服务中Golang错误处理需兼顾可观测性与用户体验:内部通过errors.Wrap和context传递带上下文的错误链,结合slog等结构化日志记录traceID、用户ID等关键信息,实现精准追踪;对外则通过标准化gRPC status或HTTP JSON响应,将错误转换为安全、简洁、含关联ID的…

    2025年12月15日
    000
  • Golang开发小型购物车管理系统

    答案:使用Golang开发小型购物车系统,通过分层架构(API、服务、数据层)和清晰的数据模型实现高效、可维护的业务逻辑。利用Goroutines和Channels处理高并发请求,结合关系型数据库(如PostgreSQL)保证数据一致性,并在性能瓶颈时引入Redis提升读写效率;通过RESTful …

    2025年12月15日
    000
  • Golang容器镜像安全扫描与优化方法

    Golang容器镜像的安全与优化需构建从开发到部署的完整信任链,核心是通过持续漏洞扫描和最小化镜像策略降低风险。首先,Go语言虽具静态编译优势,但容器化后仍面临基础镜像漏洞、依赖污染和配置问题,因此必须重视全链路安全。为实现“安全左移”,应将扫描工具集成至CI/CD各阶段:提交代码时用gosec检测…

    2025年12月15日
    000
  • Golang类型转换与兼容性处理技巧

    Go语言中显式类型转换是必要的,因其强调类型安全与明确性,要求开发者主动处理数据类型间的转换,如基本类型间需用float64(myInt)形式转换,字符串与数字间依赖strconv包,并返回错误以提示失败。其风险包括数据溢出(如int64转int32)、精度丢失(浮点转整数)、运行时panic(类型…

    2025年12月15日
    000
  • GolangRPC接口设计与自动生成示例

    首先使用Protobuf定义gRPC接口并生成Go代码,接着实现UserService服务端逻辑,最后编写客户端调用GetUser方法获取用户信息。 在微服务架构中,RPC(远程过程调用)是服务间通信的核心方式之一。Golang 以其高性能和简洁的并发模型,成为构建 RPC 服务的热门选择。结合 P…

    2025年12月15日
    000
  • 从XML中提取图片链接:Go语言教程

    本文介绍如何使用Go语言从XML或HTML文档中提取图片链接。通过exp/html包解析HTML结构,并遍历节点找到目标标签,最终获取src属性值。本文提供代码示例,演示了如何解析HTML并提取图片链接,并讨论了使用exp/html包的注意事项。 Go语言标准库中的encoding/xml包主要用于…

    2025年12月15日
    000
  • 从 XML 解码 HTML 图片链接:Go 语言实践教程

    本教程旨在介绍如何使用 Go 语言从包含 HTML 片段的 XML 数据中提取图片链接。我们将探讨使用 exp/html 包解析 HTML 结构,并展示如何通过遍历节点树来定位并获取 img 标签的 src 属性值。通过示例代码,你将学会如何有效地处理 HTML 数据,提取所需信息。 在 Go 语言…

    2025年12月15日
    000
  • 使用 Go 进行 XML 反序列化提取 HTML 图片链接

    本文介绍了如何使用 Go 语言解析 HTML 文档,并提取其中 标签的 src 属性值。我们将探讨使用 exp/html 包来解析 HTML 结构,并展示如何通过遍历节点树来定位目标属性,从而实现图片链接的提取。本文旨在为 Go 开发者提供一种解析 HTML 并提取特定信息的实用方法。 使用 exp…

    2025年12月15日
    000
  • 深入理解 Go 语言之旅:常见问题与解析

    本文旨在帮助初学者更好地理解和掌握 Go 语言,特别是针对官方教程 “A Tour of Go” 中一些容易产生困惑的点进行详细的解释和示例说明,涵盖了常量、类型声明、零值、内存分配、内置函数、格式化输出、错误处理等方面,旨在扫清学习障碍,提升 Go 语言编程能力。 常量与类…

    2025年12月15日
    000
  • Golang标准库常见函数错误处理实践

    Golang错误处理通过多返回值返回结果和error,调用后需立即检查err是否为nil;使用errors.New、fmt.Errorf创建错误,os包函数判断特定错误,可自定义error类型实现Error方法;通过context控制超时与取消,defer确保资源释放,panic仅用于不可恢复错误。…

    2025年12月15日
    000
  • Golangencoding/json解析与生成JSON数据

    Go语言通过encoding/json包实现JSON处理,使用Marshal和Unmarshal进行结构体与JSON的相互转换;结构体字段需首字母大写才能导出,通过json标签定义键名、omitempty控制空值忽略、-忽略序列化;支持格式化输出与动态解析到map或interface{},适用于固定…

    2025年12月15日
    100
  • Golang使用VSCode调试Go程序实践

    首先安装Go SDK、VSCode Go扩展和Delve调试器,然后在项目根目录创建.vscode/launch.json配置文件,设置断点后按F5启动调试,可实现变量查看、调用栈分析及步进操作,配合args和env字段支持参数传递与环境变量设置。 在Go语言开发中,VSCode是一个轻量又高效的选…

    2025年12月15日
    000
  • Golang指针比较与相等判断方法

    Go中指针通过==和!=比较地址是否相同或是否为nil,仅当指向同一变量或同为nil时相等;不同类型指针不可直接比较,结构体指针需解引用才能判断内容相等,未初始化指针默认为nil,应先判空再解引用。 在Go语言中,指针的比较和相等判断是常见操作,尤其在处理复杂数据结构或需要判断内存地址是否一致时。理…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信