Skip to content
Guides

大纲

大纲是 PDF 文档的结构化导航工具,通常显示在阅读器的侧边栏或面板中。它可以基于文档中的标题和章节信息自动生成,也可以手动编辑和调整,用于快速定位和浏览文档的不同部分。

获取大纲

PDF 文档中的每个标题或子标题都可以作为大纲树中的一个节点。主标题通常作为根节点,子标题作为子节点,形成树状层级结构。

以下示例通过递归方式获取整棵 PDF 大纲树中的所有节点:

java
public ArrayList<CPDFOutline> getAllOutlines() {
    ArrayList<CPDFOutline> outlineList = new ArrayList<>();
    CPDFOutline pdfOutlineRoot = document.getOutlineRoot();
    if (pdfOutlineRoot == null) {
        return outlineList;
    }
    collectChildOutlines(pdfOutlineRoot, outlineList);
    return outlineList;
}

private void collectChildOutlines(CPDFOutline parent, ArrayList<CPDFOutline> result) {
    CPDFOutline[] childOutlines = parent.getChildList();
    for (CPDFOutline childOutline : childOutlines) {
        result.add(childOutline);
        collectChildOutlines(childOutline, result);
    }
}
kotlin
fun getAllOutlines(): MutableList<CPDFOutline> {
    val pdfOutlineRoot: CPDFOutline = document.getOutlineRoot() ?: return mutableListOf()
    val outlineList = mutableListOf<CPDFOutline>()
    collectChildOutlines(pdfOutlineRoot, outlineList)
    return outlineList
}

private fun collectChildOutlines(parent: CPDFOutline, result: MutableList<CPDFOutline>) {
    parent.childList.forEach { childOutline ->
        result.add(childOutline)
        collectChildOutlines(childOutline, result)
    }
}

新增大纲

以下是新增大纲的步骤:

  1. 获取目标父大纲,如果文档没有根大纲则先创建根大纲
  2. 创建需要新增的大纲
  3. 添加大纲动作,例如跳转到页面
  4. 设置属性

以下是新增大纲的示例代码:

java
// 获取根大纲;如果不存在则先创建
CPDFOutline pdfOutlineRoot = document.getOutlineRoot();
if (pdfOutlineRoot == null) {
    pdfOutlineRoot = document.newOutlineRoot();
}
CPDFOutline insertOutline = pdfOutlineRoot.insertChildAtIndex(0);
// 设置属性 
insertOutline.setTitle("New outline");
// 添加大纲行为,此处为跳转到第一页
int pageIndex = 0;
CPDFDestination destination = new CPDFDestination(pageIndex, 0F, 0, 1F);
insertOutline.setDestination(destination);
kotlin
// 获取根大纲;如果不存在则先创建
val pdfOutlineRoot: CPDFOutline = document.getOutlineRoot() ?: document.newOutlineRoot()
pdfOutlineRoot.insertChildAtIndex(0).apply { 
  // 设置属性 
  title = "insert0"
  // 添加大纲行为,此处为跳转到第一页
  destination = CPDFDestination(0, 0F, 0F, 1F)
}

调整大纲顺序

调整大纲顺序时,需要先确定要移动的大纲节点、目标父节点,以及插入位置索引。

java
// 目标父节点
CPDFOutline newParentOutline;
// 将当前大纲节点移动到目标父节点的 insertIndex 位置
outline.moveTo(newParentOutline, insertIndex);

删除大纲

删除目标大纲,删除大纲后目标大纲的子大纲也将一并删除。

以下示例展示删除大纲的调用方式:

java
outline.removeFormParent();