Skip to content

大纲(Outline)

福昕 PDF SDK 安卓版通过 Core SDK 提供了 PDF 大纲(书签)的读取、创建、编辑和删除能力。大纲以树形结构组织,每个节点可包含标题、目标位置(Destination)或动作(Action),帮助用户快速定位文档中的内容。

UI Extensions 内置大纲面板

如果您使用的是完整阅读器(UI Extensions),大纲功能已内置在侧边面板中(OutlineModule),用户可直接通过面板查看和点击大纲节点跳转到对应页面,无需额外编码。

核心类

说明
Bookmark大纲节点,支持获取/设置标题、颜色、样式、目标位置和动作
Destination目标位置,定义跳转页面及缩放方式
Action动作对象,可关联到大纲节点(如 GoTo、URI 等)

大纲树结构

访问大纲树前,需先通过 PDFDoc.getRootBookmark() 获取根节点。根节点是一个抽象节点,不包含标题等数据,仅用于作为树的入口。如果文档不包含大纲,可通过 PDFDoc.createRootBookmark() 创建。

从根节点出发,通过 getFirstChild()getNextSibling()getParent() 等方法遍历整棵树。

插入与移动节点

通过 Bookmark.insert() 在指定位置插入新的子节点或同级节点,通过 moveTo() 移动节点到新位置:

位置常量

常量说明
e_PosFirstChild0作为第一个子节点
e_PosLastChild1作为最后一个子节点
e_PosPrevSibling2作为前一个同级节点
e_PosNextSibling3作为后一个同级节点
e_PosFirstSibling4作为同级第一个节点
e_PosLastSibling5作为同级最后一个节点

样式常量

常量说明
e_StyleNormal0x00正常
e_StyleItalic0x01斜体
e_StyleBold0x02粗体

Destination 目标位置

Destination 定义跳转到某一页时的缩放方式和可视区域。可通过静态工厂方法创建:

java
Destination.createXYZ(doc, pageIndex, left, top, zoomFactor)
Destination.createFitPage(doc, pageIndex)
Destination.createFitHorz(doc, pageIndex, top)
Destination.createFitVert(doc, pageIndex, left)
Destination.createFitRect(doc, pageIndex, left, bottom, right, top)
Destination.createFitBBox(doc, pageIndex)

缩放模式常量

常量说明
e_ZoomXYZ1指定坐标与缩放比例
e_ZoomFitPage2适合整页
e_ZoomFitHorz3适合宽度
e_ZoomFitVert4适合高度
e_ZoomFitRect5适合指定矩形区域
e_ZoomFitBBox6适合内容边界框

示例:深度优先遍历大纲树

java
import com.foxit.sdk.pdf.Bookmark;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.actions.Destination;

PDFDoc doc = new PDFDoc("path/to/Sample.pdf");
doc.load(null);

Bookmark root = doc.getRootBookmark();
if (root != null && !root.isEmpty()) {
    traverseBookmarks(root.getFirstChild(), doc);
}

void traverseBookmarks(Bookmark bookmark, PDFDoc doc) throws PDFException {
    if (bookmark == null || bookmark.isEmpty()) return;

    String title = bookmark.getTitle();
    Destination dest = bookmark.getDestination();
    if (dest != null && !dest.isEmpty()) {
        int pageIndex = dest.getPageIndex(doc);
        int zoomMode = dest.getZoomMode();
    }

    // 递归遍历子节点
    if (bookmark.hasChild()) {
        traverseBookmarks(bookmark.getFirstChild(), doc);
    }
    // 遍历同级节点
    traverseBookmarks(bookmark.getNextSibling(), doc);
}

示例:创建大纲节点

java
PDFDoc doc = new PDFDoc("path/to/Sample.pdf");
doc.load(null);

Bookmark root = doc.getRootBookmark();
if (root == null || root.isEmpty()) {
    root = doc.createRootBookmark();
}

// 在根节点下插入第一个子节点
Bookmark chapter1 = root.insert("第一章 概述", Bookmark.e_PosLastChild);
Destination dest = Destination.createFitPage(doc, 0);
chapter1.setDestination(dest);
chapter1.setColor(0x0000FF);
chapter1.setStyle(Bookmark.e_StyleBold);

// 在第一章下插入子节点
Bookmark section1 = chapter1.insert("1.1 背景", Bookmark.e_PosLastChild);
section1.setDestination(Destination.createXYZ(doc, 0, 0, 500, 1.0f));

doc.saveAs("path/to/output.pdf", PDFDoc.e_SaveFlagNormal);

API 参考

BookmarkDestinationAction 的完整接口说明请参阅 API 手册