1

I'm looking to create a pdf file with chapters and sub chapters with iText 7. I've found examples for previous versions of iText using the Chapter class. However this class does not seem to be included in iText 7.

How is that functionality implemented in iText7?

4

1 回答 1

2

iText 5 中的ChapterandSection类是有问题的。在 iText 5 中,我们建议人们使用PdfOutline.

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

我们使用该文本和包含基于这本小说的电影的数据库来解释 iText 7 的工作原理。如果您没有时间阅读,请跳至第 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;
}

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

于 2016-10-27T13:48:27.870 回答