大纲(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_PosFirstChild | 0 | 作为第一个子节点 |
e_PosLastChild | 1 | 作为最后一个子节点 |
e_PosPrevSibling | 2 | 作为前一个同级节点 |
e_PosNextSibling | 3 | 作为后一个同级节点 |
e_PosFirstSibling | 4 | 作为同级第一个节点 |
e_PosLastSibling | 5 | 作为同级最后一个节点 |
样式常量
| 常量 | 值 | 说明 |
|---|---|---|
e_StyleNormal | 0x00 | 正常 |
e_StyleItalic | 0x01 | 斜体 |
e_StyleBold | 0x02 | 粗体 |
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_ZoomXYZ | 1 | 指定坐标与缩放比例 |
e_ZoomFitPage | 2 | 适合整页 |
e_ZoomFitHorz | 3 | 适合宽度 |
e_ZoomFitVert | 4 | 适合高度 |
e_ZoomFitRect | 5 | 适合指定矩形区域 |
e_ZoomFitBBox | 6 | 适合内容边界框 |
示例:深度优先遍历大纲树
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 参考
Bookmark、Destination、Action 的完整接口说明请参阅 API 手册。