ProductListTemplate.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// Copyright (c) GrapeCity inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Html;

namespace GcPdfWeb.Samples
{
    // このサンプルは、{{mustache}} HTML テンプレートを使用してレポート
    // (標準の NWind サンプルデータベースの商品リスト)をレンダリングする方法を示します。
    // 
    // データクエリと HTML 形式は、ProductList サンプルで使用されているものと似ています。
    // ただし、そのサンプルとは異なり、ここではリソースからロードされた HTML テンプレート
    // ファイル ProductListTemplate.html を使用し、
    // {{mustache}} を使用してデータにバインドします。変更したテンプレートファイル
    // ({{mustache}} バインディングを保持)を使用することで、レポートの外観を簡単に
    // カスタマイズできます。
    // 
    // このサンプルでは、Stubble.Core パッケージを
    // 使用してデータをテンプレートにバインドします。
    // 
    // GcHtml をプロジェクトに追加する方法の詳細については、HelloWorldHtml サンプル
    // コードの上部にあるコメントのメモを参照してください。
    public class ProductListTemplate
    {
        public void CreatePDF(Stream stream)
        {
            using (var ds = new DataSet())
            {
                // データを取得します。
                ds.ReadXml(Path.Combine("Resources", "data", "GcNWind.xml"));

                DataTable dtProds = ds.Tables["Products"];
                DataTable dtSupps = ds.Tables["Suppliers"];

                var products =
                    from prod in dtProds.Select()
                    join supp in dtSupps.Select()
                    on prod["SupplierID"] equals supp["SupplierID"]
                    orderby prod["ProductName"]
                    select new
                    {
                        ProductID = prod["ProductID"],
                        ProductName = prod["ProductName"],
                        Supplier = supp["CompanyName"],
                        QuantityPerUnit = prod["QuantityPerUnit"],
                        UnitPrice = $"{prod["UnitPrice"]:C}"
                    };

                // テンプレートをロードします - {{mustache}}データ参照を含む HTML ファイル。
                var template = File.ReadAllText(Path.Combine("Resources", "Misc", "ProductListTemplate.html"));
                // テンプレートをデータにバインドします。
                var builder = new Stubble.Core.Builders.StubbleBuilder();
                var boundTemplate = builder.Build().Render(template, new { Query = products });
                var tmp = Path.GetTempFileName();
                // バインドされたHTMLをレンダリングします。
                using (var re = new GcHtmlRenderer(boundTemplate))
                {
                    // PdfSettings では、HTML から PDF への変換のオプションを提供できます。
                    var pdfSettings = new PdfSettings()
                    {
                        Margins = new Margins(0.2f, 1, 0.2f, 1),
                        IgnoreCSSPageSize = true,
                        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) GrapeCity, Inc. All Rights Reserved.</span>" +
                            "<span style='float:right'>Generated on <span class='date'></span></span></div>"
                    };
                    // 生成された HTML を一時ファイルにレンダリングします。
                    re.RenderToPdf(tmp, pdfSettings);
                }
                // 作成した PDF を一時ファイルからターゲットストリームにコピーします。
                using (var ts = File.OpenRead(tmp))
                    ts.CopyTo(stream);
                // 一時ファイルを削除します。
                File.Delete(tmp);
            }
            // PDF ドキュメントを保存します。
        }
    }
}