SelectPdf for .NET - Generate Table of Contents with Html to Pdf Converter - VB.NET / ASP.NET MVC Sample

This sample shows how the html To pdf converter can generate page numbers For a table Of contents Using SelectPdf Pdf Library For .NET. The table Of contents (TOC) must already exist at the top Of the web page And the items from the table Of contents must link To the appropriate sections from the document (Like in the test document below). The TOC elements must also have the following CSS classes Or ID styles

- all TOC elements (both titles from the actual table of contents, but also the link targets - where the user goes when clicking on a TOC link) must have a specific CSS Class ("toc" In our example).
- all TOC titles must have similar IDs: TOC_Title{0} (TOC_Title1 to TOC_Title13 in our example).
- all TOC targets (document content) must have similar IDs: TOC_Target{0} (TOC_Target1 to TOC_Target13 in our example).

All these elements locations are retrieved during the conversion To PDF And those locations are used To Get the content page numbers To display them In the table of contents. The font for the page numbers can be specified in code. Also, that style of the line that links the TOC titles with the page numbers.

Test document

Url :



Sample Code VB.NET



Imports SelectPdf
Imports System.Drawing
Imports System.Web

Namespace Controllers
    Public Class TableOfContentsController
        Inherits Controller

        ' number of items in the table of contents (TOC)
        Private TOC_Items As Integer = 13

        ' CSS class for TOC items (titles and targets)
        Private TOC_Class As String = "toc"

        ' font size for page numbers in the table of contents
        Private TOC_Page_Font_Size As Integer = 12

        ' CSS class for PDF bookmarks
        Private Bookmarks_Class As String = "bookmark"

        ' Each TOC item is represented by a title with ID TOC_Title{0}
        ' and a target (internal link) with ID TOC_Target{0}
        ' Both TOC titles and targets must have the same CSS Class ("toc" in our sample)


        ' GET: TableOfContents
        Public Function Index() As ActionResult
            Dim url As String = VirtualPathUtility.ToAbsolute("~/files/document2.html")
            ViewData.Add("ViewTxtUrl", (New Uri(Request.Url, url)).AbsoluteUri)
            Return View()
        End Function

        <HttpPost>
        Public Function SubmitAction(fields As FormCollection) As ActionResult
            ' instantiate a html to pdf converter object
            Dim converter As New HtmlToPdf()

            converter.Options.MarginTop = 20
            converter.Options.MarginRight = 20
            converter.Options.MarginBottom = 20
            converter.Options.MarginLeft = 20

            ' set the css selectors for the automatic bookmarks 
            ' (elements with CSS class "bookmark")
            converter.Options.PdfBookmarkOptions.CssSelectors =
                New String() {Convert.ToString("*.") & Bookmarks_Class}

            ' set the css selectors for the TOC related elements
            ' (elements with CSS class "toc")
            ' (alternatively, full list of IDs can be specified)
            converter.Options.WebElementsMappingOptions.CssSelectors =
                New String() {Convert.ToString("*.") & TOC_Class}

            ' display the bookmarks when the document is opened in a viewer
            converter.Options.ViewerPreferences.PageMode = PdfViewerPageMode.UseOutlines

            ' footer settings
            converter.Options.DisplayFooter = True
            converter.Footer.Height = 30

            ' page numbers can be added using a PdfTextSection object
            Dim text As New PdfTextSection(0, 10, "Page: {page_number} of {total_pages}  ",
                                           New System.Drawing.Font("Verdana", 10))
            text.HorizontalAlign = PdfTextHorizontalAlign.Right
            converter.Footer.Add(text)


            ' create a new pdf document converting an url
            Dim doc As PdfDocument = converter.ConvertUrl(fields("TxtUrl"))

            ' create font for page numbers
            Dim pageNumberFont As PdfFont = doc.Fonts.Add(
                New Font("Arial", TOC_Page_Font_Size,
                         FontStyle.Regular, GraphicsUnit.Point), True)

            ' get the right coordinate of the table of contents 
            ' to position the page numbers
            Dim tocRight As Single = doc.Pages(0).ClientRectangle.Width - 50

            ' add page numbers for the table of contents items
            For tocItem As Integer = 1 To TOC_Items
                Dim tocTitleID As String = [String].Format("TOC_Title{0}", tocItem)
                Dim tocTargetID As String = [String].Format("TOC_Target{0}", tocItem)

                Dim tocTitle As WebElement = converter.Options.WebElementsMappingOptions _
                    .Result.GetElementByHtmlId(tocTitleID)
                Dim tocTarget As WebElement = converter.Options.WebElementsMappingOptions _
                    .Result.GetElementByHtmlId(tocTargetID)

                If tocTitle Is Nothing OrElse tocTarget Is Nothing Then
                    ' TOC items not found
                    Continue For
                End If

                ' get the TOC title page and rendering rectangle
                Dim tocPage As PdfPage = doc.Pages(tocTitle.PdfRectangles(0).PageIndex)
                Dim tocTitleRectangle As RectangleF = tocTitle.PdfRectangles(0).Rectangle

                ' get the page number of target where the TOC entry points
                Dim tocTargetPageNumber As Integer =
                    tocTarget.PdfRectangles(0).PageIndex + 1

                ' add dashed line from TOC title to the page number
                Dim dashedLine As New PdfLineElement(tocTitleRectangle.Right + 5,
                            tocTitleRectangle.Y + tocTitleRectangle.Height - 4,
                            tocRight,
                            tocTitleRectangle.Y + tocTitleRectangle.Height - 4)
                dashedLine.LineStyle.LineWidth = 1
                dashedLine.LineStyle.LineDashStyle = PdfLineDashStyle.Dash
                dashedLine.ForeColor = Color.Black
                tocPage.Add(dashedLine)

                ' create the page number text element to the right of the TOC title
                Dim pageNumberTextElement As New PdfTextElement(tocRight + 5,
                                                    tocTitleRectangle.Y, -1,
                                                    tocTitleRectangle.Height,
                                                    tocTargetPageNumber.ToString(),
                                                    pageNumberFont)
                pageNumberTextElement.HorizontalAlign = PdfTextHorizontalAlign.Left
                pageNumberTextElement.VerticalAlign = PdfTextVerticalAlign.Middle
                pageNumberTextElement.ForeColor = Color.Black

                ' add the page number to the right of the TOC entry
                tocPage.Add(pageNumberTextElement)
            Next

            ' save pdf document
            Dim pdf As Byte() = doc.Save()

            ' close pdf document
            doc.Close()

            ' return resulted pdf document
            Dim fileResult As FileResult = New FileContentResult(pdf, "application/pdf")
            fileResult.FileDownloadName = "Document.pdf"
            Return fileResult
        End Function
    End Class
End Namespace