How to create Table Of Contents in iTextSharp

后端 未结 3 379
一向
一向 2020-12-10 17:37

I need to create a Table Of Contents with page numbers, but I don\'t know how. Next format:

heading1 ----------------page number  
  subHeading1-------------         


        
3条回答
  •  一生所求
    2020-12-10 18:18

    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> 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> entries = event.getTOC();
        Paragraph p;
        for (SimpleEntry 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> entries = event.getTOC();
    

    We loop over this list and compose a Paragraph for every entry:

    for (SimpleEntry 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.

提交回复
热议问题