iText 7 中的章节

Chapters in iText 7

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

该功能在 iText7 中是如何实现的?

iText 5 中的 ChapterSection class 有问题。在 iText 5 中,我们建议人们使用 PdfOutline.

有关如何创建章节的示例,更具体地说,书签面板中的相应大纲,请查看 iText 7: Building Blocks 教程。本教程有一个反复出现的主题:小说 "The Strange Case of Dr. Jekyll and Mr. Hyde."

我们使用该文本和基于这部小说的电影数据库来解释 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);
    }
}

在这个例子中,我们遍历一个包含标题和章节的文本文件。每次遇到标题,我们都会创建一个nametitle01title02,等等),我们使用这个命名作为标题段落的命名目标:setDestination(name).

我们使用 PdfOutline object 创建大纲,我们为其定义了一个命名目的地,如下所示: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;
}

还有其他方法可以实现此结果,但使用命名目标是最简单的方法。试试这个例子,你会发现这个例子的大部分复杂性是因为我们把一个简单的文本文件变成了一个有章节标题和章节内容的文档。