ProductList.cs
//
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Text;
using System.Data;
using System.Linq;
using System.Collections.Generic;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Html;
namespace DsPdfWeb.Demos
{
// このサンプルは、テンプレートとして HTML 文字列を使用したレポート
// (標準の NWind サンプルデータベースの商品リスト)をレンダリングする方法を
// 示します。 レポートは、データレコードをループし、実際のデータで満たされたテーブル行
// テンプレートから結果の HTML を作成することにより作成されます。 生成された
// HTML 文字列は SaveAsPdf メソッドにて PDF にレンダリングされます。
//
// DsHtml をプロジェクトに追加する方法の詳細については、HelloWorldHtml
// サンプルコードの上部にあるコメントのメモを参照してください。
public class ProductList
{
public void CreatePDF(Stream stream)
{
const string TTAG = "___TABLE___";
// HTML ページテンプレート。
const string tableTpl =
"<!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>";
const string tableHead = "<h1>商品価格リスト</h1>";
const string tableFmt =
"<table id='products'>" +
" <thead>" +
" <th>商品 ID</th>" +
" <th>商品名</th>" +
" <th>仕入先</th>" +
" <th>単位・入数</th>" +
" <th>単価</th>" +
" </thead>" +
"{0}" +
"</table>";
const string dataRowFmt =
" <tr>" +
" <td>{0}</td>" +
" <td>{1}</td>" +
" <td>{2}</td>" +
" <td>{3}</td>" +
" <td align='right'>{4:C}</td>" +
" </tr>";
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"]
};
var sb = new StringBuilder();
sb.AppendLine(tableHead);
foreach (var prod in products)
sb.AppendFormat(dataRowFmt, prod.ProductID, prod.ProductName, prod.Supplier, prod.QuantityPerUnit, prod.UnitPrice);
var html = tableTpl.Replace(TTAG, string.Format(tableFmt, sb.ToString()));
// HTML のレンダリングに使用する GcHtmlBrowser のインスタンスを生成します。
using var browser = Common.Util.NewHtmlBrowser();
using var htmlPage = browser.NewPage(html);
// PdfOptions では、HTML から PDF への変換のオプションを提供できます。
var pdfOptions = new PdfOptions()
{
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>"
};
// ソース Web ページを一時ファイルにレンダリングします。
var tmp = Path.GetTempFileName();
htmlPage.SaveAsPdf(tmp, pdfOptions);
// 作成した PDF を一時ファイルからターゲットストリームにコピーします。
using (var ts = File.OpenRead(tmp))
ts.CopyTo(stream);
// 一時ファイルを削除します。
File.Delete(tmp);
// PDF ドキュメントを保存します。
}
}
}