'''' This code is part of Document Solutions for PDF .NET demos.'' Copyright (c) MESCIUS inc. All rights reserved.''ImportsSystem.IOImportsSystem.TextImportsSystem.DataImportsSystem.LinqImportsSystem.Collections.GenericImportsGrapeCity.Documents.PdfImportsGrapeCity.Documents.TextImportsGrapeCity.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. The report is created by looping over the data records'' and building up the resulting HTML from table row template filled with'' the actual data. The generated HTML string is then passed to GcHtmlRenderer'' to create the PDF.'''' Please see notes in comments at the top of HelloWorldHtml'' sample code for details on adding DsHtml to your projects.PublicClassProductListSubCreatePDF(ByVal stream AsStream)ConstTTAG = "___TABLE___" '' HTML page template:ConsttableTpl ="<!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>" ConsttableHead = "<h1>Product Price List</h1>" ConsttableFmt ="<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>" ConstdataRowFmt =" <tr>" +" <td>{0}</td>" +" <td>{1}</td>" +" <td>{2}</td>" +" <td>{3}</td>" +" <td align='right'>{4:C}</td>" +" </tr>" Using ds = NewDataSet() 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")OrderBy prod("ProductName")SelectNewWith { .ProductID = prod("ProductID"), .ProductName = prod("ProductName"), .Supplier = supp("CompanyName"), .QuantityPerUnit = prod("QuantityPerUnit"), .UnitPrice = prod("UnitPrice") } Dim sb = NewStringBuilder() sb.AppendLine(tableHead)ForEach 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()'' 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 = NewPdfOptions() With { .Margins = NewPdfMargins(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 source Web page to the temporary file:Using htmlPage = browser.NewPage(html) htmlPage.SaveAsPdf(tmp, pdfOptions)EndUsingEndUsing'' Copy the created PDF from the temp file to target stream:Using ts = File.OpenRead(tmp) ts.CopyTo(stream)EndUsing'' Clean up:File.Delete(tmp)EndUsing'' Done.EndSubEndClass