如何在 Java 中添加 PDF 书签和大纲

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

IronPDF的Java库使您可以通过BookmarkManager类以编程方式向PDF文档添加书签和大纲,支持单层和多层书签结构并具备可定制的导航点。

快速入门:在 Java 中添加 PDF 书签

  1. 安装 IronPDF Java 库并设置您的许可证密钥
  2. 使用PdfDocument.fromFile()加载您的PDF
  3. 使用BookmarkManager
  4. 使用addBookMarkAtEnd("Title", pageNumber)添加书签
  5. 使用pdf.saveAs()保存PDF
 :title=Quickstart
//: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"));
 :title=Quickstart
//: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"));
JAVA

PDF书签改善了文档的可用性和导航。 大纲提供了PDF内部的结构化导航,使用户可以直接跳转到关键部分,就像目录一样。 这在处理需要组织导航的长篇文档、报告或多章节PDF时至关重要。

IronPDF for Java 简化了 Java 应用程序中的 PDF 操作。 书签API为您提供了创建PDF文件自定义书签的简单方法。 该库与Java应用结合,还支持除书签外的各种PDF处理功能,包括合并PDF创建表单添加水印

开始之前我需要什么?

在实现PDF书签之前,请确认IronPDF已在您的Java项目中配置。 该库需要Java 8或更高版本,并通过Maven或Gradle集成。 将IronPDF依赖项添加到项目的构建文件中。有关详细设置说明,请参阅快速入门概述

开发和生产使用需要有效的许可证密钥。 在调用任何IronPDF方法之前,在应用程序开头设置许可证密钥。 有关许可选项的信息,请访问许可指南

提示IronPDF中的所有页面索引使用零基编号。 您的文档的第1页为索引0,第2页为索引1,以此类推。

如何向PDF添加大纲和书签?

以下示例使用此示例PDF演示大纲和书签创建。 该过程包括加载现有的PDF文档并使用IronPDF的BookmarkManager在整个文档中添加导航点。

如何添加单层书签?

平面书签列表适合具有明确的、非层次结构的文档:报告、产品手册或幻灯片演示文稿,各部分独立。 使用BookmarkManager对象以开始添加书签。

addBookMarkAtStart方法分别在书签集合的末尾或开头添加条目。 这些方法可以灵活地组织书签以匹配文档的结构。 每个条目都接受显示标题和零基页面索引。

//: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"));
    }
}
//: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"));
    }
}
JAVA

在上方PDF查看器中,检查大多数浏览器左上角的目录以查看所有已添加的书签。 这种平面书签结构为简单组织需求的文档提供了直接的导航。

如何创建多层书签?

嵌套书签适用于技术文档、研究报告或任何多章文档,读者需要导航到不仅是章节,还有这些章节内的小节。 从前面部分创建的相同的平面书签开始,然后使用insertBookmark在新层上添加条目。

insertBookmark方法接受四个参数:书签名称、目标页面索引、父书签名称和前置兄弟书签名称。 传递父书签名称会创建一个嵌套在其下的子条目。 将兄弟参数设置为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"));
    }
}
JAVA

上面的PDF展示了由insertBookmark创建的书签树结构。 展开大纲面板以验证每个子条目如何嵌套在其父级下。 这种分层方法适合章节、子章节和附录的报告。


Icon Quote related to 如何创建多层书签?

我最喜欢的这种库是 IronPDF。它允许快速高效地操作 PDF 文件。它还具有许多有价值的功能,比如导出为 PDF/A 格式和数字签名 PDF 文档。

Milan Jovanovic related to 如何创建多层书签?

Milan Jovanovic

微软MVP

查看案例研究
Icon Quote related to 如何创建多层书签?

IronOCR 意味着我们每年可以节省 $40,000 的人工处理成本,同时提高生产力,并释放资源用于高影响任务。我强烈推荐它。

Brent Matzelle related to 如何创建多层书签?

Brent Matzelle

首席技术官,OPYN

查看案例研究
Icon Quote related to 如何创建多层书签?

Iron Suite 在我们的运营中起着至关重要的作用。这些工具提高了业务各方面的效率,包括创建平面图和改善库存管理。

David Jones related to 如何创建多层书签?

David Jones

首席软件工程师,Agorus Build

查看案例研究

如何从 PDF 中检索现有书签?

从PDF中读取书签数据是更新文档而不重建整个导航结构的先决条件。 IronPDF通过用于添加书签的同一BookmarkManager接口提供此功能。 使用getBookmarks()检索所有顶级书签。

使用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());
        }
    }
}
JAVA

请注意getBookmarks()方法仅返回顶级书签的平面列表。 若要遍历完整的书签树,递归调用getChildren()在每个具有嵌套条目的书签上。

这种检索模式在分发前审计现有PDF的导航结构时很有用,或在构建工具时需要验证必需的部分在发布前正确加书签。


如何在特定索引处插入书签?

在特定位置插入书签允许您逐步更新现有PDF,在不从头重建完整大纲的情况下添加新部分。 当PDF在流水线中生成或修改,新内容在下游追加时,这尤其有用。

使用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"));
    }
}
JAVA

请注意合并两个书签名称相同的PDF时,合并后的书签列表可能表现异常。 在合并前重命名冲突的书签以维持干净的大纲。)]

addChildBookmark方法将新条目放置在更深一级,嵌套在所选书签下。 这两种方法都接受标题字符串和零基页面索引。

Java中的PDF书签的下一步是什么?

PDF书签为用户提供了一个直接的导航路径,通过复杂文档而无需滚动。 IronPDF的BookmarkManager处理了完整的书签操作范围:添加平面条目列表、建立深层多层大纲、检索现有条目以及在特定位置插入。

要继续研究文档结构和导航功能,请探索这些相关资源:

开始您的免费试用,将书签、大纲和其他导航功能添加到您的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)在其下嵌套一个新条目。

Darrius Serrant
全栈软件工程师(WebOps)

Darrius Serrant 拥有迈阿密大学的计算机科学学士学位,目前在 Iron Software 担任全栈 WebOps 市场工程师。从小就被编码吸引,他认为计算机既神秘又易于接触,使其成为创意和问题解决的理想媒介。

在 Iron Software,Darrius 喜欢创造新事物,并简化复杂概念以使其更易理解。作为我们常驻的开发者之一,他还自愿教授学生,与下一代分享他的专业知识。

对于 Darrius 来说,他的工作令人满意,因为它被重视并产生真正的影响。

准备开始了吗?
版本: 2026.6 刚刚发布
Still Scrolling Icon

还在滚动吗?

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