ProductListTemplate.vb
- ''
- '' This code is part of Document Solutions for PDF demos.
- '' Copyright (c) MESCIUS inc. All rights reserved.
- ''
- Imports System.IO
- Imports System.Drawing
- Imports System.Collections.Generic
- Imports System.Data
- Imports System.Linq
- Imports System.Reflection
- Imports GrapeCity.Documents.Pdf
- Imports GrapeCity.Documents.Html
-
- '' This sample shows how to render a report (the list of products
- '' from the standard NWind sample database) using a {{mustache}}
- '' HTML template.
- ''
- '' The data query and HTML formatting are similar to those used
- '' in the ProductList sample. Unlike that sample though, here
- '' we use the HTML template file ProductListTemplate.html
- '' loaded from a resource, and bind it to data using {{mustache}}.
- '' Changing the template file (preserving the {{mustache}} bindings)
- '' can be used to easily customize the look of the report.
- ''
- '' This sample uses the Stubble.Core package to bind data to the template.
- ''
- '' Please see notes in comments at the top of HelloWorldHtml
- '' sample code for details on adding DsHtml to your projects.
- Public Class ProductListTemplate
- Sub CreatePDF(ByVal stream As Stream)
- Using ds = New DataSet()
- '' Fetch data:
- ds.ReadXml(Path.Combine("Resources", "data", "DsNWind.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"):C}"
- }
-
- '' Load the template - HTML file with {{mustache}} data references:
- Dim template = File.ReadAllText(Path.Combine("Resources", "Misc", "ProductListTemplate.html"))
- '' Bind the template to data:
- Dim builder = New Stubble.Core.Builders.StubbleBuilder()
- '' Render the bound HTML:
- Dim boundTemplate = builder.Build().Render(template, New With {.Query = products})
- Dim tmp = Path.GetTempFileName()
- '' Create an instance of GcHtmlBrowser that is used to render HTML:
- Using browser = Util.NewHtmlBrowser()
- '' PdfSettings specifies options for HTML to PDF conversion:
- Dim pdfOptions = New PdfOptions() With {
- .Margins = New PdfMargins(0.2F, 1, 0.2F, 1),
- .DisplayHeaderFooter = True,
- .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) MESCIUS inc. All Rights Reserved.</span>" +
- "<span style='float:right'>Generated on <span class='date'></span></span></div>"
- }
- '' Render the generated HTML to the temporary file:
- Using htmlPage = browser.NewPage(boundTemplate)
- htmlPage.SaveAsPdf(tmp, pdfOptions)
- End Using
- 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)
- End Using
- '' Done.
- End Sub
- End Class
-