Python操作PDF书签详解 - 添加、修改、提取和删除
目录
简介
使用工具
Python 向 PDF 添加书签
添加书签
添加嵌套书签
Python 修改 PDF 书签
Python 展开或折叠 PDF 书签
Python 提取 PDF 书签
Python 删除 PDF 书签
简介
PDF 书签是 PDF 文件中的导航工具,通常包含一个标题和一个跳转位置(如指定的页面或位置)。它们可以像目录一样分层显示,用户可以展开或折叠这些书签,在文档中快速找到需要的内容。从技术上看,书签是 PDF 文件结构中的大纲对象,不会改变文档内容,只是帮助用户更方便地导航。
本教程将详细介绍如何使用 Python对 PDF 文件中的书签进行操作,包括添加、更新、提取和删除等。
使用工具
要在 Python 中操作 PDF 书签,需要一个合适的PDF处理库。本文所使用的库是Spire.PDF for Python,该库支持对 PDF 书签执行多种操作,包括:
- 添加书签:为文档创建单层或嵌套书签,构建层次化导航。
- 修改书签:更新书签的标题、目标页面、位置及显示样式。
- 删除书签:清除不再需要的书签,保持文档整洁。
- 提取书签:读取并输出文档中现有书签的信息。
安装 Spire.PDF
在开始操作 PDF 书签之前,请确保您的 Python 环境中已安装 Spire.PDF。可以通过以下pip命令进行安装:
pip install spire.pdf
安装完成后,即可在Python项目中导入并调用该库的相关API。
Python 向 PDF 添加书签
添加书签
Spire.PDF提供了PdfDocument.Bookmarks.Add() 方法,用于为PDF文档添加书签。添加时,你可以自定义书签的跳转位置以及颜色和样式等属性。
添加书签的主要步骤
- 加载 PDF 文档
使用 PdfDocument 类打开已有的 PDF 文件。 - 添加书签
调用 PdfDocument.Bookmarks.Add() 方法,将书签添加到文档的书签集合中。 - 设置书签跳转位置
为书签设置目标跳转位置,例如目标页码、具体坐标位置以及缩放比例。 - 自定义书签(可选)
通过设置书签的属性,如颜色(Color)和显示样式(DisplayStyle),来调整书签文字的颜色和字体样式。 - 保存修改后的 PDF 文档
使用 PdfDocument.SaveToFile() 方法,将修改后的文档保存到文件。
实现代码
from spire.pdf import *# 打开 PDF 文件
pdf = PdfDocument("测试.pdf")# 添加书签
bookmark = pdf.Bookmarks.Add("第一章")# 设置书签的跳转位置为第一页左上角
bookmark.Destination = PdfDestination(pdf.Pages[0], PointF(0.0, 0.0))# 自定义书签外观:设置颜色和样式
bookmark.Color = PdfRGBColor(Color.get_Blue())
bookmark.DisplayStyle = PdfTextStyle.Regular# 保存 PDF 文件
pdf.SaveToFile("添加书签.pdf")
pdf.Close()
添加嵌套书签
在 PDF 中,嵌套书签是一种具有层次结构的书签,允许用户以树状结构导航文档内容。它们类似于目录,其中某些书签可以包含子书签,这些子书签可以进一步包含子级,形成层次关系。
嵌套书签的特点
- 层次结构:父书签可以包含一个或多个子书签,子书签也可以有自己的子书签。
- 内容导航:点击嵌套书签可以快速跳转到文档中相应的页面或特定位置。
- 灵活性:嵌套书签可以指向 PDF 文档中的任何页面或位置。
添加嵌套书签的主要步骤
- 加载 PDF 文档
使用 PdfDocument 类打开 PDF 文件。 - 添加父书签
调用 PdfDocument.Bookmarks.Add() 方法,将父书签添加到 PDF 文档的书签集合中。 - 设置父书签的跳转位置
为父书签指定目标调整位置,例如目标页码、具体坐标和缩放比例。 - 自定义父书签(可选)
通过属性(如 Color 和 DisplayStyle),自定义书签的外观,包括文本颜色和字体样式。 - 添加子书签
调用 PdfBookmark.ConvertToBookmarkCollection().Add() 方法,在父书签下添加一个子书签。 - 设置子书签的跳转位置
为子书签指定目标位置,例如目标页码、具体坐标和缩放比例。 - 自定义子书签(可选)
使用 Color 和 DisplayStyle 属性,自定义嵌套书签的文本颜色和字体样式。 - 保存修改后的 PDF 文档
调用 PdfDocument.SaveToFile() 方法,将修改后的 PDF 文档保存到文件中。
实现代码
from spire.pdf import *# 加载 PDF 文件
pdf = PdfDocument("测试.pdf")# 添加父书签
parent_bookmark = pdf.Bookmarks.Add("第一章")
parent_bookmark.Destination = PdfDestination(pdf.Pages[0], PointF(0.0, 0.0))# 添加子书签
child_bookmark = parent_bookmark.ConvertToBookmarkCollection().Add("1.1 简介")
child_bookmark.Destination = PdfDestination(pdf.Pages[0], PointF(0.0, 20.0))# 保存 PDF 文件
pdf.SaveToFile("添加嵌套书签.pdf")
pdf.Close()
Python 修改 PDF 书签
当 PDF 文档内容发生变化时(如页面顺序更改或章节名称更新),书签也需要相应调整。
修改 PDF 书签的主要步骤
- 加载 PDF 文档
使用 PdfDocument 类打开包含书签的现有 PDF 文件。 -
访问目标书签
通过索引定位要更新的书签,例如 PdfDocument.Bookmarks[0] 表示第一个书签。 -
修改书签属性
使用书签的 Title 属性更改书签标题,并通过属性(如 Color)调整其外观。 -
保存修改后的 PDF 文档
调用 PdfDocument.SaveToFile() 方法,保存更新后的 PDF 文件。
实现代码
from spire.pdf import *# 打开 PDF 文件
pdf = PdfDocument("添加书签.pdf")# 获取第一个书签并更新标题和颜色
bookmark = pdf.Bookmarks[0]
bookmark.Title = "新书签"
bookmark.Color = PdfRGBColor(Color.get_Red())# 保存 PDF 文件
pdf.SaveToFile("修改书签.pdf")
pdf.Close()
Python 展开或折叠 PDF 书签
在 PDF 文档中,书签可以设置为展开或折叠状态。这种方式可以控制嵌套书签在文档打开时的显示效果。
展开或折叠书签的步骤
实现代码
-
加载 PDF 文档
使用 PdfDocument 类打开一个包含书签的现有 PDF 文件。 -
访问目标书签
通过索引定位要更新的书签,例如 PdfDocument.Bookmarks[0] 表示第一个书签。 -
设置书签的展开或折叠状态
使用书签的 ExpandBookmark 属性控制其显示状态:
设置为 True 表示书签在打开 PDF 时自动展开。
设置为 False 表示书签在打开 PDF 时保持折叠。 -
保存修改后的 PDF 文档
调用 PdfDocument.SaveToFile() 方法,将更新后的 PDF 文档保存到指定位置。
from spire.pdf import *# 打开 PDF 文件
pdf = PdfDocument("添加嵌套书签.pdf")# 获取第一个书签并设置为折叠
bookmark = pdf.Bookmarks[0]
bookmark.ExpandBookmark = False# 保存 PDF 文件
pdf.SaveToFile("折叠书签.pdf")
pdf.Close()
Python 提取 PDF 书签
从 PDF 文件中提取书签可以帮助您审核文档结构、生成目录或将书签迁移到其他文档中。借助 Spire.PDF,您可以获取所有书签,包括父书签和子书签。
提取 PDF 书签的主要步骤
-
定义递归函数遍历书签
自定义一个函数,用于遍历 PdfBookmarkCollection 中的书签,打印每个书签的标题和页码,并递归处理嵌套书签。 -
加载 PDF 文档
使用 PdfDocument 类打开包含书签的现有 PDF 文件。 -
调用函数以提取书签
将 PDF 文档的书签集合传递给该函数,从文档中提取所有书签信息。
实现代码
from spire.pdf import *# 打开 PDF 文件
pdf = PdfDocument("添加嵌套书签.pdf")# 递归函数:提取书签
def extract_bookmarks(bookmarks, level=0):for i in range(bookmarks.Count):bookmark = bookmarks[i]print(" " * level + f"标题: {bookmark.Title}, 页码: {bookmark.Destination.PageNumber + 1}")if bookmark.ConvertToBookmarkCollection():extract_bookmarks(bookmark.ConvertToBookmarkCollection(), level + 1)extract_bookmarks(pdf.Bookmarks)
pdf.Close()
Python 删除 PDF 书签
当你不再需要书签导航时,可以从PDF文档中删除书签。Spire.PDF 支持批量删除所有书签,也可以针对性地删除指定书签。
删除 PDF 书签的步骤
-
加载 PDF 文档
使用 PdfDocument 类打开一个包含书签的现有 PDF 文件。 -
删除特定书签
使用 PdfDocument.Bookmarks.RemoveAt(index) 方法删除指定的书签。 -
删除所有书签(可选)
如果希望一次性删除文档中的所有书签,可以使用 PdfDocument.Bookmarks.Clear() 方法. -
保存更新后的 PDF 文档
使用 PdfDocument.SaveToFile() 方法保存修改后的文档。
实现代码
from spire.pdf import *# 打开现有的 PDF 文档
pdf = PdfDocument("添加嵌套书签.pdf")# 检查是否存在书签,如果存在,删除第一个书签(其子书签会被一并删除)
if pdf.Bookmarks.Count > 0:pdf.Bookmarks.RemoveAt(0)# 可选:删除所有书签
# pdf.Bookmarks.Clear()# 保存更新后的 PDF
pdf.SaveToFile("删除书签.pdf")
pdf.Close()
以上就是使用Python添加、修改、提取和删除PDF书签的全部内容。感谢阅读!
相关文章:

