Skip to content

大纲

大纲是 PDF 文档的结构化导航工具,通常显示在文档阅读器的侧边栏或面板上,它通常基于文档中的标题和章节信息自动生成,也可以手动编辑和调整。大纲提供了文档的层次结构,使用户能够更容易地定位和浏览内容,同时可以使用大纲快速导航到文档的不同部分。

展示大纲

PDF 文档每个标题或子标题在大纲树中都是一个节点,节点之间通过分支连接。主标题作为根节点,而子标题则作为根节点的分支,形成了一个树状的结构。

大纲由节点和子节点递归嵌套而成,以层次结构的方式展示文档的组织框架。节点通常表示主要部分,而子节点表示次要部分或章节。

以下是通过递归方式展示 PDF 大纲的示例代码:

swift
// 打印文档大纲信息
func printOutline(document: CPDFDocument) {
    // 从 PDF 文档获取根文件
    if let outline = document.outlineRoot() {
        // 从根目录获取子目录
        loadOutline(outline: outline, level: 0)
    }
}

// 从根目录获取子目录
func loadOutline(outline: CPDFOutline, level: Int) {
    for i in 0..<outline.numberOfChildren {
        if let data = outline.child(at: i) {
            if let destination = data.destination {
                
            } else {
                if let action = data.action as? CPDFGoToAction {
                    if let destination = action.destination() {
                        
                    }
                }
            }

            loadOutline(outline: data, level: level + 1)
        }
    }
}
objective-c
// 打印文档大纲信息
- (void)printOutline:(CPDFDocument *)document {
    // 从PDF文档获取根文件
    CPDFOutline *outline = [document outlineRoot];
    
    // 从根目录获取子目录
    [self loadOutline:outline level:0];
}

// 从根目录获取子目录
- (void)loadOutline:(CPDFOutline *)outline level:(NSInteger)level {
    
    for (int i=0; i<[outline numberOfChildren]; i++) {
        CPDFOutline *data = [outline childAtIndex:i];
        CPDFDestination *destination = [data destination];
        if (!destination) {
            CPDFAction *action = [data action];
            if (action && [action isKindOfClass:[CPDFGoToAction class]]) {
                destination = [(CPDFGoToAction *)action destination];
            }

        [self loadOutline:data level:level+1];
    }
}

新增大纲

以下是新增大纲的步骤:

  1. 找到需要新增大纲位置的父大纲
  2. 创建需要新增的大纲
  3. 添加大纲动作,例如跳转到页面
  4. 设置属性

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

swift
// 找到需要新增大纲位置的父大纲
if let outlineRoot = document?.outlineRoot() {
    // 创建需要新增的大纲
    if let outlinePage = outlineRoot.insertChild(at: 0) {
        // 添加大纲行为,此处为跳转到第一页
        if let destination = CPDFDestination(document: document, pageIndex: 0, at: CGPoint(x: 100, y: 100), zoom: 0) {
            let gotoAction = CPDFGoToAction(destination: destination)
            outlinePage.action = gotoAction
        }
        
        // 设置属性
        outlinePage.label = "1. page1"
    }
}
objective-c
 // 找到需要新增大纲位置的父大纲
 CPDFOutline *outline = [document outlineRoot];
 // 创建需要新增的大纲
 CPDFOutline *outlinePage = [outline insertChildAtIndex:0];
 // 添加大纲行为,此处为跳转到第一页
CPDFDestination *destination = [[CPDFDestination alloc] initWithDocument:document pageIndex:0 atPoint:CGPointMake(100, 100) zoom:0];
CPDFGoToAction *gotoAction = [[CPDFGoToAction alloc] initWithDestination:destination];
outlinePage.action = gotoAction;
 // 设置属性 
outlinePage1.label = @"1. page1";

调整大纲顺序

要移动大纲,使用函数 CPDFOutline::insertChild:atIndex:。在大纲层次结构内移动项目时,您应该保留项目并首先调用 CPDFOutline::removeFromParent

删除大纲

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

以下是删除大纲的示例代码:

swift
var data = outline.child(at: i)
data?.removeFromParent()
objective-c
CPDFOutline *data = [outline childAtIndex:i];
[data removeFromParent]