脚本专家 发表于 2026-7-3 09:00:03

Python操作PDF书签:使用Spire.PDF实现创建、修改与删除

在处理长篇PDF文档(如技术手册、学术论文或企业报告)时,书签是帮助读者快速定位章节的关键导航工具。通过编程方式管理书签,可以批量处理、精确控制层级关系、动态更新,并集成到自动化文档生成流水线中。本文将基于Spire.PDF for Python库,演示如何创建、修改、删除、获取信息并控制书签的展开折叠及缩放行为。

1. 环境搭建

首先通过pip安装Spire.PDF:

pip install Spire.PDF


在脚本中导入必要模块:

from spire.pdf.common import *
from spire.pdf import *


2. 创建带有父子层级的书签

书签的核心是树状层级结构:顶级父书签下可挂载多个子书签。先创建文档并设置页面:

doc = PdfDocument()
unitCvtr = PdfUnitConvertor()
margin = PdfMargins()
margin.Top = unitCvtr.ConvertUnits(2.54, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point)
margin.Bottom = margin.Top
margin.Left = unitCvtr.ConvertUnits(3.17, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point)
margin.Right = margin.Left
section = doc.Sections.Add()
section.PageSettings.Margins = margin
section.PageSettings.Size = PdfPageSize.A4()


添加页面并绘制标题:

page = section.Pages.Add()
font_title = PdfTrueTypeFont("Arial", 16.0, PdfFontStyle.Bold, True)
brush = PdfBrushes.get_Black()
format_center = PdfStringFormat(PdfTextAlignment.Center)
page.Canvas.DrawString("PDF 书签示例文档", font_title, brush,
    page.Canvas.ClientSize.Width / 2, 10, format_center)


2.1 添加父书签

父书签通过doc.Bookmarks.Add()创建,返回PdfBookmark对象。需要关联一个PdfDestination指定目标页面和坐标,再用PdfGoToAction绑定:

font_chapter = PdfTrueTypeFont("Arial", 11.0, PdfFontStyle.Bold, True)
y = 60.0
page.Canvas.DrawString("1. 第一章 概述", font_chapter, PdfBrushes.get_Blue(), 0.0, y)
dest1 = PdfDestination(page, PointF(0.0, y))
bookmark1 = doc.Bookmarks.Add("1. 第一章 概述")
bookmark1.Color = PdfRGBColor(Color.get_SaddleBrown())
bookmark1.DisplayStyle = PdfTextStyle.Bold
bookmark1.Action = PdfGoToAction(dest1)


Color和DisplayStyle控制书签在导航面板中的颜色和文字样式(粗体、斜体等)。

2.2 添加子书签

子书签通过父书签的PdfBookmarkCollection添加,而非直接添加到文档顶级集合:

childCollection = PdfBookmarkCollection(bookmark1)
page2 = section.Pages.Add()
y2 = 0.0
page2.Canvas.DrawString("1.1. 背景介绍", font_chapter, PdfBrushes.get_Brown(), 0.0, y2)
dest_child = PdfDestination(page2, PointF(0.0, y2))
child_bookmark = childCollection.Add("1.1. 背景介绍")
child_bookmark.Color = PdfRGBColor(Color.get_Coral())
child_bookmark.DisplayStyle = PdfTextStyle.Italic
child_bookmark.Action = PdfGoToAction(dest_child)


保存文档:

doc.SaveToFile("Bookmark_output.pdf")
doc.Close()


3. 修改已有书签

加载文档后可直接修改书签的Title、Color、DisplayStyle:

doc = PdfDocument()
doc.LoadFromFile("input.pdf")
bookmark = doc.Bookmarks
bookmark.Title = "修改后的书签标题"
bookmark.Color = PdfRGBColor(Color.get_Black())
bookmark.DisplayStyle = PdfTextStyle.Bold
doc.SaveToFile("UpdatedBookmark.pdf")
doc.Close()


对于子书签,需递归遍历:

def update_child_bookmarks(parent_bookmark):
    children = PdfBookmarkCollection(parent_bookmark)
    for i in range(children.Count):
      child = children.get_Item(i)
      child.Color = PdfRGBColor(Color.get_Blue())
      child.DisplayStyle = PdfTextStyle.Regular
      update_child_bookmarks(child)

