如何在C#中使用IronPDF添加PDF书签和大纲

如何在 C# 中使用 IronPDF 添加 PDF 书签和大纲

This article was translated from English: Does it need improvement?
Translated
View the article in English

通过 IronPDF,您可以用 C# 在 PDF 文档中添加书签(大纲),创建类似于目录的导航辅助工具。 添加单层或多层书签,提高文档的可用性,帮助用户快速跳转到关键部分。 该功能可在WindowsLinuxmacOS环境中无缝运行。

快速入门:在 C# 中向 PDF 添加书签

在 PDF 文档中添加书签,快速开始使用 IronPDF。 本指南演示了如何加载现有 PDF、添加导航书签并保存更新后的文档。 非常适合希望在 C# 项目中增强 PDF 功能的开发人员。

  1. 使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronPdf

    PM > Install-Package IronPdf
  2. 复制并运行这段代码。

    var pdf = new IronPdf.PdfDocument("example.pdf");
    pdf.Bookmarks.AddBookMarkAtEnd("Chapter 1", 1);
    pdf.SaveAs("bookmarked.pdf");
  3. 部署到您的生产环境中进行测试

    通过免费试用立即在您的项目中开始使用IronPDF

    arrow pointer

如何在 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")
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

在处理需要详细组织的复杂文档时,这种分层方法尤为重要。 嵌套结构允许用户展开和折叠书签部分,即使在数百页的文档中也能直观地进行导航。

多层书签文档

如何从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")
$vbLabelText   $csharpLabel

以下属性控制哪些元素会被书签化:

  • 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
$vbLabelText   $csharpLabel

要为自定义元素添加书签而不是标题,请提供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]"
}
$vbLabelText   $csharpLabel

如何查询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")
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

如何检索和浏览现有书签?

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()
$vbLabelText   $csharpLabel

合并两个书签名称相同的 PDF 文档可能会破坏书签列表。

警告仅支持从页面索引创建的书签。 来自其他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 创建的书签会在左侧边栏显示为轮廓。它们具有交互式目录的功能,允许读者通过点击跳转到特定部分来高效地浏览复杂的文档。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
Nuget 下载 20,296,129 | 版本: 2026.7 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronPdf
运行示例看着你的HTML代码变成PDF文件。