如何使用iText生成目录“ TOC”?

我创建了一个带有Chapters 的文档。

如何生成此文档的目录?

它看起来应该像这样:

TOC:

Chapter 1 3

Chapter 2 4

Chapter 3 6

Chapter 4 9

Chapter 5 10

回答:

通过使用PdfTemplates 可以实现。PdfTemplates是一种可以稍后填充的占位符。

要在开始时在目录中生成,您需要为目录中的所有页码放置一些占位符。PdfTemplate你收集的那些Map。然后,将Chapters

添加到文档中时,可以填充这些占位符。

此示例显示如何:

public class Main extends PdfPageEventHelper

{

private final Document document;

private final PdfWriter writer;

private final BaseFont baseFont = BaseFont.createFont();

private final Font chapterFont = FontFactory.getFont(FontFactory.HELVETICA, 24, Font.NORMAL);

// table to store placeholder for all chapters and sections

private final Map<String, PdfTemplate> tocPlaceholder = new HashMap<>();

// store the chapters and sections with their title here.

private final Map<String, Integer> pageByTitle = new HashMap<>();

public static void main(final String[] args) throws Exception

{

final Main main = new Main();

main.document.add(new Paragraph("This is an example to generate a TOC."));

main.createTOC(10);

main.createChapters(10);

main.document.close();

}

public Main() throws Exception

{

this.document = new Document(PageSize.A6);

this.writer = PdfWriter.getInstance(this.document, new FileOutputStream("text.pdf"));

this.writer.setPageEvent(this);

this.document.open();

}

@Override

public void onChapter(final PdfWriter writer, final Document document, final float paragraphPosition, final Paragraph title)

{

this.pageByTitle.put(title.getContent(), writer.getPageNumber());

}

@Override

public void onSection(final PdfWriter writer, final Document document, final float paragraphPosition, final int depth, final Paragraph title)

{

this.pageByTitle.put(title.getContent(), writer.getPageNumber());

}

private void createTOC(final int count) throws DocumentException

{

// add a small introduction chapter the shouldn't be counted.

final Chapter intro = new Chapter(new Paragraph("This is TOC ", this.chapterFont), 0);

intro.setNumberDepth(0);

this.document.add(intro);

for (int i = 1; i < count + 1; i++)

{

// Write "Chapter i"

final String title = "Chapter " + i;

final Chunk chunk = new Chunk(title).setLocalGoto(title);

this.document.add(new Paragraph(chunk));

// Add a placeholder for the page reference

this.document.add(new VerticalPositionMark() {

@Override

public void draw(final PdfContentByte canvas, final float llx, final float lly, final float urx, final float ury, final float y)

{

final PdfTemplate createTemplate = canvas.createTemplate(50, 50);

Main.this.tocPlaceholder.put(title, createTemplate);

canvas.addTemplate(createTemplate, urx - 50, y);

}

});

}

}

private void createChapters(final int count) throws DocumentException

{

for (int i = 1; i < count + 1; i++)

{

// append the chapter

final String title = "Chapter " + i;

final Chunk chunk = new Chunk(title, this.chapterFont).setLocalDestination(title);

final Chapter chapter = new Chapter(new Paragraph(chunk), i);

chapter.setNumberDepth(0);

chapter.addSection("Foobar1");

chapter.addSection("Foobar2");

this.document.add(chapter);

// When we wrote the chapter, we now the pagenumber

final PdfTemplate template = this.tocPlaceholder.get(title);

template.beginText();

template.setFontAndSize(this.baseFont, 12);

template.setTextMatrix(50 - this.baseFont.getWidthPoint(String.valueOf(this.writer.getPageNumber()), 12), 0);

template.showText(String.valueOf(this.writer.getPageNumber()));

template.endText();

}

}

}

生成的PDF如下所示:

TableOfContents.pdf

以上是 如何使用iText生成目录“ TOC”? 的全部内容, 来源链接: utcz.com/qa/400800.html

回到顶部