Table of content java flying saucer?

Viewed 162

I created an audit report using flying saucer to convert from HTML to pdf. And I want to create an table of content in the first page to know titleProduct belong which page? How do I do it?

<div th:each="productGroup: ${productGroups}">
    <table class="audit-table">
        <thead>
        <tr class="pg-node pg-title">
            <td class="titleProduct" colspan="3">[[${productGroup.getPgNumber()}]] - [[${productGroup.getPgName()}]]</td>
        </tr>
        <tr class="pg-node row">
            <th>BRAND</th>
            <th>MODEL</th>
            <th>FEATURE TEXT</th>
            <th>ARTICLE</th>
        </tr>
        </thead>
        <tbody>
        <th:block th:each="audit: ${productGroup.getPdfAuditColumns()}">
            <tr>
                <td th:text="${audit.getBrand()}"></td>
                <td th:text="${audit.getModel()}"></td>
                <td th:text="${audit.getFeatureText()}"></td>
                <td th:text="${audit.getArticle()}"></td>
            </tr>
        </th:block>
        </tbody>
    </table>
</div
2 Answers

You can create table of content using CSS cross references. This is supported by flying-saucer.

Here is a working example:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <style>
        div.newbr {page-break-before: always}
        #table-of-content a::after {content: " on page " target-counter(attr(href), page);}
    </style>
</head>
<body>

<div id="table-of-content">
    <a href="#product1">Product 1</a><br/>
    <a href="#product2">Product 2</a><br/>
    <a href="#product3">Product 3</a><br/>
</div>

<div id="product1" class="newbr"><h1>Product 1</h1></div> <!-- product 1 on page 2 -->
<div id="product2"><h1>Product 2</h1></div>               <!-- product 2 also on page 2 -->
<div id="product3" class="newbr"><h1>Product 3</h1></div> <!-- product 3 on page 3 -->


</body>
</html>

You can take the approach of converting the HTML code to string. Then using the iText library's convertToPdf() method in the HtmlConverter class you will be able to generate the desired pdf.

FYR sample code:

String HTML = "<h1>Hello</h1>"
            + "<p>This was created using iText</p>"
            + "<a href='google.com'>google.com</a>";
    
public static void generatePdfFromHTML( String HTML ) throws FileNotFoundException, IOException  {
    HtmlConverter.convertToPdf(HTML, new FileOutputStream("your-filename.pdf"));
    System.out.println( "PDF Created!" );
}

You will need to add the dependency of the library in your pom.xml.

FYR code:

<dependencies>
    <!-- iText Core -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext7-core</artifactId>
        <version>7.1.9</version>
        <type>pom</type>
    </dependency>

    <!-- iText pdfHTML add-on -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>html2pdf</artifactId>
        <version>2.1.6</version>
    </dependency>
</dependencies>

You can read more about this library through this article on Medium

Related