ProductListTemplate.vb
'' 完毕:
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

'' 此示例展示了如何呈现报告(产品列表)
'' 来自标准 NWind 示例数据库)使用 {{mustache}}
'' HTML 模板。
'' 
'' 数据查询和 HTML 格式与使用的类似
'' 在ProductList 示例中。但与该示例不同的是,这里
'' 我们使用HTML模板文件ProductListTemplate.html
'' 从资源加载,并使用 {{mustache}} 将其绑定到数据。
'' 更改模板文件(保留 {{mustache}} 绑定)
'' 可用于轻松自定义报告的外观。
'' 
'' 此示例​​使用 Stubble.Core 包来绑定数据到模板。
'' 
'' 请参阅HelloWorldHtml顶部评论中的注释
'' 有关将 GcDocs.Html 添加到项目的详细信息的示例代码。
Public Class ProductListTemplate
    Sub CreatePDF(ByVal stream As Stream)
        Using ds = New DataSet()
            '' 获取数据:
            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}"
                }

            '' 加载模板 - HTML 文件,其中包含 {{mustache}} 数据引用:
            Dim template = File.ReadAllText(Path.Combine("Resources", "Misc", "ProductListTemplate.html"))
            '' 将模板绑定到数据:
            Dim builder = New Stubble.Core.Builders.StubbleBuilder()
            '' 渲染绑定的 HTML:
            Dim boundTemplate = builder.Build().Render(template, New With {.Query = products})
            Dim tmp = Path.GetTempFileName()
            '' 创建一个用于呈现 HTML 的 GcHtmlBrowser 实例:
            Using browser = Util.NewHtmlBrowser()
                '' PdfOptions 允许您提供 HTML 到 PDF 转换的选项:
                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>"
                }
                '' 将生成的 HTML 渲染到临时文件:
                Using htmlPage = browser.NewPage(boundTemplate)
                    htmlPage.SaveAsPdf(tmp, pdfOptions)
                End Using
            End Using
            '' 将创建的 PDF 从临时文件复制到目标流:
            Using ts = File.OpenRead(tmp)
                ts.CopyTo(stream)
            End Using
            '' 清理:
            File.Delete(tmp)
        End Using
        '' 完毕:
    End Sub
End Class