Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks
Imports System.Windows.Forms
Imports System.IO
Imports ColorCode
Imports SelectPdf

Namespace SelectPdf.Samples
    Partial Public Class HtmlToPdfHeadersAndFooters
        Inherits Form

        Private headerUrl As String = AppDomain.CurrentDomain.BaseDirectory + _
            "/../../files/header.html"
        Private footerUrl As String = AppDomain.CurrentDomain.BaseDirectory + _
            "/../../files/footer.html"

        Private Sub BtnCreatePdf_Click(sender As Object, e As EventArgs) Handles BtnCreatePdf.Click
            Dim renderingEngine As RenderingEngine = CType([Enum].Parse(GetType(RenderingEngine), DdlRenderingEngine.SelectedItem.ToString(), True), RenderingEngine)
            Cursor = Cursors.WaitCursor
            Dim file As String = "Document.pdf"

            Try
                ' get parameters
                Dim showHeaderOnFirstPage As Boolean = ChkHeaderFirstPage.Checked
                Dim showHeaderOnOddPages As Boolean = ChkHeaderOddPages.Checked
                Dim showHeaderOnEvenPages As Boolean = ChkHeaderEvenPages.Checked

                Dim headerHeight As Integer = 50
                Try
                    headerHeight = Convert.ToInt32(TxtHeaderHeight.Text)
                Catch
                End Try


                Dim showFooterOnFirstPage As Boolean = ChkFooterFirstPage.Checked
                Dim showFooterOnOddPages As Boolean = ChkFooterOddPages.Checked
                Dim showFooterOnEvenPages As Boolean = ChkFooterEvenPages.Checked

                Dim footerHeight As Integer = 50
                Try
                    footerHeight = Convert.ToInt32(TxtFooterHeight.Text)
                Catch
                End Try

                ' instantiate a html to pdf converter object
                Dim converter As New HtmlToPdf()
                converter.Options.RenderingEngine = renderingEngine

                ' header settings
                converter.Options.DisplayHeader = showHeaderOnFirstPage OrElse _
                    showHeaderOnOddPages OrElse showHeaderOnEvenPages
                converter.Header.DisplayOnFirstPage = showHeaderOnFirstPage
                converter.Header.DisplayOnOddPages = showHeaderOnOddPages
                converter.Header.DisplayOnEvenPages = showHeaderOnEvenPages
                converter.Header.Height = headerHeight

                Dim headerHtml As New PdfHtmlSection(Path.GetFullPath(headerUrl))
                headerHtml.RenderingEngine = renderingEngine
                headerHtml.AutoFitHeight = HtmlToPdfPageFitMode.AutoFit
                converter.Header.Add(headerHtml)

                ' footer settings
                converter.Options.DisplayFooter = showFooterOnFirstPage OrElse _
                    showFooterOnOddPages OrElse showFooterOnEvenPages
                converter.Footer.DisplayOnFirstPage = showFooterOnFirstPage
                converter.Footer.DisplayOnOddPages = showFooterOnOddPages
                converter.Footer.DisplayOnEvenPages = showFooterOnEvenPages
                converter.Footer.Height = footerHeight

                Dim footerHtml As New PdfHtmlSection(Path.GetFullPath(footerUrl))
                footerHtml.RenderingEngine = renderingEngine
                footerHtml.AutoFitHeight = HtmlToPdfPageFitMode.AutoFit
                converter.Footer.Add(footerHtml)

                ' add page numbering element to the footer
                If ChkPageNumbering.Checked Then
                    ' 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("Arial", 8))
                    text.HorizontalAlign = PdfTextHorizontalAlign.Right
                    converter.Footer.Add(text)
                End If

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

                ' custom header on page 3
                If doc.Pages.Count >= 3 Then
                    Dim page As PdfPage = doc.Pages(2)

                    Dim customHeader As PdfTemplate = doc.AddTemplate( _
                        page.PageSize.Width, headerHeight)
                    Dim customHtml As New PdfHtmlElement( _
                        "<div><b>This is the custom header that will " + _
                        "appear only on page 3!</b></div>", String.Empty)
                    customHtml.RenderingEngine = renderingEngine
                    customHeader.Add(customHtml)

                    page.CustomHeader = customHeader
                End If

                ' save pdf document
                doc.Save(file)

                ' close pdf document
                doc.Close()
            Catch ex As Exception
                MessageBox.Show([String].Format("Error: {0}", ex.Message), "Error", _
                                MessageBoxButtons.OK, MessageBoxIcon.[Error])
                Return
            Finally
                Cursor = Cursors.Arrow
            End Try

            ' open generated pdf
            Try
                System.Diagnostics.Process.Start(file)
            Catch
                MessageBox.Show("Could not open generated pdf document", "Error", _
                                MessageBoxButtons.OK, MessageBoxIcon.[Error])
            End Try
        End Sub
        Public Sub New()
            InitializeComponent()
            Try
                ' display highlighted sample code
                Dim code As String = Helper.ReadSourceCode("HtmlToPdfHeadersAndFooters.vb")
                WBSampleCode.DocumentText = New CodeColorizer().Colorize(code, Languages.VbDotNet)
            Catch
                WBSampleCode.DocumentText = "Sample code not available"
            End Try
        End Sub

        Private Sub LblSampleHeader_Click(sender As Object, e As EventArgs) _
            Handles LblSampleHeader.Click
            System.Diagnostics.Process.Start(Path.GetFullPath(headerUrl))
        End Sub

        Private Sub LblSampleFooter_Click(sender As Object, e As EventArgs) _
            Handles LblSampleFooter.Click
            System.Diagnostics.Process.Start(Path.GetFullPath(footerUrl))
        End Sub

    End Class
End Namespace
