在处理长篇PDF文档(如技术手册、学术论文或企业报告)时,书签是帮助读者快速定位章节的关键导航工具。通过编程方式管理书签,可以批量处理、精确控制层级关系、动态更新,并集成到自动化文档生成流水线中。本文将基于Spire.PDF for Python库,演示如何创建、修改、删除、获取信息并控制书签的展开折叠及缩放行为。
1. 环境搭建
首先通过pip安装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[0]
- 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[0])
复制代码
4. 删除书签
删除单个顶级书签(含其所有子书签)使用RemoveAt(index):- doc.Bookmarks.RemoveAt(0)
复制代码
清除所有书签使用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书签管理的核心功能:创建(父子层级)、修改、删除、信息读取、展开折叠控制和缩放设置。这些代码可灵活组合用于批量文档处理或自动化报告生成。深入探索还可涉及超链接、表单字段和数字签名等高级功能。 |