ProductListTemplate.cs
//
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS 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 DsPdfWeb.Demos
{
// このサンプルは、{{mustache}} HTML テンプレートを使用してレポート
// (標準の NWind サンプルデータベースの商品リスト)をレンダリングする方法を示します。
//
// データクエリと HTML 形式は、ProductList サンプルで使用されているものと似ています。
// ただし、そのサンプルとは異なり、ここではリソースからロードされた HTML テンプレート
// ファイル ProductListTemplate.html を使用し、
// {{mustache}} を使用してデータにバインドします。変更したテンプレートファイル
// ({{mustache}} バインディングを保持)を使用することで、レポートの外観を簡単に
// カスタマイズできます。
//
// このサンプルでは、Stubble.Core パッケージを
// 使用してデータをテンプレートにバインドします。
//
// DsHtml をプロジェクトに追加する方法の詳細については、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 });
// HTML のレンダリングに使用する GcHtmlBrowser のインスタンスを生成します。
using var browser = Common.Util.NewHtmlBrowser();
// バインドされたHTMLをレンダリングします。
using var htmlPage = browser.NewPage(boundTemplate);
// PdfOptions では、HTML から PDF への変換のオプションを提供できます。
var pdfOptions = new PdfOptions()
{
Margins = new PdfMargins(0.2f, 1, 0.2f, 1),
PreferCSSPageSize = false,
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 を一時ファイルにレンダリングします。
var tmp = Path.GetTempFileName();
htmlPage.SaveAsPdf(tmp, pdfOptions);
// 作成した PDF を一時ファイルからターゲットストリームにコピーします。
using (var ts = File.OpenRead(tmp))
ts.CopyTo(stream);
// 一時ファイルを削除します。
File.Delete(tmp);
// PDF ドキュメントを保存します。
}
}
}