gpt4 book ai didi

c# - 如何在 iTextSharp 中创建目录

转载 作者:太空狗 更新时间:2023-10-29 22:57:22 25 4
gpt4 key购买 nike

我需要创建一个带页码的目录,但我不知道怎么做。下一个格式:

heading1 ----------------page number  
subHeading1---------------page number
subHeading2---------------page number
heading2-----------------page number

看了几篇文章,没看懂。特别是,我的意思是 this文章,其中“命名目的地”和“转到操作”我认为对我有用,但我不知道如何在 iTextSharp 中使用它。

在我的代码中,我有一些“章节”和“部分”,我想利用它创建一个目录。我明白我需要使用 PdfPageEventHelper 和 OnChapter。

最佳答案

您可能已经通过名称实现了它,但为了完整起见,我自己做了一个小示例。

请看CreateTOC例子。它创建一个带有一些随机文本的 PDF:

enter image description here

可以清楚的看到标题和标题下的内容。添加完所有内容后,我们开始一个新页面,并添加一个目录:

enter image description here

目录由一系列键值对组成,其中键是标题,值是页码。我们在页面事件中创建此列表:

public class TOCEvent extends PdfPageEventHelper {

protected List<SimpleEntry<String, Integer>> toc = new ArrayList<>();

@Override
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
toc.add(new SimpleEntry(text, writer.getPageNumber()));
}

public List getTOC() {
return toc;
}
}

我们这样使用这个页面事件:

public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
TOCEvent event = new TOCEvent();
writer.setPageEvent(event);
document.open();
for (int i = 0; i < 10; i++) {
String title = "This is title " + i;
Chunk c = new Chunk(title, titleFont);
c.setGenericTag(title);
document.add(new Paragraph(c));
for (int j = 0; j < 50; j++) {
document.add(new Paragraph("Line " + j + " of title " + i));
}
}
document.newPage();
document.add(new Paragraph("Table of Contents", titleFont));
Chunk dottedLine = new Chunk(new DottedLineSeparator());
List<SimpleEntry<String, Integer>> entries = event.getTOC();
Paragraph p;
for (SimpleEntry<String, Integer> entry : entries) {
p = new Paragraph(entry.getKey());
p.add(dottedLine);
p.add(String.valueOf(entry.getValue()));
document.add(p);
}
document.close();
}

首先我们创建一个事件的实例并向作者声明它:

TOCEvent event = new TOCEvent();
writer.setPageEvent(event);

我们使用 setGenericTag() 标记标题:

String title = "This is title " + i;
Chunk c = new Chunk(title, titleFont);
c.setGenericTag(title);
document.add(new Paragraph(c));

一旦我们添加完内容,我们就得到了所有条目:

List<SimpleEntry<String, Integer>> entries = event.getTOC();

我们遍历这个列表并为每个条目组成一个段落:

for (SimpleEntry<String, Integer> entry : entries) {
p = new Paragraph(entry.getKey());
p.add(dottedLine);
p.add(String.valueOf(entry.getValue()));
document.add(p);
}

没有人会说这很困难。事件类只需要不到 10 行代码。添加对副标题的支持会增加几行,但这应该也不难。这是构建树结构并在必要时引入一些缩进的问题。

关于c# - 如何在 iTextSharp 中创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39037594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com