如何在iTextSharp中创建目录 [英] How to create Table Of Contents in iTextSharp
问题描述
我需要使用页码创建内容表,但我不知道如何。下一个格式:
heading1 ----------------页码
subHeading1 ---------------页码
subHeading2 ---------------页码
heading2 ----- ------------页码
我读了几篇文章并没有'理解。特别是,我的意思是
您可以清楚地看到标题下的标题和内容。在我们添加了所有内容后,我们开始一个新页面,并添加一个目录:
目录由一系列键值对组成,其中键是标题,值是页码。我们在页面事件中创建此列表:
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(新的(c)段);
for(int j = 0; j< 50; j ++){
document.add(new Paragraph(Line+ j +title of title + + i));
}
}
document.newPage();
document.add(新段落(目录,titleFont));
Chunk dottedLine = new Chunk(new DottedLineSeparator());
List< SimpleEntry< String,Integer>> entries = event.getTOC();
第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(新的(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行代码。添加对副标题的支持将添加一些行,但这也不难。这是建立树结构的问题,并在必要时引入一些缩进。
I need create Table Of Content with page numbers, but i don't know how. Next format:
heading1 ----------------page number
subHeading1---------------page number
subHeading2---------------page number
heading2-----------------page number
I read few articles and didn't understand.In particular, I mean this article, where "Named destinations" and "GoTo actions" I think is useful for me, but I don't know how it doing in iTextSharp.
In my code I have got few "Chapter" and "Section", and I want take it and create TOC. How I understood, I need to use PdfPageEventHelper and OnChapter.
You've probably implemented this yourself by name, but I made a small example myself for the sake of completeness.
Please take a look at the CreateTOC example. It creates a PDF with some random text:
You can clearly see the titles and the content under the titles. After we have added all our content, we start a new page, and we add a table of contents:
The table of contents is composed by a series of key-value pairs, where the key is the title and the value is the page number. We create this list in a page event:
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;
}
}
We use this page event like this:
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();
}
First we create an instance of the event and we declare it to the writer:
TOCEvent event = new TOCEvent();
writer.setPageEvent(event);
We mark the titles using setGenericTag()
:
String title = "This is title " + i;
Chunk c = new Chunk(title, titleFont);
c.setGenericTag(title);
document.add(new Paragraph(c));
Once we've finished adding the content, we get all the entries:
List<SimpleEntry<String, Integer>> entries = event.getTOC();
We loop over this list and compose a Paragraph
for every entry:
for (SimpleEntry<String, Integer> entry : entries) {
p = new Paragraph(entry.getKey());
p.add(dottedLine);
p.add(String.valueOf(entry.getValue()));
document.add(p);
}
No one can argue that this was difficult. The event class takes less than 10 lines of code. Adding support for subheadings will add a handful of lines, but that shouldn't be difficult too. It's a matter of building a tree structure, and introducing some indentation where necessary.
这篇关于如何在iTextSharp中创建目录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!