【发布时间】:2016-10-27 13:35:41
【问题描述】:
我正在寻找使用 iText 7 创建包含章节和子章节的 pdf 文件。我找到了使用 Chapter 类的 iText 以前版本的示例。但是这个类似乎没有包含在 iText 7 中。
该功能在 iText7 中是如何实现的?
【问题讨论】:
我正在寻找使用 iText 7 创建包含章节和子章节的 pdf 文件。我找到了使用 Chapter 类的 iText 以前版本的示例。但是这个类似乎没有包含在 iText 7 中。
该功能在 iText7 中是如何实现的?
【问题讨论】:
iText 5 中的 Chapter 和 Section 类存在问题。在 iText 5 中,我们建议人们使用 PdfOutline。
有关如何创建章节的示例,更具体地说,书签面板中的相应大纲,请查看iText 7: Building Blocks 教程。本教程有一个反复出现的主题:小说《杰基尔博士和海德先生的奇案》。
我们使用该文本和包含基于这本小说的电影的数据库来解释 iText 7 的工作原理。如果你没有时间阅读,请跳转到Chapter 6。
在本章中,我们创建一个如下所示的文档:
您可以在这里下载完整的示例代码:TOC_OutlinesDestinations
BufferedReader br = new BufferedReader(new FileReader(SRC));
String name, line;
Paragraph p;
boolean title = true;
int counter = 0;
PdfOutline outline = null;
while ((line = br.readLine()) != null) {
p = new Paragraph(line);
p.setKeepTogether(true);
if (title) {
name = String.format("title%02d", counter++);
outline = createOutline(outline, pdf, line, name);
p.setFont(bold).setFontSize(12)
.setKeepWithNext(true)
.setDestination(name);
title = false;
document.add(p);
}
else {
p.setFirstLineIndent(36);
if (line.isEmpty()) {
p.setMarginBottom(12);
title = true;
}
else {
p.setMarginBottom(0);
}
document.add(p);
}
}
在这个例子中,我们遍历一个包含标题和章节的文本文件。每次遇到标题时,我们都会创建一个name(title01、title02 等),并将其命名为标题段落的命名目标:setDestination(name)。
我们使用PdfOutline 对象创建轮廓,我们为其定义一个命名目的地,如下所示:PdfDestination.makeDestination(new PdfString(name))
public PdfOutline createOutline(PdfOutline outline, PdfDocument pdf, String title, String name) {
if (outline == null) {
outline = pdf.getOutlines(false);
outline = outline.addOutline(title);
outline.addDestination(PdfDestination.makeDestination(new PdfString(name)));
return outline;
}
PdfOutline kid = outline.addOutline(title);
kid.addDestination(PdfDestination.makeDestination(new PdfString(name)));
return outline;
}
还有其他方法可以实现此结果,但使用命名目的地是最简单的方法。试试这个例子,你会发现这个例子的大部分复杂性是因为我们把一个简单的文本文件变成了一个包含章节标题和章节内容的文档。
【讨论】: