Code snippets are bits of re-usable code submitted by the ReportLab community. We don't promise that they are accurate, up-to-date or correct - use them at your own risk!

We'd love it if you could participate by submitting your own snippets and sharing your experience with others by commenting. You will need to create a user account by filling out our very simple form.

View all snippets


TOC with clickable links in RML
rml

Author:
damian
Posted:
Feb. 26, 2010
Language:
XML
Tags:
rml

This is a sample document created using RML (ReportLab Markup Language) which has multiple pages. Each item on the contents page is a links which can be clicked to go to the relevant page in the PDF document.

<!DOCTYPE document SYSTEM "rml.dtd">
<document filename="click-toc.pdf">
    <template>
        <pageTemplate id="main">
             <frame id="first" x1="10mm" y1="10mm" width="190mm" height="277mm"/>
        </pageTemplate>
    </template>
    <stylesheet>
    </stylesheet>
    <story>
        <namedString id="title">Table of Contents</namedString>
        <outlineAdd>Table of Contents</outlineAdd>
        <h1>Table of Contents</h1>
        <spacer length="100"/>    

        <!-- for the master table of contents -->
        <blockTable colWidths="95%,5%">
            <tr>
                <!-- each table cell acts like a big hyperlink to the -->
                <!-- corresponding part of the document - the bookmark attribute. -->
                <td destination="bookmark_chapter_1">Chapter 1 - Introduction</td>
                <td destination="bookmark_chapter_1" align="right">
                    <illustration width="30" height="15">
                        <doForm name="pagenum_chapter_1"/>
                    </illustration>
                </td>
            </tr>
            <tr>
                <td destination="bookmark_chapter_2">Chapter 2 - Glossary</td>
                <td destination="bookmark_chapter_2" align="right">
                    <illustration width="30" height="15">
                        <doForm name="pagenum_chapter_2"/>
                    </illustration>
                </td>
            </tr>
            <tr>
                <td destination="bookmark_chapter_3">Chapter 3 - Appendix</td>
                <td destination="bookmark_chapter_3" align="right">
                    <illustration width="30" height="15">
                        <doForm name="pagenum_chapter_3"/>
                    </illustration>
                </td>
            </tr>
        </blockTable>

        <nextFrame/>
        <bookmark name="bookmark_chapter_1"/>
        <h1>Chapter 1 - Introduction</h1>
        <illustration width="0" height="0">
            <!-- invisible form gets added to the page with pageNumber, then gets drawn in the TOC using doForm -->
            <form name="pagenum_chapter_1">
                <setFont name="Times-Roman" size="10"/>
                <drawString x="0" y="0">Page <pageNumber/></drawString>
            </form>
        </illustration>
        <para>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed venenatis, nisl id blandit ullamcorper, diam ante sodales mauris, ac porta elit mi sed elit. Fusce ut diam purus. Donec at leo diam, et tempus mi. Morbi varius lacinia lectus, eu placerat velit egestas ut. In auctor, tortor venenatis hendrerit venenatis, dolor eros consectetur tellus, eu iaculis ante enim ut ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam iaculis tincidunt nisl, quis imperdiet diam rhoncus quis. Aenean mauris eros, rutrum sed aliquet et, malesuada id ante. Curabitur quis justo odio. Integer quis vestibulum enim. Maecenas commodo tempor felis, a accumsan turpis laoreet et. Morbi ornare condimentum feugiat. In ornare tincidunt sem eget rhoncus. Etiam leo nunc, lobortis vel varius non, interdum adipiscing urna. Fusce tempor varius nisl id pharetra. Ut lacus felis, pretium at imperdiet nec, lacinia a ligula. Vestibulum sed pharetra magna.</para>
        <para>Quisque et velit ut ligula gravida rutrum. Ut eu diam vel arcu fringilla aliquet at non lacus. Nullam nec pretium odio. Sed nec sem enim, mollis congue dolor. Donec augue purus, semper ac tristique ornare, tristique quis ipsum. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut arcu libero, congue sit amet accumsan eget, pretium id augue. Phasellus vitae massa non purus venenatis blandit. Sed rutrum, mauris et convallis bibendum, velit ante aliquam tortor, quis varius elit leo quis felis. Quisque vulputate posuere nisl quis varius. Etiam nisl neque, aliquam sit amet venenatis nec, ullamcorper vel nisl. Aliquam congue leo id purus fringilla eu pretium augue ultricies. Nullam non tortor in mauris viverra cursus. Proin eget arcu sit amet dolor bibendum convallis nec vitae neque.</para>
        <para>Aliquam turpis lectus, sagittis ac sodales ac, convallis eget mi. Nullam sit amet tortor neque, non tincidunt mauris. Suspendisse gravida elit vel dolor porttitor vitae molestie metus bibendum. Donec eget dolor sit amet arcu dapibus eleifend. Etiam et arcu ut libero ultrices porta. Integer dolor sem, consequat id adipiscing et, facilisis vitae tortor. Pellentesque iaculis pretium odio et blandit. Pellentesque ut pretium sem. Etiam non felis non urna pretium rhoncus eu non sapien. Curabitur urna ipsum, malesuada at accumsan et, vulputate ut diam. Nunc dolor tellus, rhoncus sed eleifend eu, consequat vel ante. Praesent commodo aliquet mauris sed convallis. Aliquam risus eros, consectetur sit amet vestibulum vel, egestas at justo. Integer nec felis nisl, at interdum purus. Vivamus placerat lorem sed metus scelerisque sit amet fringilla massa pulvinar. Suspendisse eu velit eu dolor gravida sagittis quis quis nunc. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In ullamcorper urna dolor.</para>
        <nextFrame/>
        <bookmark name="bookmark_chapter_2"/>
        <h1>Chapter 2 - Glossary</h1>
        <illustration width="0" height="0">
            <form name="pagenum_chapter_2">
                <setFont name="Times-Roman" size="10"/>
                <drawString x="0" y="0">Page <pageNumber/></drawString>
            </form>
        </illustration>
        <para>Maecenas quis ipsum et neque scelerisque convallis at quis risus. Nullam luctus est nec enim tristique fringilla. In a turpis vitae sapien placerat cursus ut nec urna. Suspendisse potenti. Donec nibh arcu, placerat in fringilla non, eleifend eget justo. Nam consectetur nisi sed dui tincidunt ultricies. Aenean auctor pulvinar tortor eget molestie. Integer ut lorem ipsum, ac ultrices nulla. Maecenas imperdiet, ligula ut malesuada faucibus, nunc leo dignissim tortor, id scelerisque odio velit vel lorem. Cras congue leo malesuada eros eleifend dignissim. Mauris lacinia est non mauris mollis bibendum. Pellentesque consequat elit nec enim posuere volutpat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras tortor magna, placerat sit amet mattis non, lacinia eget sem. Nam ut fermentum orci. Fusce cursus sapien ut purus venenatis quis faucibus magna porttitor. Curabitur sollicitudin, risus in porttitor scelerisque, nisi ipsum pellentesque arcu, facilisis gravida quam mauris et neque. Vivamus scelerisque interdum sapien sit amet blandit.</para>
        <para>Proin tincidunt purus et nibh commodo egestas quis ac felis. Ut ut diam erat. Aenean sed nibh a odio accumsan luctus quis mollis neque. Nulla ut nisl in odio tempus suscipit eu eu orci. Fusce tristique euismod pulvinar. Vivamus arcu quam, adipiscing eu ornare in, consequat in tortor. Suspendisse potenti. Suspendisse potenti. Nam vehicula neque iaculis est bibendum fermentum. In id felis et nulla dignissim mollis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</para>

        <nextFrame/>
        <para>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean hendrerit augue dictum eros tincidunt tincidunt. Nunc varius mauris a purus placerat scelerisque. Nullam vestibulum suscipit diam, quis auctor lectus egestas eu. Praesent condimentum est a justo tempus aliquet. Nunc vitae justo odio, ac sodales lectus. Cras eget lorem enim. Cras sed nunc odio. Phasellus adipiscing aliquet dui non varius. Ut sit amet adipiscing eros. Mauris bibendum dui sed turpis bibendum cursus. Etiam id diam et velit dapibus rhoncus ac vitae diam. 
        </para>

        <nextFrame/>
        <bookmark name="bookmark_chapter_3"/>
        <h1>Chapter 3 - Appendix</h1>
        <illustration width="0" height="0">
            <form name="pagenum_chapter_3">
                <setFont name="Times-Roman" size="10"/>
                <drawString x="0" y="0">Page <pageNumber/></drawString>
            </form>
        </illustration>
        <para>Phasellus vel bibendum eros. Ut sed eros ligula, ac mollis quam. Aenean a felis ligula. Integer quis magna non dui rutrum cursus. Fusce suscipit, ipsum in sollicitudin sagittis, est nulla tincidunt dui, at accumsan risus dolor vitae mi. Sed suscipit lacus metus, nec consequat orci. Nam iaculis, diam id tincidunt tristique, dui massa mattis neque, eu dapibus urna urna eget justo. Quisque sit amet sodales felis. Maecenas pulvinar luctus adipiscing. Suspendisse dignissim semper sapien, sit amet fringilla risus ullamcorper non. Morbi porta aliquet eros molestie bibendum. Phasellus viverra laoreet feugiat. In hendrerit, ante non euismod sodales, mauris nunc pharetra enim, fringilla vehicula lorem dui ac dui. Nunc ornare adipiscing enim sit amet mollis.</para>
        <para>Nam vitae turpis venenatis massa venenatis tempor sit amet rhoncus tortor. In tempus justo nec diam eleifend tincidunt. Phasellus at sem velit. Ut eu diam leo. Nullam interdum turpis ac dui malesuada sit amet tincidunt mauris iaculis. In hac habitasse platea dictumst. Fusce vitae dui a augue pulvinar placerat quis non velit. Morbi pharetra, est commodo sagittis hendrerit, turpis lorem sagittis elit, et dapibus enim neque quis ipsum. Praesent non nulla mi, at sagittis nunc. Curabitur tempus lacus a velit ornare interdum. Suspendisse sollicitudin elit quis justo tempus consequat. Ut et mi in metus tristique ornare. Curabitur sit amet sapien elit. Vestibulum ullamcorper, tellus in interdum condimentum, ipsum urna feugiat ipsum, commodo auctor erat ligula sit amet erat. Sed suscipit fermentum libero nec volutpat. Aliquam at lorem augue. Ut vulputate orci sed turpis accumsan in lacinia neque porta.</para>
        <para>Mauris ante nisl, molestie vel ultricies eu, lacinia ut purus. Maecenas vitae lectus eros. In id mauris vel purus mollis porttitor ut vitae leo. Donec luctus euismod libero nec egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent vulputate pharetra dapibus. Morbi luctus, tortor sagittis convallis dictum, massa orci faucibus quam, ut ultrices ante turpis lobortis turpis. Cras convallis ullamcorper ullamcorper. In nec velit in quam vestibulum convallis. Quisque sagittis feugiat ligula, vitae tristique ante tristique at. Duis non eleifend lorem. Duis sodales feugiat libero nec fermentum. Nullam commodo lorem ipsum, non posuere risus.</para>
    </story>
</document>