iText 7中的章节

时间:2016-10-27 13:35:42

标签: itext itext7

我正在寻找使用iText 7创建包含章节和子章节的pdf文件。我已经使用Chapter类找到了以前版本的iText的示例。但是这个类似乎没有包含在iText 7中。

如何在iText7中实现该功能?

1 个答案:

答案 0 :(得分:1)

iText 5中的ChapterSection类存在问题。已经在iText 5中,我们建议人们使用PdfOutline

有关如何创建章节的示例,更具体地说,是书签面板中的相应大纲,请查看iText 7: Building Blocks教程。本教程有一个反复出现的主题:小说“杰基尔博士和海德先生的奇怪案例。”

我们使用该文本和基于这本小说的电影数据库来解释iText 7的工作原理。如果您没有时间阅读,请跳至Chapter 6

在本章中,我们创建了一个如下所示的文档:

enter image description here

您可以在此处下载完整的示例代码: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);
    }
}

在这个例子中,我们遍历一个包含标题和章节的文本文件。每当我们遇到标题时,我们都会创建一个nametitle01title02等等,并且我们使用此命名作为标题段落的命名目标:{{1} }。

我们使用setDestination(name)对象创建轮廓,我们为此定义命名目标,如下所示:PdfOutline

PdfDestination.makeDestination(new PdfString(name))

还有其他方法可以实现此结果,但使用命名目标是最简单的方法。试试这个例子,你会发现这个例子的大多数复杂性都是由于我们将一个简单的文本文件转换成一个带有章节标题和章节内容的文档。