如何在 Java 中添加 PDF 书签和大纲
IronPDF 的 Java 库允许您通过 BookmarkManager 类以编程方式向 PDF 文档添加书签和目录,支持单层和多层书签结构,并提供可自定义的导航点。
快速入门:在 Java 中添加 PDF 书签
- 安装 IronPDF Java 库并设置您的许可证密钥
- 使用
PdfDocument.fromFile()加载您的 PDF - 使用
BookmarkManager获取pdf.getBookmark() - 使用
addBookMarkAtEnd("Title", pageNumber)添加书签 - 使用
pdf.saveAs()保存 PDF
```java :title=快速入门 //:path=/static-assets/ironpdf-java/content-code-examples/how-to/bookmarks/quickstart.java PdfDocument pdf = PdfDocument.fromFile(Path.of("document.pdf")); BookmarkManager bookmarks = pdf.getBookmark(); bookmarks.addBookMarkAtEnd("Chapter 1", 0); pdf.saveAs(Path.of("bookmarked.pdf"));
PDF书签改善了文档的可用性和导航。 大纲提供了PDF内部的结构化导航,使用户可以直接跳转到关键部分,就像目录一样。 这在处理需要组织导航的长篇文档、报告或多章节PDF时至关重要。
IronPDF for Java 简化了 Java 应用程序中的 PDF 操作。 书签API为您提供了创建PDF文件自定义书签的简单方法。 该库与Java应用结合,还支持除书签外的各种PDF处理功能,包括[合并PDF](https://ironpdf.com/java/how-to/java-merge-pdf-tutorial/)、[创建表单](https://ironpdf.com/java/how-to/create-forms/),[添加水印](https://ironpdf.com/java/how-to/custom-watermark/)。
<div class="hsg-featured-snippet">
<h2>如何添加PDF书签和大纲</h2>
<ol>
<li><a href="https://ironpdf.com/java/#download-modal">安装Java库以在PDF中添加书签</a></li>
<li>使用<strong>PdfDocument</strong>类在Java中加载现有PDF文件</li>
<li>使用<strong>BookmarkManager</strong>类创建和自定义书签</li>
<li>使用 <code>addBookMarkAtEnd</code> 为 PDF 的特定页面添加书签</li>
<li>保存包含新目录和书签的 PDF 文档</li>
</ol>
</div>
## 开始之前我需要什么?
在实现PDF书签之前,请确认IronPDF已在您的Java项目中配置。 该库需要Java 8或更高版本,并通过[Maven或Gradle](https://central.sonatype.com/artifact/com.ironsoftware/ironpdf)集成。 将IronPDF依赖项添加到项目的构建文件中。有关详细设置说明,请参阅[快速入门概述](https://ironpdf.com/java/docs/)。
开发和生产使用需要有效的许可证密钥。 在调用任何IronPDF方法之前,在应用程序开头设置许可证密钥。 有关许可选项的信息,请访问[许可指南](https://ironpdf.com/java/get-started/license-keys/)。
提示IronPDF中的所有页面索引使用零基编号。 您的文档的第1页为索引0,第2页为索引1,以此类推。
## 如何向PDF添加大纲和书签?
以下示例使用此[示例PDF](/static-assets/ironpdf-java/howto/bookmarks/NovelSample.pdf)演示大纲和书签创建。 该流程包括加载现有 PDF 文档,并使用 IronPDF 的 `BookmarkManager` 在文档中添加导航点。
### 如何添加单层书签?
平面书签列表适合具有明确的、非层次结构的文档:报告、产品手册或幻灯片演示文稿,各部分独立。 使用 `PdfDocument.fromFile()` 从文件路径加载 PDF 后,获取 `BookmarkManager` 对象以开始添加书签。
`addBookMarkAtEnd` 和 `addBookMarkAtStart` 方法分别用于在书签集合的末尾或开头添加条目。 这些方法可以灵活地组织书签以匹配文档的结构。 每个条目都接受显示标题和零基页面索引。
```java
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/bookmarks/single-layer.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.bookmark.BookmarkManager;
public class Main {
public static void main(String[] args) throws IOException {
// Set the license key for IronPDF
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF file
PdfDocument pdf = PdfDocument.fromFile(Path.of("NovelSample.pdf"));
// Get BookmarkManager object to manage bookmarks
BookmarkManager bookmarks = pdf.getBookmark();
// Add bookmarks at the end of the bookmark collection
bookmarks.addBookMarkAtEnd("Title Page", 0);
bookmarks.addBookMarkAtEnd("Table of Contents", 1);
bookmarks.addBookMarkAtEnd("Dedication Page", 2);
bookmarks.addBookMarkAtEnd("First Page", 3);
bookmarks.addBookMarkAtStart("Page 4", 6);
// Save the modified PDF with bookmarks
pdf.saveAs(Path.of("bookmarked.pdf"));
}
}
在上方PDF查看器中,检查大多数浏览器左上角的目录以查看所有已添加的书签。 这种平面书签结构为简单组织需求的文档提供了直接的导航。
如何创建多层书签?
嵌套书签适用于技术文档、研究报告或任何多章文档,读者需要导航到不仅是章节,还有这些章节内的小节。 请从上一节创建的相同平面书签开始,然后使用 insertBookmark 在新图层上添加条目。
insertBookmark 方法接受四个参数:书签名称、目标页面索引、父书签名称以及前一个同级书签名称。 传递父书签名称会创建一个嵌套在其下的子条目。 将 sibling 参数设置为 null 会将新条目作为该父节点的第一个子节点。
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/bookmarks/multi-layer.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.bookmark.BookmarkManager;
public class Main {
public static void main(String[] args) throws IOException {
// Set the license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF file
PdfDocument pdf = PdfDocument.fromFile(Path.of("NovelSample.pdf"));
// Get BookmarkManager object
BookmarkManager bookmarks = pdf.getBookmark();
// Add top-level bookmarks at the end
bookmarks.addBookMarkAtEnd("Title Page", 0);
bookmarks.addBookMarkAtEnd("Table of Contents", 1);
bookmarks.addBookMarkAtEnd("Dedication", 2);
// Insert second-layer bookmarks as children of existing entries
bookmarks.insertBookmark("First Page", 3, "Table of Contents", null);
bookmarks.insertBookmark("Second Page", 4, "Table of Contents", "First Page");
bookmarks.insertBookmark("End of Sample", 7, "Title Page", null);
bookmarks.insertBookmark("Fourth page", 6, "Table of Contents", "Second Page");
// Save the modified PDF with nested bookmarks
pdf.saveAs(Path.of("multiLayer.pdf"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/bookmarks/multi-layer.java
import java.io.IOException;
import java.nio.file.Path;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.bookmark.BookmarkManager;
public class Main {
public static void main(String[] args) throws IOException {
// Set the license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF file
PdfDocument pdf = PdfDocument.fromFile(Path.of("NovelSample.pdf"));
// Get BookmarkManager object
BookmarkManager bookmarks = pdf.getBookmark();
// Add top-level bookmarks at the end
bookmarks.addBookMarkAtEnd("Title Page", 0);
bookmarks.addBookMarkAtEnd("Table of Contents", 1);
bookmarks.addBookMarkAtEnd("Dedication", 2);
// Insert second-layer bookmarks as children of existing entries
bookmarks.insertBookmark("First Page", 3, "Table of Contents", null);
bookmarks.insertBookmark("Second Page", 4, "Table of Contents", "First Page");
bookmarks.insertBookmark("End of Sample", 7, "Title Page", null);
bookmarks.insertBookmark("Fourth page", 6, "Table of Contents", "Second Page");
// Save the modified PDF with nested bookmarks
pdf.saveAs(Path.of("multiLayer.pdf"));
}
}
上方的 PDF 展示了由 insertBookmark 创建的书签树结构。 展开大纲面板以验证每个子条目如何嵌套在其父级下。 这种分层方法适合章节、子章节和附录的报告。
如何从 PDF 中检索现有书签?
从PDF中读取书签数据是更新文档而不重建整个导航结构的先决条件。 IronPDF 通过与添加书签相同的 BookmarkManager 接口实现了这一功能。 使用 PdfDocument.fromFile() 加载 PDF,访问 BookmarkManager,然后调用 getBookmarks() 来检索所有顶级书签。
使用 get(index) 可根据列表中的位置访问特定书签。getText() 方法返回书签的显示标签,而 getPageIndex() 则返回其指向的以零为起点的页码。 子书签不包含在 getBookmarks() 返回的扁平列表中; 可通过每个父级书签的 getChildren() 方法访问它们。
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/bookmarks/retrieve-bookmarks.java
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.bookmark.Bookmark;
import com.ironsoftware.ironpdf.bookmark.BookmarkManager;
public class Main {
public static void main(String[] args) throws IOException {
// Set the license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF file with bookmarks
PdfDocument pdf = PdfDocument.fromFile(Path.of("bookmarked.pdf"));
// Retrieve the bookmark manager
BookmarkManager bookmarks = pdf.getBookmark();
// Retrieve list of all bookmarks (includes child bookmarks)
List<Bookmark> bookmarkList = bookmarks.getBookmarks();
// Access a specific bookmark by zero-based index
Bookmark bookmark = bookmarkList.get(2);
// Print bookmark details
System.out.println("Bookmark Title: " + bookmark.getText());
System.out.println("Page Number: " + bookmark.getPageIndex());
// Check if bookmark has children
if (bookmark.getChildren() != null && !bookmark.getChildren().isEmpty()) {
System.out.println("Number of child bookmarks: " + bookmark.getChildren().size());
}
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/bookmarks/retrieve-bookmarks.java
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.bookmark.Bookmark;
import com.ironsoftware.ironpdf.bookmark.BookmarkManager;
public class Main {
public static void main(String[] args) throws IOException {
// Set the license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF file with bookmarks
PdfDocument pdf = PdfDocument.fromFile(Path.of("bookmarked.pdf"));
// Retrieve the bookmark manager
BookmarkManager bookmarks = pdf.getBookmark();
// Retrieve list of all bookmarks (includes child bookmarks)
List<Bookmark> bookmarkList = bookmarks.getBookmarks();
// Access a specific bookmark by zero-based index
Bookmark bookmark = bookmarkList.get(2);
// Print bookmark details
System.out.println("Bookmark Title: " + bookmark.getText());
System.out.println("Page Number: " + bookmark.getPageIndex());
// Check if bookmark has children
if (bookmark.getChildren() != null && !bookmark.getChildren().isEmpty()) {
System.out.println("Number of child bookmarks: " + bookmark.getChildren().size());
}
}
}
getBookmarks() 方法仅返回一个包含顶级书签的扁平列表。 要遍历完整的书签树,需对每个包含嵌套条目的书签递归调用 getChildren()。)}]这种检索模式在分发前审计现有PDF的导航结构时很有用,或在构建工具时需要验证必需的部分在发布前正确加书签。
如何在特定索引处插入书签?
在特定位置插入书签允许您逐步更新现有PDF,在不从头重建完整大纲的情况下添加新部分。 当PDF在流水线中生成或修改,新内容在下游追加时,这尤其有用。
使用 getBookmarks() 检索平面书签列表,根据列表索引选择目标书签,然后调用 addNextBookmark 将其后立即插入一个新的同级书签。 使用 addChildBookmark 可在所选书签下嵌套一个新条目,使其位于更深一层。 这两种方法都接受标题字符串和零基页面索引。
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/bookmarks/insert-at-index.java
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.bookmark.Bookmark;
import com.ironsoftware.ironpdf.bookmark.BookmarkManager;
public class Main {
public static void main(String[] args) throws IOException {
// Set the license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF modified in the multi-layer example
PdfDocument pdf = PdfDocument.fromFile(Path.of("multiLayer.pdf"));
// Get the BookmarkManager
BookmarkManager bookmarks = pdf.getBookmark();
// Retrieve the flat bookmark list
List<Bookmark> bookmarkList = bookmarks.getBookmarks();
// Select a bookmark at a specific index
Bookmark bookmark = bookmarkList.get(5);
// Insert a new bookmark after the selected entry
bookmark.addNextBookmark("Fourth Page", 6);
// Add a child bookmark under the selected entry
bookmark.addChildBookmark("Section 1", 7);
// Save the updated PDF
pdf.saveAs(Path.of("specificIndex.pdf"));
}
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/bookmarks/insert-at-index.java
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import com.ironsoftware.ironpdf.bookmark.Bookmark;
import com.ironsoftware.ironpdf.bookmark.BookmarkManager;
public class Main {
public static void main(String[] args) throws IOException {
// Set the license key
License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");
// Load the PDF modified in the multi-layer example
PdfDocument pdf = PdfDocument.fromFile(Path.of("multiLayer.pdf"));
// Get the BookmarkManager
BookmarkManager bookmarks = pdf.getBookmark();
// Retrieve the flat bookmark list
List<Bookmark> bookmarkList = bookmarks.getBookmarks();
// Select a bookmark at a specific index
Bookmark bookmark = bookmarkList.get(5);
// Insert a new bookmark after the selected entry
bookmark.addNextBookmark("Fourth Page", 6);
// Add a child bookmark under the selected entry
bookmark.addChildBookmark("Section 1", 7);
// Save the updated PDF
pdf.saveAs(Path.of("specificIndex.pdf"));
}
}
addNextBookmark 方法将新条目作为所选书签的同级条目插入,使其在列表中紧跟在所选书签之后。addChildBookmark 方法将新条目置于更深一层,作为所选书签的子条目进行嵌套。 这两种方法都接受标题字符串和零基页面索引。
Java中的PDF书签的下一步是什么?
PDF书签为用户提供了一个直接的导航路径,通过复杂文档而无需滚动。 IronPDF 的 BookmarkManager 支持全套书签操作:添加扁平条目列表、构建深度多级大纲、检索现有条目,以及在特定位置插入条目。
要继续研究文档结构和导航功能,请探索这些相关资源:
- 在Java中拆分PDF:创建更小的、包含自己书签结构的独立文档
- 在Java中打印PDF:将带书签的文件发送到打印机,并保留导航
- Java PDF教程:常见PDF工作流程的端到端示例
- 在Java中添加PDF注释:将注释和标记附加到特定页面位置
- IronPDF for Java示例:复制粘贴代码示例来完整使用IronPDF Java API
开始您的免费试用,将书签、大纲和其他导航功能添加到您的Java PDF工作流程。 要购买用于生产使用的许可证,请查看许可证选项。
常见问题解答
如何在 Java PDF 文档中添加书签?
使用PdfDocument.fromFile()加载PDF,然后调用pdf.getBookmark()获取BookmarkManager。使用addBookMarkAtEnd("Title", pageIndex)通过显示名称和零基页码添加每个书签,然后使用pdf.saveAs()保存。
在Java中添加PDF书签的先决条件是什么?
您需要Java 8或更高版本,作为Maven或Gradle依赖添加的IronPDF库,并在任何IronPDF调用之前使用License.setLicenseKey()设置有效的许可证密钥。不需要其他工具或框架。
能否在 PDF 中创建多级书签层次结构?
是的。首先使用addBookMarkAtEnd添加顶级书签,然后调用insertBookmark(name, pageIndex, parentName, siblingName)将子条目嵌套于父书签下。传递null作为兄弟名称以将新条目放置为第一个子项。
addBookMarkAtEnd和insertBookmark有什么区别?
addBookMarkAtEnd在书签列表的末尾附加一个新的顶级条目。insertBookmark通过指定父书签名称和可选的先前兄弟将书签放置在层次结构中的特定位置,启用嵌套大纲。
如何从Java中的PDF读取现有书签?
调用pdf.getBookmark().getBookmarks()获取顶级书签的平面列表。使用list.get(index)按索引访问单个条目。使用bookmark.getText()获取标题,并使用bookmark.getPageIndex()获取零基页码。通过bookmark.getChildren()访问子书签。
如何在特定现有书签后插入书签?
使用getBookmarks()检索书签列表,通过索引选择目标条目,然后调用bookmark.addNextBookmark("Title", pageIndex)在其后立即插入兄弟书签,或bookmark.addChildBookmark("Title", pageIndex)在其下嵌套一个新条目。


