关于itext7:iText 7中的章节

Chapters in iText 7

我正在使用iText 7创建带有章节和子章节的pdf文件。我已经使用Chapter类找到了iText早期版本的示例。但是,此类似乎未包含在iText 7中。

该功能如何在iText7中实现?


iText 5中的ChapterSection类是有问题的。对于iText 5,我们建议人们使用PdfOutline

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

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

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

enter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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(title01title02等),并将其命名为标题段落的命名目标:setDestination(name)

我们使用PdfOutline对象创建轮廓,为此我们定义一个命名目标,如下所示:PdfDestination.makeDestination(new PdfString(name))

1
2
3
4
5
6
7
8
9
10
11
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;
}

还有其他方法可以实现此结果,但是使用命名目的地是最简单的方法。只需尝试该示例,您就会发现该示例的大部分复杂性是由于我们将一个简单的文本文件转换为具有章标题和章内容的文档而引起的。