<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>ITProgram</title><link>https://itprogram.top/</link><description></description><item><title>Extract and export PDF bookmarks using C#</title><link>https://itprogram.top/ExtractandexportPDFbookmarksusingC.html</link><description>&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;h2&gt;Environment Setup&lt;br/&gt;&lt;/h2&gt;&lt;h2&gt;1.1 Install the Free Library&lt;br/&gt;Use the NuGet Package Manager in Visual Studio to install Free Spire.PDF&lt;/h2&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;Install-Package&amp;nbsp;FreeSpire.PDF&lt;/pre&gt;&lt;p&gt;The free version supports basic operations such as reading PDF bookmarks and does not require an additional license file, but it is limited to 10 pages per document.&lt;/p&gt;&lt;h2&gt;1.2 Import Namespaces&lt;/h2&gt;&lt;p&gt;Add the following namespaces to your code:&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;using&amp;nbsp;System;using&amp;nbsp;System.IO;
using&amp;nbsp;System.Text;using&amp;nbsp;Spire.Pdf;
using&amp;nbsp;Spire.Pdf.Bookmarks;&lt;/pre&gt;&lt;ol start=&quot;2&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;h2&gt;Core Implementation Logic&lt;/h2&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The overall process can be broken down into four steps:&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;Load the target PDF document.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Retrieve the document’s &lt;code inline=&quot;&quot;&gt;PdfBookmarkCollection&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Recursively traverse each bookmark and its child bookmarks to extract titles and display styles.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Write the extracted content to a text file.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;2.1 Load the Document and Retrieve the Bookmark Collection&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;PdfDocument&amp;nbsp;pdf&amp;nbsp;=&amp;nbsp;new&amp;nbsp;PdfDocument();
pdf.LoadFromFile(@&amp;quot;D:\test.pdf&amp;quot;);
PdfBookmarkCollection&amp;nbsp;bookmarks&amp;nbsp;=&amp;nbsp;pdf.Bookmarks;&lt;/pre&gt;&lt;p&gt;The &lt;code inline=&quot;&quot;&gt;Bookmarks&lt;/code&gt; property returns a collection containing the top-level bookmarks. If the document has no bookmarks, the &lt;code inline=&quot;&quot;&gt;Count&lt;/code&gt; will be 0.&lt;/p&gt;&lt;h2&gt;2.2 Recursively Traverse the Bookmark Tree&lt;/h2&gt;&lt;p&gt;The bookmark structure is a typical tree: each bookmark node may contain a collection of child bookmarks (accessible via the &lt;code inline=&quot;&quot;&gt;Count&lt;/code&gt; property and indexer). We design two methods:&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;GetBookmarks&lt;/code&gt;: Handles top-level bookmarks, initializes a &lt;code inline=&quot;&quot;&gt;StringBuilder&lt;/code&gt;, and starts the recursion.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;GetChildBookmark&lt;/code&gt;: Recursively processes child bookmarks.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;GetBookmarks(PdfBookmarkCollection&amp;nbsp;bookmarks,&amp;nbsp;string&amp;nbsp;result)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder&amp;nbsp;content&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuilder();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(bookmarks.Count&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(&amp;quot;Pdf&amp;nbsp;bookmarks:&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;(PdfBookmark&amp;nbsp;parentBookmark&amp;nbsp;in&amp;nbsp;bookmarks)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Retrieve&amp;nbsp;the&amp;nbsp;title
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(parentBookmark.Title);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Retrieve&amp;nbsp;the&amp;nbsp;display&amp;nbsp;style&amp;nbsp;(e.g.,&amp;nbsp;regular,&amp;nbsp;bold,&amp;nbsp;italic,&amp;nbsp;etc.)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(parentBookmark.DisplayStyle.ToString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Recursively&amp;nbsp;process&amp;nbsp;child&amp;nbsp;bookmarks
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetChildBookmark(parentBookmark,&amp;nbsp;content);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File.WriteAllText(result,&amp;nbsp;content.ToString());
}&lt;/pre&gt;&lt;p&gt;Recursive method:&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;GetChildBookmark(PdfBookmark&amp;nbsp;parentBookmark,&amp;nbsp;StringBuilder&amp;nbsp;content)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(parentBookmark.Count&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;(PdfBookmark&amp;nbsp;childBookmark&amp;nbsp;in&amp;nbsp;parentBookmark)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(childBookmark.Title);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(childBookmark.DisplayStyle.ToString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetChildBookmark(childBookmark,&amp;nbsp;content);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;h2&gt;2.3 Complete Code Example&lt;/h2&gt;&lt;p&gt;Below is a complete console application example that outputs bookmark information to a file named &lt;strong&gt;GetPdfBookmarks.txt&lt;/strong&gt;.&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;using&amp;nbsp;System;
using&amp;nbsp;System.IO;
using&amp;nbsp;System.Text;
using&amp;nbsp;Spire.Pdf;
using&amp;nbsp;Spire.Pdf.Bookmarks;

namespace&amp;nbsp;GetBookmark
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;internal&amp;nbsp;class&amp;nbsp;Program
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;void&amp;nbsp;Main(string[]&amp;nbsp;args)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PdfDocument&amp;nbsp;pdf&amp;nbsp;=&amp;nbsp;new&amp;nbsp;PdfDocument();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pdf.LoadFromFile(@&amp;quot;D:\testp\test.pdf&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PdfBookmarkCollection&amp;nbsp;bookmarks&amp;nbsp;=&amp;nbsp;pdf.Bookmarks;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;result&amp;nbsp;=&amp;nbsp;&amp;quot;GetPdfBookmarks.txt&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetBookmarks(bookmarks,&amp;nbsp;result);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&amp;quot;Bookmark&amp;nbsp;extraction&amp;nbsp;completed.&amp;nbsp;The&amp;nbsp;results&amp;nbsp;have&amp;nbsp;been&amp;nbsp;saved&amp;nbsp;to：&amp;quot;&amp;nbsp;+&amp;nbsp;result);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;GetBookmarks(PdfBookmarkCollection&amp;nbsp;bookmarks,&amp;nbsp;string&amp;nbsp;result)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder&amp;nbsp;content&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuilder();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(bookmarks.Count&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(&amp;quot;Pdf&amp;nbsp;bookmarks:&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;(PdfBookmark&amp;nbsp;parentBookmark&amp;nbsp;in&amp;nbsp;bookmarks)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(parentBookmark.Title);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(parentBookmark.DisplayStyle.ToString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetChildBookmark(parentBookmark,&amp;nbsp;content);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(&amp;quot;The&amp;nbsp;PDF&amp;nbsp;document&amp;nbsp;does&amp;nbsp;not&amp;nbsp;contain&amp;nbsp;any&amp;nbsp;bookmarks.&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File.WriteAllText(result,&amp;nbsp;content.ToString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;GetChildBookmark(PdfBookmark&amp;nbsp;parentBookmark,&amp;nbsp;StringBuilder&amp;nbsp;content)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(parentBookmark.Count&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;(PdfBookmark&amp;nbsp;childBookmark&amp;nbsp;in&amp;nbsp;parentBookmark)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(childBookmark.Title);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine(childBookmark.DisplayStyle.ToString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetChildBookmark(childBookmark,&amp;nbsp;content);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;h2&gt;3.Output Format Description&lt;/h2&gt;&lt;p&gt;Each bookmark in the generated text file is represented by two lines: the first line is the title, and the second line is the display style. For example:&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;PDF&amp;nbsp;Bookmarks:
Chapter&amp;nbsp;1&amp;nbsp;Introduction
Regular
1.1&amp;nbsp;Background
Bold
1.2&amp;nbsp;Objectives
Italic
Chapter&amp;nbsp;2&amp;nbsp;Implementation
Regular
2.1&amp;nbsp;Environment&amp;nbsp;Setup
Regular&lt;/pre&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;DisplayStyle&lt;/code&gt; is an enumeration with the following possible values:&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;Regular&lt;/code&gt;: Normal text&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;Bold&lt;/code&gt;: Bold&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;Italic&lt;/code&gt;: Italic&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The output will vary בהתאם on the actual bookmark styles defined in the PDF document.&lt;/p&gt;&lt;h2&gt;4.Notes and Extensions&lt;/h2&gt;&lt;h3&gt;4.1 Bookmarks May Be Empty&lt;/h3&gt;&lt;p&gt;If the PDF has no bookmarks, &lt;code inline=&quot;&quot;&gt;bookmarks.Count&lt;/code&gt; will be 0. In this case, the code writes a message to the file to avoid generating an empty file.&lt;/p&gt;&lt;h3&gt;4.2 Retrieving Target Page Numbers and Actions&lt;/h3&gt;&lt;p&gt;The above example only retrieves the title and style. If you also need to get the target page number a bookmark links to, you can use the &lt;code inline=&quot;&quot;&gt;PdfBookmark.Action&lt;/code&gt; property (be sure to check the action type). For example:&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;if&amp;nbsp;(parentBookmark.Action&amp;nbsp;is&amp;nbsp;PdfGoToAction&amp;nbsp;goToAction)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;pageIndex&amp;nbsp;=&amp;nbsp;pdf.Pages.IndexOf(goToAction.Destination.Page);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.AppendLine($&amp;quot;Navigate&amp;nbsp;to&amp;nbsp;page&amp;nbsp;{pageIndex&amp;nbsp;+&amp;nbsp;1}&amp;nbsp;page&amp;quot;);
}&lt;/pre&gt;&lt;p&gt;Free Spire.PDF provides fairly comprehensive support for &lt;code inline=&quot;&quot;&gt;Action&lt;/code&gt;, so you can extend the functionality based on your specific needs.&lt;/p&gt;&lt;h2&gt;4.3 Performance Considerations&lt;/h2&gt;&lt;p&gt;For PDFs containing thousands of bookmarks, recursive traversal typically does not cause noticeable performance issues. However, if extraction needs to be performed frequently, consider using a &lt;code inline=&quot;&quot;&gt;StreamWriter&lt;/code&gt; for streaming writes instead of a &lt;code inline=&quot;&quot;&gt;StringBuilder&lt;/code&gt; to reduce memory usage.&lt;/p&gt;&lt;h2&gt;4.4 Encoding Handling&lt;/h2&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;File.WriteAllText&lt;/code&gt; uses UTF-8 encoding by default. If you need to specify a different encoding (such as GB2312), you can use a &lt;code inline=&quot;&quot;&gt;StreamWriter&lt;/code&gt; instead.&lt;/p&gt;&lt;h2&gt;5.Summary&lt;/h2&gt;&lt;p&gt;This article demonstrates how to fully extract multi-level bookmark information from a PDF document using a free .NET library. The key points include:&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;Accessing the root bookmark collection via &lt;code inline=&quot;&quot;&gt;PdfDocument.Bookmarks&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Recursively traversing &lt;code inline=&quot;&quot;&gt;PdfBookmark&lt;/code&gt; nodes using the &lt;code inline=&quot;&quot;&gt;Count&lt;/code&gt; property and indexer.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Reading the &lt;code inline=&quot;&quot;&gt;Title&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;DisplayStyle&lt;/code&gt; properties.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Writing the structured data to a text file.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This approach does not rely on Adobe Acrobat or any other GUI tools, making it ideal for integration into backend services or document processing pipelines. Developers can further extend this approach to retrieve bookmark page numbers, zoom settings, or even modify the bookmark structure.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 09 Apr 2026 12:20:48 +0800</pubDate></item><item><title>新技术学习路径规划 - 第56篇</title><link>https://itprogram.top/post-56.html</link><description>本文将分享一些实用的技巧和方法，这些都是经过实践验证的有效策略。希望能对读者有所帮助。

这是第 56 篇文章的内容。文章编号：56，创建时间：2026-04-09 12:31:08</description><pubDate>Thu, 09 Apr 2026 11:13:01 +0800</pubDate></item><item><title>代码重构的时机与方法 - 第91篇</title><link>https://itprogram.top/post-91.html</link><description>本文将详细介绍相关概念和实践经验，帮助读者快速掌握核心知识点。内容涵盖基础理论、实际应用和进阶技巧三个部分。

这是第 91 篇文章的内容。文章编号：91，创建时间：2026-04-09 12:31:11</description><pubDate>Thu, 09 Apr 2026 11:08:56 +0800</pubDate></item><item><title>用户需求分析方法探讨 - 第258篇</title><link>https://itprogram.top/post-258.html</link><description>实践经验是最宝贵的财富。本文整理了一些常见的坑点和解决方案，帮助读者少走弯路。

这是第 258 篇文章的内容。文章编号：258，创建时间：2026-04-09 12:31:29</description><pubDate>Thu, 09 Apr 2026 10:15:38 +0800</pubDate></item><item><title>后端架构设计经验分享 - 第285篇</title><link>https://itprogram.top/post-285.html</link><description>技术选型是项目成功的关键因素之一。本文将从多个维度分析不同方案的优缺点，帮助读者做出明智的决策。

这是第 285 篇文章的内容。文章编号：285，创建时间：2026-04-09 12:31:46</description><pubDate>Thu, 09 Apr 2026 08:30:32 +0800</pubDate></item><item><title>项目管理经验心得体会 - 第97篇</title><link>https://itprogram.top/post-97.html</link><description>在这个领域，基础知识非常重要。本文将从零开始，系统地介绍相关概念和原理。

这是第 97 篇文章的内容。文章编号：97，创建时间：2026-04-09 12:31:12</description><pubDate>Thu, 09 Apr 2026 07:43:54 +0800</pubDate></item><item><title>用户需求分析方法探讨 - 第38篇</title><link>https://itprogram.top/post-38.html</link><description>实践经验是最宝贵的财富。本文整理了一些常见的坑点和解决方案，帮助读者少走弯路。

这是第 38 篇文章的内容。文章编号：38，创建时间：2026-04-09 12:31:07</description><pubDate>Thu, 09 Apr 2026 06:28:54 +0800</pubDate></item><item><title>开源项目贡献指南详解 - 第253篇</title><link>https://itprogram.top/post-253.html</link><description>通过实际案例分析，我们将深入探讨这个话题的各个方面。希望读者能够从中获得启发，应用到自己的工作中。

这是第 253 篇文章的内容。文章编号：253，创建时间：2026-04-09 12:31:42</description><pubDate>Thu, 09 Apr 2026 04:06:47 +0800</pubDate></item><item><title>市场趋势分析与预测 - 第400篇</title><link>https://itprogram.top/post-400.html</link><description>工具的选择和使用直接影响工作效率。本文推荐了一些好用的工具，并介绍了它们的使用方法。

这是第 400 篇文章的内容。文章编号：400，创建时间：2026-04-09 12:31:59</description><pubDate>Thu, 09 Apr 2026 03:26:02 +0800</pubDate></item><item><title>项目管理经验心得体会 - 第37篇</title><link>https://itprogram.top/post-37.html</link><description>在这个领域，基础知识非常重要。本文将从零开始，系统地介绍相关概念和原理。

这是第 37 篇文章的内容。文章编号：37，创建时间：2026-04-09 12:31:07</description><pubDate>Thu, 09 Apr 2026 01:54:18 +0800</pubDate></item></channel></rss>