Python操作PDF书签详解 - 添加、修改、提取和删除
目录 简介 使用工具 Python 向 PDF 添加书签 添加书签 添加嵌套书签 Python 修改 PDF 书签 Python 展开或折叠 PDF 书签 Python 提取 PDF 书签 Python 删除 PDF 书签 简介 PDF 书签是 PDF 文件中的导航工具,通常包含一个标题和一个跳转位置(如…...
One-shot和Zero-shot的区别以及使用场景
Zero-shot是模型在没有任务相关训练数据的情况下进行预测,依赖预训练知识。 One-shot则是提供一个示例,帮助模型理解任务。两者的核心区别在于是否提供示例,以及模型如何利用这些信息。 在机器学习和自然语言处理中,Zero-Shot 和…...
微软 Build 2025:开启 AI 智能体时代的产业革命
在 2025 年 5 月 19 日的微软 Build 开发者大会上,萨提亚・纳德拉以 "我们已进入 AI 智能体时代" 的宣言,正式拉开了人工智能发展的新纪元。这场汇聚了奥特曼、黄仁勋、马斯克三位科技领袖的盛会,不仅发布了 50 余项创新产品&#…...

集星獭 | 重塑集成体验:新版编排重构仿真电商订单数据入库
概要介绍 新版服务编排以可视化模式驱动电商订单入库流程升级,实现订单、客户、库存、发票、发货等环节的自动化处理。流程中通过循环节点、判断逻辑与数据查询的编排,完成了低代码构建业务逻辑,极大提升订单处理效率与业务响应速度。 背景…...

多模态大语言模型arxiv论文略读(八十八)
MammothModa: Multi-Modal Large Language Model ➡️ 论文标题:MammothModa: Multi-Modal Large Language Model ➡️ 论文作者:Qi She, Junwen Pan, Xin Wan, Rui Zhang, Dawei Lu, Kai Huang ➡️ 研究机构: ByteDance, Beijing, China ➡️ 问题背景…...
创建Workforce
创建你的Workforce 3.3.1 简单实践 1. 创建 Workforce 实例 想要使用 Workforce,首先需要创建一个 Workforce 实例。下面是最简单的示例: from camel.agents import ChatAgent from camel.models import ModelFactory from camel.types import Model…...
Cribl 中 Parser 扮演着重要的角色 + 例子
先看文档: Parser | Cribl Docs Parser The Parser Function can be used to extract fields out of events or reserialize (rewrite) events with a subset of fields. Reserialization will preserve the format of the events. For example, if an event contains comma…...

WebSocket 从入门到进阶实战
好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受. 聊天系统是WebSocket的最佳实践,以下是使用WebSocket技术实现的一个聊天系统的关键代码,可以通过这些关键代码ÿ…...

CSS:vertical-align用法以及布局小案例(较难)
文章目录 一、vertical-align说明二、布局案例 一、vertical-align说明 上面的文字介绍,估计大家也看不懂 二、布局案例...
Linux 正则表达式 扩展正则表达式 gawk
什么是正则表达式 正则表达式是我们所定义的模式模板(pattern template),Linux工具用它来过滤文本。Linux工具(比如sed编辑器或gawk程序)能够在处理数据时,使用正则表达式对数据进行模式匹配。如果数据匹配…...

Java转Go日记(五十四):gin路由
1. 基本路由 gin 框架中采用的路由库是基于httprouter做的 地址为:https://github.com/julienschmidt/httprouter package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/", func(c …...

【解决】自己的域名任何端口都访问不到,公网地址正常访问,服务器报错500。
一、问题描述 后端项目部署在服务器上,通过域名访问接口服务器报错500,通过浏览器访问域名的任何端口都是无法访问此网站。 但是通过公网地址访问是可以正常访问到的,感觉是域名出现了问题 二、解决过程 先说结论:问题原因是…...
探秘鸿蒙 HarmonyOS NEXT:Navigation 组件的全面解析
鸿蒙 ArkTS 语言中 Navigation 组件的全面解析 一、引言 本文章基于HarmonyOS NEXT操作系统,API12以上的版本。 在鸿蒙应用开发中,ArkTS 作为一种简洁、高效的开发语言,为开发者提供了丰富的组件库。其中,Navigation 组件在构建…...
订单导入(常见问题和sql)
1.印章取行,有几行取几行 union select PARAM07 name, case when regexp_count(PO_PARAM_20, chr(10)) > 0 then substr(PO_PARAM_20, 0, instr(PO_PARAM_20, chr(10)) - 1) else PO_PARAM_20 end value,PO_ID …...
PyTorch中diag_embed和transpose函数使用详解
torch.diag_embed 是 PyTorch 中用于将一个向量(或批量向量)**嵌入为对角矩阵(或批量对角矩阵)**的函数。它常用于图神经网络(GNN)或线性代数中生成对角矩阵。 函数原型 torch.diag_embed(input, offset0,…...
算法分析与设计实验:找零钱问题的贪心算法与动态规划解决方案
在计算机科学中,贪心算法和动态规划是两种常用的算法设计策略。本文将通过一个经典的找零钱问题,详细讲解这两种算法的实现和应用。我们将会提供完整的C代码,并对代码进行详细解释,帮助读者更好地理解和掌握这两种算法。 问题描述…...

制作 MacOS系统 の Heic动态壁纸
了解动态桌面壁纸 当macOS 10.14发布后,会发现系统带有动态桌面壁纸,设置后,我们的桌面背景将随着一天从早上、到下午、再到晚上的推移而发生微妙的变化。 虽然有些软件也有类似的动态变化效果,但是在新系统中默认的HEIC格式的动…...

大数据 笔记
kafka kafka作为消息队列为什么发送和消费消息这么快? 消息分区:不受单台服务器的限制,可以不受限的处理更多的数据顺序读写:磁盘顺序读写,提升读写效率页缓存:把磁盘中的数据缓存到内存中,把…...
js中encodeURIComponent函数使用场景
encodeURIComponent 是 JavaScript 中的一个内置函数,它的作用是: 将字符串编码为可以安全放入 URL 的形式。 ✅ 为什么需要它? URL 中有一些字符是有特殊意义的,比如: ? 用来开始查询参数 & 分隔多个参数 连接…...
iOS工厂模式
iOS工厂模式 文章目录 iOS工厂模式简单工厂模式(Simple Factory)工厂方法模式(Factory Method)抽象工厂模式(Abstract Factory)三种模式对比 简单工厂模式(Simple Factory) 定义&am…...

【数据库】-1 mysql 的安装
文章目录 1、mysql数据库1.1 mysql数据库的简要介绍 2、mysql数据库的安装2.1 centos安装2.2 ubuntu安装 1、mysql数据库 1.1 mysql数据库的简要介绍 MySQL是一种开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前…...
【缓存】JAVA本地缓存推荐Caffeine和Guava
🌟 引言 在软件开发过程中,缓存是提升系统性能的常用手段。对于基础场景,直接使用 Java集合框架(如Map/Set/List)即可满足需求。然而,当面对更复杂的缓存场景时: 需要支持多种过期策略&#x…...
Prometheus的服务命令和配置文件
一、Prometheus的服务端命令和启动方式 1.服务端命令(具体详情可以--help查看) --config.file“prometheus.yml”指定配置文件,默认是当前目录下的prometheus.yml--web.listen-address"0.0.0.0:9090"web页面的地址与端口…...

物流项目第五期(运费计算实现、责任链设计模式运用)
前四期: 物流项目第一期(登录业务)-CSDN博客 物流项目第二期(用户端登录与双token三验证)-CSDN博客 物流项目第三期(统一网关、工厂模式运用)-CSDN博客 物流项目第四期(运费模板列…...
前端JavaScript-嵌套事件
点击 如果在多层嵌套中,对每层都设置事件监视器,试试看 <!DOCTYPE html> <html lang"cn"> <body><div id"container"><button>点我!</button></div><pre id"output…...

X 下载器 2.1.42 | 国外媒体下载工具 网页视频嗅探下载
X 下载器让你能够轻松地从社交应用如Facebook、Instagram、TikTok等下载视频和图片。通过内置浏览器访问网站,它能自动检测视频和图片,只需点击下载按钮即可完成下载。去除广告,解锁本地会员,享受无广告打扰的下载体验。 大小&am…...

STM32 CAN CANAerospace
STM32的CAN模块对接CANAerospace 刚开始报错如下. 设备开机后整个CAN消息就不发了. USB_CAN调试器报错如下. index time Name ID Type Format Len Data00000001 000.000.000 Event 总线错误 DATA STANDARD 8 接收过程错误-格…...

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取
1 简介 为了有效地利用雾状冰生长的物理现象,最近开发了一种优化算法——雾状优化算法(RIME)。它模拟硬雾状和软雾状过程,构建硬雾状穿刺和软雾状搜索机制。在本研究中,引入了一种增强版本,称为修改的RIME…...

服务器安装xfce桌面环境并通过浏览器操控
最近需要运行某个浏览器的脚本,但是服务器没有桌面环境,无法使用,遂找到了KasmVNC,并配合xfce实现低占用的桌面环境,可以直接使用浏览器进行操作 本文基于雨云——新一代云服务提供商的Debian11服务器操作,…...
Java设计模式之组合模式:从入门到精通(保姆级教程)
文章目录 1. 组合模式概述1.1 专业定义1.2 通俗解释1.3 模式结构2. 组合模式详细解析2.1 模式优缺点2.2 适用场景3. 组合模式实现详解3.1 基础实现3.2 代码解析4. 组合模式进阶应用4.1 透明式 vs 安全式组合模式4.2 组合模式与递归4.3 组合模式与迭代器5. 组合模式在实际开发中…...