ProductList.vb
''
'' This code is part of GrapeCity Documents for PDF samples.
'' Copyright (c) GrapeCity, Inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Text
Imports System.Data
Imports System.Linq
Imports System.Collections.Generic
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Html

'' This sample shows how to render a report (the list of products
'' from the standard NWind sample database) using an HTML string
'' as a template.
''
'' Please see notes in comments at the top of HelloWorldHtml
'' sample code for details on adding GcHtml to your projects.
Public Class ProductList
    Sub CreatePDF(ByVal stream As Stream)
        Const TTAG = "___TABLE___"

        '' HTML page template:
        Const tableTpl =
            "<!DOCTYPE html>" +
            "<html>" +
            "<head>" +
            "<style>" +
            "" +
            "html * {" +
            "  font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif !important;" +
            "}" +
            "" +
            "h1 {" +
            "  color: #1a5276;" +
            "  background-color: #d2b4de;" +
            "  text-align: center;" +
            "  padding: 6px;" +
            "}" +
            "" +
            "thead {display: table-header-group;}" +
            "" +
            "#products {" +
            "  font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif;" +
            "  border-collapse: collapse;" +
            "  width: 100%;" +
            "}" +
            "" +
            "#products td, #products th {" +
            "  border: 1px solid #ddd;" +
            "  padding: 8px;" +
            "}" +
            "" +
            "#products tr:nth-child(even){background-color: #f2f2f2;}" +
            "" +
            "#products tr:hover {background-color: #ddd;}" +
            "" +
            "#products th {" +
            "  padding-top: 12px;" +
            "  padding-bottom: 12px;" +
            "  text-align: left;" +
            "  background-color: #a569bd;" +
            "  color: white;" +
            "}" +
            "</style>" +
            "</head>" +
            "<body>" +
            "" +
            TTAG +
            "" +
            "</body>" +
            "</html>"

        Const tableHead = "<h1>Product Price List</h1>"

        Const tableFmt =
            "<table id='products'>" +
            "  <thead>" +
            "    <th>Product ID</th>" +
            "    <th>Description</th>" +
            "    <th>Supplier</th>" +
            "    <th>Quantity Per Unit</th>" +
            "    <th>Unit Price</th>" +
            "  </thead>" +
            "{0}" +
            "</table>"

        Const dataRowFmt =
            "  <tr>" +
            "    <td>{0}</td>" +
            "    <td>{1}</td>" +
            "    <td>{2}</td>" +
            "    <td>{3}</td>" +
            "    <td align='right'>{4:C}</td>" +
            "  </tr>"

        Dim ds = New DataSet()
        ds.ReadXml(Path.Combine("Resources", "data", "GcNWind.xml"))

        Dim dtProds = ds.Tables("Products")
        Dim dtSupps = ds.Tables("Suppliers")

        Dim products =
            From prod In dtProds.Select()
            Join supp In dtSupps.Select()
            On prod("SupplierID") Equals supp("SupplierID")
            Order By prod("ProductName")
            Select New With {
                .ProductID = prod("ProductID"),
                .ProductName = prod("ProductName"),
                .Supplier = supp("CompanyName"),
                .QuantityPerUnit = prod("QuantityPerUnit"),
                .UnitPrice = prod("UnitPrice")
            }

        Dim sb = New StringBuilder()
        sb.AppendLine(tableHead)
        For Each prod In products
            sb.AppendFormat(dataRowFmt, prod.ProductID, prod.ProductName, prod.Supplier, prod.QuantityPerUnit, prod.UnitPrice)
        Next

        Dim html = tableTpl.Replace(TTAG, String.Format(tableFmt, sb.ToString()))
        Dim tmp = Path.GetTempFileName()
        Using re = New GcHtmlRenderer(html)
            '' PdfSettings allow to provide options for HTML to PDF conversion:
            Dim pdfSettings = New PdfSettings() With {
                .Margins = New Margins(0.2F, 1, 0.2F, 1), '' page margins (default is no margins)
                .IgnoreCSSPageSize = True, '' try to ensure that we print the pages as we want
                .DisplayHeaderFooter = True, '' turn headers/footers on
                .HeaderTemplate = "<div style='color:#1a5276; font-size:12px; width:1000px; margin-left:0.2in; margin-right:0.2in'>" +
                    "<span style='float:left;'>Product Price List</span>" +
                    "<span style='float:right'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></span>" +
                    "</div>",
                .FooterTemplate = "<div style='color: #1a5276; font-size:12em; width:1000px; margin-left:0.2in; margin-right:0.2in;'>" +
                    "<span>(c) GrapeCity, Inc. All Rights Reserved.</span>" +
                    "<span style='float:right'>Generated on <span class='date'></span></span></div>"
            }
            '' Render the source Web page to the temporary file:
            re.RenderToPdf(tmp, pdfSettings)
        End Using
        '' Copy the created PDF from the temp file to target stream:
        Using ts = File.OpenRead(tmp)
            ts.CopyTo(stream)
        End Using
        '' Clean up:
        File.Delete(tmp)
        '' Done.
    End Sub
End Class