我需要用页码创建目录,但是我不知道如何。下一个格式:
heading1 ----------------page number
subHeading1---------------page number
subHeading2---------------page number
heading2-----------------page number
我读了几篇文章,听不懂。特别地,我的意思是this文章,其中“命名的目的地”和“转到操作”对我来说很有用,但我不知道如何在iTextSharp中使用它。
在我的代码中,我有一些“章节”和“部分”,我想接受它并创建一个目录。我了解我需要使用PdfPageEventHelper和OnChapter。
最佳答案
您可能已经用名字自己实现了,但是为了完整起见,我自己举了一个小例子。
请看看CreateTOC示例。它创建带有一些随机文本的PDF:
您可以清楚地看到标题和标题下的内容。添加完所有内容后,我们将开始一个新页面,并添加一个目录:
目录由一系列键值对组成,其中键是标题,值是页码。我们在页面事件中创建此列表:
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();
我们遍历此列表,并为每个条目编写一个
Paragraph
:for (SimpleEntry<String, Integer> entry : entries) {
p = new Paragraph(entry.getKey());
p.add(dottedLine);
p.add(String.valueOf(entry.getValue()));
document.add(p);
}
没有人可以说这很困难。事件类占用少于10行代码。添加对子标题的支持将添加少量行,但这也不应该很困难。这是建立树形结构并在必要时引入一些缩进的问题。