通过 C# 读取并导出 PDF 书签
1. 环境准备1.1 安装免费库在 Visual Studio 中通过 NuGet 包管理器安装Free Spire.PDFInstall-Package FreeSpire.PDF该免费版本支持读取 PDF 书签等基础操作无需额外授权文件但有单文件10页的页数限制。1.2 引用命名空间代码中需要引入以下命名空间using System; using System.IO; using System.Text; using Spire.Pdf; using Spire.Pdf.Bookmarks;2. 核心实现逻辑整体流程分为四步加载目标 PDF 文档。获取文档的PdfBookmarkCollection书签集合。递归遍历每个书签及其子书签提取标题和显示样式。将提取的内容写入文本文件。2.1 加载文档并获取书签集合PdfDocument pdf new PdfDocument(); pdf.LoadFromFile(D:\test.pdf); PdfBookmarkCollection bookmarks pdf.Bookmarks;Bookmarks属性返回一个集合包含顶层书签。如果文档没有书签Count为 0。2.2 递归遍历书签树书签结构是典型的树形结构每个书签节点可能拥有子书签集合通过Count属性和索引器访问。我们设计两个方法GetBookmarks处理顶层书签创建StringBuilder并启动递归。GetChildBookmark递归处理子书签。public static void GetBookmarks(PdfBookmarkCollection bookmarks, string result) { StringBuilder content new StringBuilder(); if (bookmarks.Count 0) { content.AppendLine(Pdf bookmarks:); foreach (PdfBookmark parentBookmark in bookmarks) { // 获取标题 content.AppendLine(parentBookmark.Title); // 获取显示样式如普通、粗体、斜体等 content.AppendLine(parentBookmark.DisplayStyle.ToString()); // 递归处理子书签 GetChildBookmark(parentBookmark, content); } } File.WriteAllText(result, content.ToString()); }递归方法public static void GetChildBookmark(PdfBookmark parentBookmark, StringBuilder content) { if (parentBookmark.Count 0) { foreach (PdfBookmark childBookmark in parentBookmark) { content.AppendLine(childBookmark.Title); content.AppendLine(childBookmark.DisplayStyle.ToString()); GetChildBookmark(childBookmark, content); } } }2.3 完整代码示例以下是一个控制台应用程序的完整实现将书签信息输出到GetPdfBookmarks.txt文件。using System; using System.IO; using System.Text; using Spire.Pdf; using Spire.Pdf.Bookmarks; namespace GetBookmark { internal class Program { static void Main(string[] args) { PdfDocument pdf new PdfDocument(); pdf.LoadFromFile(D:\testp\test.pdf); PdfBookmarkCollection bookmarks pdf.Bookmarks; string result GetPdfBookmarks.txt; GetBookmarks(bookmarks, result); Console.WriteLine(书签提取完成结果已保存至 result); } public static void GetBookmarks(PdfBookmarkCollection bookmarks, string result) { StringBuilder content new StringBuilder(); if (bookmarks.Count 0) { content.AppendLine(Pdf bookmarks:); foreach (PdfBookmark parentBookmark in bookmarks) { content.AppendLine(parentBookmark.Title); content.AppendLine(parentBookmark.DisplayStyle.ToString()); GetChildBookmark(parentBookmark, content); } } else { content.AppendLine(该 PDF 文档不包含任何书签。); } File.WriteAllText(result, content.ToString()); } public static void GetChildBookmark(PdfBookmark parentBookmark, StringBuilder content) { if (parentBookmark.Count 0) { foreach (PdfBookmark childBookmark in parentBookmark) { content.AppendLine(childBookmark.Title); content.AppendLine(childBookmark.DisplayStyle.ToString()); GetChildBookmark(childBookmark, content); } } } } }3. 输出格式说明生成的文本文件每两行代表一个书签第一行是标题第二行是显示样式。例如Pdf bookmarks: 第1章 简介 Regular 1.1 背景 Bold 1.2 目标 Italic 第2章 实现 Regular 2.1 环境搭建 RegularDisplayStyle是一个枚举可能的值包括Regular普通文本Bold粗体Italic斜体根据 PDF 文件的实际书签样式输出结果会相应变化。4. 注意事项与扩展4.1 书签可能为空若 PDF 没有书签bookmarks.Count为 0代码会写入提示信息避免空文件。4.2 目标页码与动作的获取上述示例仅获取了标题和样式。如果需要获取书签跳转的目标页码可以使用PdfBookmark.Action属性需判断动作类型。例如if (parentBookmark.Action is PdfGoToAction goToAction) { int pageIndex pdf.Pages.IndexOf(goToAction.Destination.Page); content.AppendLine($跳转至第 {pageIndex 1} 页); }由于 Free Spire.PDF 对Action的支持较为完整可根据实际需求扩展。4.3 性能考虑对于包含数千个书签的 PDF递归遍历不会有明显性能问题。但若需频繁提取可考虑将StringBuilder替换为StreamWriter流式写入降低内存占用。4.4 编码处理File.WriteAllText默认使用 UTF-8 编码如需指定编码如 GB2312可改用StreamWriter。5. 总结本文演示了如何利用免费 .NET 库完整提取 PDF 文档的多级书签信息。关键技术点包括通过PdfDocument.Bookmarks获取根书签集合。递归遍历PdfBookmark节点的Count和索引器。

相关新闻

MQTT-Proxy集群配置教程:实现高可用物联网消息代理的终极指南

MQTT-Proxy集群配置教程:实现高可用物联网消息代理的终极指南

MQTT-Proxy集群配置教程:实现高可用物联网消息代理的终极指南 【免费下载链接】mqtt-proxy A new MQTT protocol proxy architecture model, based on which RocketMQ can better support messages from terminals such as IoT devices and Mobile APP. 项目地址:…

2026/7/7 5:41:36 阅读更多 →
F5 NGINX Ingress Controller 5.3.0 新增功能

F5 NGINX Ingress Controller 5.3.0 新增功能

原文作者:Michel Kingston - F5 NGINX 解决方案架构师 原文链接:F5 NGINX Ingress Controller 5.3.0 新增功能 转载来源:NGINX 中文官网 NGINX 唯一中文官方社区 ,尽在 nginx.org.cn F5 NGINX Ingress Controller 5.3.0 正值关键时…

2026/7/7 5:41:36 阅读更多 →
高阶SQL注入实战:信号建模与利用链闭环思维解析

高阶SQL注入实战:信号建模与利用链闭环思维解析

1. 项目概述SQL注入,这个在Web安全领域存在了二十多年的“老古董”,至今依然是渗透测试报告和漏洞赏金平台上的常客。很多人觉得它简单,无非就是单引号、union select、sleep()三板斧。但真正在一线做渗透测试或红蓝对抗时,你会发…

2026/7/7 5:39:35 阅读更多 →

最新新闻

LTC6904与PIC24FJ256GB110构建高精度方波发生器方案

LTC6904与PIC24FJ256GB110构建高精度方波发生器方案

1. 项目背景与核心价值在嵌入式系统开发中,精确的时钟信号就像交响乐团的指挥家——它决定了整个系统的节奏和协调性。LTC6904这颗来自ADI的低功耗可编程振荡器芯片,配合PIC24FJ256GB110微控制器的强大处理能力,可以构建出频率精度达0.5%的方…

2026/7/7 6:45:50 阅读更多 →
许可证增购申请总被卡,管理层最想先看哪几项数据

许可证增购申请总被卡,管理层最想先看哪几项数据

摘要如果企业在没有完成使用分析的前提下就直接增购,往往会出现预算增加但利用率依旧偏低的情况。本文从高峰并发、模块结构、低效占用和历史趋势四个维度,分析为什么多数企业更适合先优化,再判断是否需要增购。 很多企业在 CAD、CAE、EDA 等…

2026/7/7 6:45:50 阅读更多 →
摩托车混流装配防错引导系统硬件怎么选?海雅达 Model 10X 工业三防平板电脑采购预算与部署成本评估

摩托车混流装配防错引导系统硬件怎么选?海雅达 Model 10X 工业三防平板电脑采购预算与部署成本评估

1. 摩托车混流装配的核心业务痛点与防呆控制难度在现代摩托车制造中,同一条总装流水线上通常处于跨骑、踏板、越野、纯电等多车型、多排量(125cc 至 800cc)的高度混流装配状态。一线操作工需要根据多变的车型工艺 BOM,装配不同的卡…

2026/7/7 6:45:50 阅读更多 →
ORB-SLAM3 SearchByBoW 2

ORB-SLAM3 SearchByBoW 2

以下是ORB-SLAM3中ORBmatcher::SearchByBoW函数的完整代码及详细解读。&#x1f4c4; 完整代码cppint ORBmatcher::SearchByBoW(KeyFrame* pKF, Frame &F, vector<MapPoint*> &vpMapPointMatches) {// 1. 获取关键帧的地图点const vector<MapPoint*> vpMap…

2026/7/7 6:43:49 阅读更多 →
F28377D Modbus RTU移植:硬件时序、寄存器映射与实时性硬核实践

F28377D Modbus RTU移植:硬件时序、寄存器映射与实时性硬核实践

1. 项目概述&#xff1a;为什么“半小时搞定”在嵌入式领域是个危险信号“跨平台移植modbus&#xff0c;从STM32到TMS320F28377D&#xff0c;kimi 2.6半小时搞定”——这个标题在嵌入式工程师朋友圈刷屏时&#xff0c;我正蹲在产线调试一台F28377D驱动的伺服控制器。第一反应不…

2026/7/7 6:39:48 阅读更多 →
BurpSuite乱码全解析:从编码原理到实战解决content-Encoding显示问题

BurpSuite乱码全解析:从编码原理到实战解决content-Encoding显示问题

1. 项目概述&#xff1a;当BurpSuite遇上乱码如果你是一名Web安全测试人员或者开发者&#xff0c;那么BurpSuite这个工具对你来说肯定不陌生。它几乎是渗透测试、接口调试和Web应用分析领域的“瑞士军刀”。但在日常使用中&#xff0c;一个看似简单却极其恼人的问题频繁出现&am…

2026/7/7 6:37:48 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集&#xff0c;从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高&#xff1a;流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广&#xff0c;是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队&#xff0c;往往容易卡在一容易踩坑的选型难题&#xff1a; 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定&#xff0c;必须同时依赖「文本语义理解 实体关系推理」时&#xff0c;到底是做「向量图谱混合检索」就够了&#xff0c;还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