如何在 C# 中使用 IronPDF 添加 PDF 书签和大纲
通过 IronPDF,您可以用 C# 在 PDF 文档中添加书签(大纲),创建类似于目录的导航辅助工具。 添加单层或多层书签,提高文档的可用性,帮助用户快速跳转到关键部分。 该功能可在Windows、Linux和macOS环境中无缝运行。
快速入门:在 C# 中向 PDF 添加书签
在 PDF 文档中添加书签,快速开始使用 IronPDF。 本指南演示了如何加载现有 PDF、添加导航书签并保存更新后的文档。 非常适合希望在 C# 项目中增强 PDF 功能的开发人员。
最小工作流程(5 个步骤)
- 从 NuGet 下载 IronPDF
- 加载现有或呈现新 PDF 文档
- 添加单层书签以跳转到关键部分
- 为分层组织添加多层书签
- 检索和查看书签属性
如何在 C# 中使用 PDF 书签?
在Adobe Acrobat Reader中,大纲(也叫书签)显示在左侧边栏,为跳转到文档的关键部分提供了一种方便的方法。 书签具有交互式目录的功能,使读者能够高效地浏览复杂的文档。
using IronPDF,您可以导入 PDF 文档,并对现有大纲执行各种操作,如添加、重新排序、编辑属性和删除书签。 这使您可以完全控制 PDF 文件的组织和结构,类似于您可以 合并或分割 PDFs 以进行文档管理。
如何添加单层书签?
在 IronPDF 中添加书签非常简单。 使用AddBookmarkAtEnd方法,指定书签名称和相应的页面索引。 该功能与其他 PDF 操作(如添加页眉和页脚或设置自定义页边距)很好地集成在一起,以创建专业文档。 下面是一个示例:
:path=/static-assets/pdf/content-code-examples/how-to/bookmarks-single-layer-bookmark.cs
using IronPdf;
// Create a new PDF or edit an existing document.
PdfDocument pdf = PdfDocument.FromFile("existing.pdf");
// Add a bookmark
pdf.Bookmarks.AddBookMarkAtEnd("NameOfBookmark", 0);
// Add a sub-bookmark
pdf.Bookmarks.AddBookMarkAtEnd("NameOfSubBookmark", 1);
pdf.SaveAs("singleLayerBookmarks.pdf");
Imports IronPdf
' Create a new PDF or edit an existing document.
Private pdf As PdfDocument = PdfDocument.FromFile("existing.pdf")
' Add a bookmark
pdf.Bookmarks.AddBookMarkAtEnd("NameOfBookmark", 0)
' Add a sub-bookmark
pdf.Bookmarks.AddBookMarkAtEnd("NameOfSubBookmark", 1)
pdf.SaveAs("singleLayerBookmarks.pdf")
AddBookMarkAtStart将书签插入到列表开头。每个书签引用一个特定页面索引,从而可以在文档内实现精确导航。
单层书签文档
如何创建多层书签层次结构?
IronPDF 允许您以树形结构添加书签,这对于保持大型 PDF 文档的可浏览性特别有用。 当在一个 PDF 文档中处理大量不同日期和地点的试卷、销售报告或收据记录时,该功能非常有价值。 结构化书签可以帮助您分层组织复杂的信息,就像您可以创建用于数据收集的 PDF 表单一样。
IPdfBookMark对象。 例如,使用Children.AddBookMarkAtEnd("Date1", 0)为"考试"书签添加子书签。 这种嵌套结构创建了一个层次组织,反映了文档的逻辑流程。 以下代码演示了这一概念:
:path=/static-assets/pdf/content-code-examples/how-to/bookmarks-multi-layer-bookmark.cs
using IronPdf;
// Load existing PDF document
PdfDocument pdf = PdfDocument.FromFile("examinationPaper.pdf");
// Assign IPdfBookMark object to a variable
var mainBookmark = pdf.Bookmarks.AddBookMarkAtEnd("Examination", 0);
// Add bookmark for days
var date1Bookmark = mainBookmark.Children.AddBookMarkAtStart("Date1", 1);
// Add bookmark for type of test
var paperBookmark = date1Bookmark.Children.AddBookMarkAtStart("Paper", 1);
paperBookmark.Children.AddBookMarkAtEnd("PersonA", 3);
paperBookmark.Children.AddBookMarkAtEnd("PersonB", 4);
// Add bookmark for days
var date2Bookmark = mainBookmark.Children.AddBookMarkAtEnd("Date2", 5);
// Add bookmark for type of test
var computerBookmark = date2Bookmark.Children.AddBookMarkAtStart("Computer", 5);
computerBookmark.Children.AddBookMarkAtEnd("PersonC", 6);
computerBookmark.Children.AddBookMarkAtEnd("PersonD", 7);
pdf.SaveAs("multiLayerBookmarks.pdf");
Imports IronPdf
' Load existing PDF document
Private pdf As PdfDocument = PdfDocument.FromFile("examinationPaper.pdf")
' Assign IPdfBookMark object to a variable
Private mainBookmark = pdf.Bookmarks.AddBookMarkAtEnd("Examination", 0)
' Add bookmark for days
Private date1Bookmark = mainBookmark.Children.AddBookMarkAtStart("Date1", 1)
' Add bookmark for type of test
Private paperBookmark = date1Bookmark.Children.AddBookMarkAtStart("Paper", 1)
paperBookmark.Children.AddBookMarkAtEnd("PersonA", 3)
paperBookmark.Children.AddBookMarkAtEnd("PersonB", 4)
' Add bookmark for days
Dim date2Bookmark = mainBookmark.Children.AddBookMarkAtEnd("Date2", 5)
' Add bookmark for type of test
Dim computerBookmark = date2Bookmark.Children.AddBookMarkAtStart("Computer", 5)
computerBookmark.Children.AddBookMarkAtEnd("PersonC", 6)
computerBookmark.Children.AddBookMarkAtEnd("PersonD", 7)
pdf.SaveAs("multiLayerBookmarks.pdf")
在处理需要详细组织的复杂文档时,这种分层方法尤为重要。 嵌套结构允许用户展开和折叠书签部分,即使在数百页的文档中也能直观地进行导航。
多层书签文档
如何从HTML标题自动生成书签?
在将HTML渲染为PDF时,IronPDF可以根据文档的标题结构(h1-h6)或任何自定义CSS选择器自动构建层次书签大纲。 这消除了每个部分手动调用AddBookMarkAtEnd的需要。
在调用AutoBookmarksFromHeadings属性以启用该功能:
:path=/static-assets/pdf/content-code-examples/how-to/bookmarks-auto-from-headings.cs
using IronPdf;
var renderer = new ChromePdfRenderer();
// Master switch: auto-generate bookmarks from HTML headings (h1-h6) during rendering
renderer.RenderingOptions.AutoBookmarksFromHeadings = true;
var html = @"
al Report</h1>
utive Summary</h2>
iew of the year.</p>
ncial Results</h2>
nue</h3>
nses</h3>
ook</h2>
ng forward.</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
// pdf.Bookmarks is already populated with a hierarchical outline matching the heading structure
pdf.SaveAs("auto-bookmarked.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Master switch: auto-generate bookmarks from HTML headings (h1-h6) during rendering
renderer.RenderingOptions.AutoBookmarksFromHeadings = True
Dim html As String = "
al Report</h1>
utive Summary</h2>
iew of the year.</p>
ncial Results</h2>
nue</h3>
nses</h3>
ook</h2>
ng forward.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
' pdf.Bookmarks is already populated with a hierarchical outline matching the heading structure
pdf.SaveAs("auto-bookmarked.pdf")
以下属性控制哪些元素会被书签化:
AutoBookmarksFromHeadings(bool, 默认false):开启功能。 将IronPDF设置为true时,就会自动从HTML标题构建书签大纲。AutoBookmarkMinHeadingLevel(int, 默认1):从最高层级的标题开始。 设置为1以包含h1(文档顶部)。AutoBookmarkMaxHeadingLevel(int, 默认6):包含的最深的标题级别。 设置为3以只书签化h1、h2和h3 - 忽略h4至h6。AutoBookmarkCssSelectors(string[], 默认null):使用自定义CSS选择器代替标题标签。 例如:"[data-bookmark]"。
自定义标题级别和CSS选择器
仅限制顶级标题为书签:
renderer.RenderingOptions.AutoBookmarksFromHeadings = true;
renderer.RenderingOptions.AutoBookmarkMaxHeadingLevel = 3;
renderer.RenderingOptions.AutoBookmarksFromHeadings = true;
renderer.RenderingOptions.AutoBookmarkMaxHeadingLevel = 3;
renderer.RenderingOptions.AutoBookmarksFromHeadings = True
renderer.RenderingOptions.AutoBookmarkMaxHeadingLevel = 3
要为自定义元素添加书签而不是标题,请提供CSS选择器:
renderer.RenderingOptions.AutoBookmarksFromHeadings = true;
renderer.RenderingOptions.AutoBookmarkCssSelectors = new[]
{
"h1",
".chapter-title",
"[data-bookmark]"
};
renderer.RenderingOptions.AutoBookmarksFromHeadings = true;
renderer.RenderingOptions.AutoBookmarkCssSelectors = new[]
{
"h1",
".chapter-title",
"[data-bookmark]"
};
renderer.RenderingOptions.AutoBookmarksFromHeadings = True
renderer.RenderingOptions.AutoBookmarkCssSelectors = New String() {
"h1",
".chapter-title",
"[data-bookmark]"
}
如何查询HTML元素的渲染位置?
渲染后,IronPDF可以准确报告某个给定HTML元素所处的页面和坐标。 这取代了先渲染、提取文本然后手动搜索页面的旧解决方法。
在渲染前在GetElementLocations:
:path=/static-assets/pdf/content-code-examples/how-to/bookmarks-element-locations.cs
using IronPdf;
using System;
var renderer = new ChromePdfRenderer();
// Configure which elements should be queryable after rendering
renderer.RenderingOptions.ElementQuerySelectors = new[] { "h1", ".kpi-card" };
var html = @"
ashboard</h1>
ss='kpi-card'>Revenue: $1.2M</div>
ss='kpi-card'>Growth: 18%</div>
omparison</h1>
ss='kpi-card'>Previous: $1.0M</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// Retrieve the rendered page location of each matched element
foreach (var location in pdf.GetElementLocations())
{
Console.WriteLine($"'{location.Text}' on page {location.PageIndex + 1} " +
$"at ({location.Rectangle.X}, {location.Rectangle.Y})");
}
pdf.SaveAs("dashboard.pdf");
Imports IronPdf
Imports System
Dim renderer As New ChromePdfRenderer()
' Configure which elements should be queryable after rendering
renderer.RenderingOptions.ElementQuerySelectors = New String() {"h1", ".kpi-card"}
Dim html As String = "
ashboard</h1>
ss='kpi-card'>Revenue: $1.2M</div>
ss='kpi-card'>Growth: 18%</div>
omparison</h1>
ss='kpi-card'>Previous: $1.0M</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
' Retrieve the rendered page location of each matched element
For Each location In pdf.GetElementLocations()
Console.WriteLine($"'{location.Text}' on page {location.PageIndex + 1} " &
$"at ({location.Rectangle.X}, {location.Rectangle.Y})")
Next
pdf.SaveAs("dashboard.pdf")
List<RenderedElementLocation>:
| 属性 | 类型 | 它告诉您 |
|---|---|---|
Text |
string |
元素内部的文本。 |
PageIndex |
int |
元素最终位于哪个页面(从0开始)。 |
Rectangle |
IronSoftware.Drawing.Rectangle |
元素在页面上的位置,以PDF点(1/72英寸)为单位。 起点为左下角。 |
ElementIndex |
int |
元素在原始HTML中的顺序(从0开始)。 |
ResetElementLocationCache进行强制重新扫描。将自动书签与元素位置跟踪结合使用
自动书签和元素位置查询可以在单次渲染中结合使用。 例如,从h1/h2标题生成大纲,同时跟踪.invoice-total元素的页面位置:
:path=/static-assets/pdf/content-code-examples/how-to/bookmarks-auto-and-locations.cs
using IronPdf;
using System;
var renderer = new ChromePdfRenderer();
// Auto-generate bookmarks from top-level headings only
renderer.RenderingOptions.AutoBookmarksFromHeadings = true;
renderer.RenderingOptions.AutoBookmarkMaxHeadingLevel = 2;
// Also track the page location of invoice totals after rendering
renderer.RenderingOptions.ElementQuerySelectors = new[] { ".invoice-total" };
var html = @"
ice #2026-001</h1>
Items</h2>
ces rendered for Q1.</p>
='invoice-total'>Subtotal: $4,500.00</p>
ice #2026-002</h1>
Items</h2>
lting hours for Q2.</p>
='invoice-total'>Subtotal: $7,200.00</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
// Bookmarks are populated automatically; locations can be queried after rendering
foreach (var location in pdf.GetElementLocations())
{
Console.WriteLine($"{location.Text} appears on page {location.PageIndex + 1}");
}
pdf.SaveAs("invoices.pdf");
Imports IronPdf
Imports System
Dim renderer As New ChromePdfRenderer()
' Auto-generate bookmarks from top-level headings only
renderer.RenderingOptions.AutoBookmarksFromHeadings = True
renderer.RenderingOptions.AutoBookmarkMaxHeadingLevel = 2
' Also track the page location of invoice totals after rendering
renderer.RenderingOptions.ElementQuerySelectors = New String() {".invoice-total"}
Dim html As String = "
ice #2026-001</h1>
Items</h2>
ces rendered for Q1.</p>
='invoice-total'>Subtotal: $4,500.00</p>
ice #2026-002</h1>
Items</h2>
lting hours for Q2.</p>
='invoice-total'>Subtotal: $7,200.00</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
' Bookmarks are populated automatically; locations can be queried after rendering
For Each location In pdf.GetElementLocations()
Console.WriteLine($"{location.Text} appears on page {location.PageIndex + 1}")
Next
pdf.SaveAs("invoices.pdf")
如何检索和浏览现有书签?
IronPDF 可轻松检索和查看 PDF 文档中的书签。 通过书签树导航变得简单,并无缝访问不同部分。 在处理需要编辑的现有 PDF 文件或在书签部分实现搜索和替换文本等功能时,该功能至关重要。 请看上面的多层书签文档示例。
"考试"书签有一个Children属性指向"Date1"和"Date2"书签。 "Date1"书签有一个NextBookmark属性指向"Date2"书签。 此外,"Date1"书签还有一个Children属性,包含"Paper"书签。 这种相互关联的结构允许复杂的导航模式和文档组织。
要检索打开的PDF文档中的所有书签,请使用GetAllBookmarks方法。 这提供了所有书签的综合列表,使您能够分析和利用书签结构:
:path=/static-assets/pdf/content-code-examples/how-to/bookmarks-retrieve-bookmark.cs
using IronPdf;
// Load existing PDF document
PdfDocument pdf = PdfDocument.FromFile("multiLayerBookmarks.pdf");
// Retrieve bookmarks list
var mainBookmark = pdf.Bookmarks.GetAllBookmarks();
Imports IronPdf
' Load existing PDF document
Private pdf As PdfDocument = PdfDocument.FromFile("multiLayerBookmarks.pdf")
' Retrieve bookmarks list
Private mainBookmark = pdf.Bookmarks.GetAllBookmarks()
合并两个书签名称相同的 PDF 文档可能会破坏书签列表。
-1。了解如何在以下文章中从HTML生成PDF时创建目录:"使用IronPDF创建目录。"
准备好看看您还能做些什么吗? 在这里查看我们的教程页面:组织PDF
常见问题解答
如何用 C# 在 PDF 文档中添加书签?
IronPDF 可让您用 C# 在 PDF 文档中轻松添加书签。您可以使用 AddBookmarkAtEnd 方法,通过指定书签名称和页面索引来添加单层书签。例如:pdf.Bookmarks.AddBookMarkAtEnd("Chapter 1",1)。这可以创建类似于目录的导航辅助工具,帮助用户快速跳转到关键章节。
AddBookmarkAtEnd 和 AddBookmarkAtStart 方法有什么区别?
IronPDF 提供了两种书签放置方法。AddBookMarkAtEnd 方法会将书签添加到现有书签列表的末尾,而 AddBookMarkAtStart 则会在列表的开头插入书签。这两种方法都会引用特定的页面索引,以便在文档中进行精确导航。
能否创建多层次的分级书签结构?
是的,IronPDF 允许您以树形结构创建多层书签层次结构。这对于组织具有嵌套部分的复杂文档特别有用,类似于您如何组织具有章节和子章节的详细目录。
书签功能是否兼容不同的操作系统?
IronPDF 的书签功能可在 Windows、Linux 和 macOS 环境下无缝运行。无论您的操作系统如何,您都可以添加、编辑和管理 PDF 书签,确保在不同平台上实现一致的功能。
我可以对现有 PDF 书签执行哪些操作?
using IronPDF,您可以对现有的 PDF 大纲执行各种操作,包括添加新书签、重新排列书签顺序、编辑书签属性以及删除不需要的书签。这样,您就可以完全控制 PDF 文件的组织和结构。
用户打开 PDF 时如何显示书签?
在 Adobe Acrobat Reader 和类似的 PDF 阅读器中,使用 IronPDF 创建的书签会在左侧边栏显示为轮廓。它们具有交互式目录的功能,允许读者通过点击跳转到特定部分来高效地浏览复杂的文档。

