PDF 生成模板编辑器
开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。
大纲是 PDF 文档的结构化导航工具,通常显示在阅读器的侧边栏或面板中。它可以基于文档中的标题和章节信息自动生成,也可以手动编辑和调整,用于快速定位和浏览文档的不同部分。
PDF 文档中的每个标题或子标题都可以作为大纲树中的一个节点。主标题通常作为根节点,子标题作为子节点,形成树状层级结构。
以下示例通过递归方式获取整棵 PDF 大纲树中的所有节点:
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);
}
}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)
}
}以下是新增大纲的步骤:
以下是新增大纲的示例代码:
// 获取根大纲;如果不存在则先创建
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);// 获取根大纲;如果不存在则先创建
val pdfOutlineRoot: CPDFOutline = document.getOutlineRoot() ?: document.newOutlineRoot()
pdfOutlineRoot.insertChildAtIndex(0).apply {
// 设置属性
title = "insert0"
// 添加大纲行为,此处为跳转到第一页
destination = CPDFDestination(0, 0F, 0F, 1F)
}调整大纲顺序时,需要先确定要移动的大纲节点、目标父节点,以及插入位置索引。
// 目标父节点
CPDFOutline newParentOutline;
// 将当前大纲节点移动到目标父节点的 insertIndex 位置
outline.moveTo(newParentOutline, insertIndex);删除目标大纲,删除大纲后目标大纲的子大纲也将一并删除。
以下示例展示删除大纲的调用方式:
outline.removeFormParent();