当前位置: 首页 > article >正文

Python操作PDF书签详解 - 添加、修改、提取和删除

目录

简介

使用工具

Python 向 PDF 添加书签

添加书签

添加嵌套书签

Python 修改 PDF 书签

Python 展开或折叠 PDF 书签

Python 提取 PDF 书签

Python 删除 PDF 书签


简介

PDF 书签是 PDF 文件中的导航工具,通常包含一个标题和一个跳转位置(如指定的页面或位置)。它们可以像目录一样分层显示,用户可以展开或折叠这些书签,在文档中快速找到需要的内容。从技术上看,书签是 PDF 文件结构中的大纲对象,不会改变文档内容,只是帮助用户更方便地导航。

本教程将详细介绍如何使用 Python对 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文档添加书签。添加时,你可以自定义书签的跳转位置以及颜色和样式等属性。

    添加书签的主要步骤

    1. 加载 PDF 文档
      使用 PdfDocument 类打开已有的 PDF 文件。
    2. 添加书签
      调用 PdfDocument.Bookmarks.Add() 方法,将书签添加到文档的书签集合中。
    3. 设置书签跳转位置
      为书签设置目标跳转位置,例如目标页码、具体坐标位置以及缩放比例。
    4. 自定义书签(可选)
      通过设置书签的属性,如颜色(Color)和显示样式(DisplayStyle),来调整书签文字的颜色和字体样式。
    5. 保存修改后的 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 文档中的任何页面或位置。

    添加嵌套书签的主要步骤

    1. 加载 PDF 文档
      使用 PdfDocument 类打开 PDF 文件。
    2. 添加父书签
      调用 PdfDocument.Bookmarks.Add() 方法,将父书签添加到 PDF 文档的书签集合中。
    3. 设置父书签的跳转位置
      为父书签指定目标调整位置,例如目标页码、具体坐标和缩放比例。
    4.  自定义父书签(可选)
      通过属性(如 Color 和 DisplayStyle),自定义书签的外观,包括文本颜色和字体样式。
    5. 添加子书签
      调用 PdfBookmark.ConvertToBookmarkCollection().Add() 方法,在父书签下添加一个子书签。
    6. 设置子书签的跳转位置
      为子书签指定目标位置,例如目标页码、具体坐标和缩放比例。
    7. 自定义子书签(可选)
      使用 Color 和 DisplayStyle 属性,自定义嵌套书签的文本颜色和字体样式。
    8. 保存修改后的 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 书签的主要步骤

    1. 加载 PDF 文档
      使用 PdfDocument 类打开包含书签的现有 PDF 文件。
    2. 访问目标书签
      通过索引定位要更新的书签,例如 PdfDocument.Bookmarks[0] 表示第一个书签。

    3. 修改书签属性
      使用书签的 Title 属性更改书签标题,并通过属性(如 Color)调整其外观。

    4. 保存修改后的 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 文档中,书签可以设置为展开或折叠状态。这种方式可以控制嵌套书签在文档打开时的显示效果。

    展开或折叠书签的步骤

    实现代码

    1. 加载 PDF 文档
      使用 PdfDocument 类打开一个包含书签的现有 PDF 文件。

    2. 访问目标书签
      通过索引定位要更新的书签,例如 PdfDocument.Bookmarks[0] 表示第一个书签。

    3. 设置书签的展开或折叠状态
      使用书签的 ExpandBookmark 属性控制其显示状态:
      设置为 True 表示书签在打开 PDF 时自动展开。
      设置为 False 表示书签在打开 PDF 时保持折叠。

    4. 保存修改后的 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 书签的主要步骤

    1. 定义递归函数遍历书签
      自定义一个函数,用于遍历 PdfBookmarkCollection 中的书签,打印每个书签的标题和页码,并递归处理嵌套书签。

    2. 加载 PDF 文档
      使用 PdfDocument 类打开包含书签的现有 PDF 文件。

    3. 调用函数以提取书签
      将 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 书签的步骤

    1. 加载 PDF 文档
      使用 PdfDocument 类打开一个包含书签的现有 PDF 文件。

    2. 删除特定书签
      使用 PdfDocument.Bookmarks.RemoveAt(index) 方法删除指定的书签。

    3. 删除所有书签(可选)
      如果希望一次性删除文档中的所有书签,可以使用 PdfDocument.Bookmarks.Clear() 方法.

    4. 保存更新后的 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技术实现的一个聊天系统的关键代码,可以通过这些关键代码&#xff…...

    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页面的地址与端口&#xf…...

    物流项目第五期(运费计算实现、责任链设计模式运用)

    前四期: 物流项目第一期(登录业务)-CSDN博客 物流项目第二期(用户端登录与双token三验证)-CSDN博客 物流项目第三期(统一网关、工厂模式运用)-CSDN博客 物流项目第四期(运费模板列…...

    前端JavaScript-嵌套事件

    点击 如果在多层嵌套中&#xff0c;对每层都设置事件监视器&#xff0c;试试看 <!DOCTYPE html> <html lang"cn"> <body><div id"container"><button>点我&#xff01;</button></div><pre id"output…...

    X 下载器 2.1.42 | 国外媒体下载工具 网页视频嗅探下载

    X 下载器让你能够轻松地从社交应用如Facebook、Instagram、TikTok等下载视频和图片。通过内置浏览器访问网站&#xff0c;它能自动检测视频和图片&#xff0c;只需点击下载按钮即可完成下载。去除广告&#xff0c;解锁本地会员&#xff0c;享受无广告打扰的下载体验。 大小&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 简介 为了有效地利用雾状冰生长的物理现象&#xff0c;最近开发了一种优化算法——雾状优化算法&#xff08;RIME&#xff09;。它模拟硬雾状和软雾状过程&#xff0c;构建硬雾状穿刺和软雾状搜索机制。在本研究中&#xff0c;引入了一种增强版本&#xff0c;称为修改的RIME…...

    服务器安装xfce桌面环境并通过浏览器操控

    最近需要运行某个浏览器的脚本&#xff0c;但是服务器没有桌面环境&#xff0c;无法使用&#xff0c;遂找到了KasmVNC&#xff0c;并配合xfce实现低占用的桌面环境&#xff0c;可以直接使用浏览器进行操作 本文基于雨云——新一代云服务提供商的Debian11服务器操作&#xff0c;…...

    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. 组合模式在实际开发中…...