update_child_bookmarks(doc.Bookmarks)


4. 删除书签

删除单个顶级书签(含其所有子书签)使用RemoveAt(index):

doc.Bookmarks.RemoveAt(0)


清除所有书签使用Clear():

doc.Bookmarks.Clear()


适合重新生成书签结构前的清理操作。

5. 获取书签信息

遍历书签读取Title和DisplayStyle:

doc = PdfDocument()
doc.LoadFromFile("input.pdf")
bookmarks = doc.Bookmarks
results = []
if bookmarks.Count > 0:
    results.append("PDF 书签列表:")
    for i in range(bookmarks.Count):
      parent = bookmarks.get_Item(i)
      results.append(f"标题:{parent.Title}")
      results.append(f"样式:{parent.DisplayStyle}")
      children = PdfBookmarkCollection(parent)
      for j in range(children.Count):
            child = children.get_Item(j)
            results.append(f"子书签:{child.Title}")
            results.append(f"样式:{child.DisplayStyle}")
with open("Bookmarks_Info.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(results))
doc.Close()


获取书签所在页码(需加1转换为1-based页码):

page_number = doc.Pages.IndexOf(bookmark.Destination.Page) + 1


6. 控制书签展开/折叠状态

全局设置所有书签展开或折叠:

doc.ViewerPreferences.BookMarkExpandOrCollapse = True# True展开,False折叠


控制单个书签展开状态:

doc.Bookmarks.get_Item(0).ExpandBookmark = True
    doc.Bookmarks.get_Item(1).ExpandBookmark = False


适合用于突出显示重点章节,同时保持其他章节折叠以减少视觉干扰。

7. 设置书签跳转缩放级别

通过设置Destination.Zoom控制跳转后页面的缩放比例:

bookmark.Destination.Zoom = 0.5# 50%缩放

值为0时继承阅读器默认缩放,大于0则指定固定比例。

总结

以上操作覆盖了PDF书签管理的核心功能:创建(父子层级)、修改、删除、信息读取、展开折叠控制和缩放设置。这些代码可灵活组合用于批量文档处理或自动化报告生成。深入探索还可涉及超链接、表单字段和数字签名等高级功能。

热心网友5 发表于 2026-7-3 09:10:00

Re: Python操作PDF书签:使用Spire.PDF实现创建、修改与删除

非常感谢楼主如此详细地分享基于 Spire.PDF 的 Python 书签操作教程!从环境搭建到创建父子层级、再到修改现有书签,每个步骤都配了清晰代码,尤其是对 `PdfDestination` 和 `PdfBookmarkCollection` 的用法讲解,让刚接触 PDF 编程的人也能快速上手。 我试了一下,创建嵌套书签后保存的文档在阅读器里展开层级非常流畅。想请教一下:对于已有大量书签的 PDF(比如数千个),这个库的递归遍历修改性能如何?另外,书签的中文标题会出现乱码吗?期待楼主后续能补充关于删除特定书签以及批量展开/折叠所有书签的实现。再次感谢分享!

热心网友5 发表于 2026-7-3 09:10:00

Re: Python操作PDF书签:使用Spire.PDF实现创建、修改与删除

感谢分享!这个教程非常清晰实用,特别是父子层级书签的创建和递归修改部分,正好解决了我处理自动化文档时需要批量生成书签的痛点。我之前试过一些其他库,但对中文支持不够好,Spire.PDF 看起来挺完善的。对了,删除书签的部分没有贴出来,能补充一下具体的代码示例吗?比如如何根据标题匹配并删除特定书签?

热心网友5 发表于 2026-7-3 09:10:00

Re: Python操作PDF书签:使用Spire.PDF实现创建、修改与删除

感谢楼主分享这么详细的教程!Spire.PDF for Python 我之前也留意过,但没深入试过书签操作。你讲的父子层级创建、颜色样式设置还有递归修改这部分写得特别清楚,跟着代码跑了一遍,确实能生成带层级导航的 PDF。想问一下,这个库在商业项目里用需要授权吗?另外,如果我想把多个 PDF 的书签批量合并到一个文件里,有没有现成的方法,还是得自己遍历处理?
页: [1]
查看完整版本: Python操作PDF书签:使用Spire.PDF实现创建、修改与删除