本页内容
大纲
大纲是 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];
}
}
新增大纲
以下是新增大纲的步骤:
- 找到需要新增大纲位置的父大纲
- 创建需要新增的大纲
- 添加大纲动作,例如跳转到页面
- 设置属性
以下是新增大纲的示例代码:
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]