SimpleTable.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 テーブルを他の(非 HTML)コンテンツとともに PDF に
    // 挿入する方法を示します。
    // 
    // DsHtml プロジェクトに追加する方法の詳細については、HelloWorldHtml
    // サンプルコードの上部にあるコメントのメモを参照してください。
    public class SimpleTable
    {
        public int 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: #fcf3cf;" +
                "  background-color: #2471a3;" +
                "  text-align: center;" +
                "  padding: 6px;" +
                "  margin-bottom: 0px;" +
                "}" +

                "table {" +
                "  border-bottom: 1px solid #ddd;" +
                "}" +

                "thead {display: table-header-group;}" +

                "#employees {" +
                "  font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif;" +
                "  border-collapse: collapse;" +
                "  width: 100%;" +
                "}" +

                "#employees td, #employees th {" +
                "  border: 0px solid #ddd;" +
                "  padding: 8px;" +
                "}" +

                "#employees tr:nth-child(even){background-color: #d4e6f1;}" +

                "#employees tr:hover {background-color: #ddd;}" +

                "#employees th {" +
                "  padding-top: 12px;" +
                "  padding-bottom: 12px;" +
                "  text-align: left;" +
                "  background-color: #2980b9;" +
                "  color: white;" +
                "}" +
                "</style>" +
                "</head>" +
                "<body>" +

                TTAG +

                "</body>" +
                "</html>";

            const string tableHead = "<h1>従業員</h1>";

            const string tableFmt =
                "<table id='employees'>" +
                "  <thead>" +
                "    <th>氏名</th>" +
                "    <th>住所</th>" +
                "    <th>地域</th>" +
                "  </thead>" +
                "{0}" +
                "</table>";

            const string dataRowFmt =
                "  <tr>" +
                "    <td>{0}</td>" +
                "    <td>{1}</td>" +
                "    <td>{2}</td>" +
                "  </tr>";

            // 新しい PDF ドキュメントを作成します。
            var doc = new GcPdfDocument();
            // ページを追加します。
            var page = doc.NewPage();
            // ページのグラフィックを取得します。
            var g = page.Graphics;

            var nrc =  Common.Util.AddNote(
                "ここでは、XML データベースから取得したデータを使用して HTML テーブルを" +
                "作成し、現在の PDF ページに挿入します。" +
                "GcPdfGraphics.DrawHtml() メソッドによって返されるレンダリングされた" +
                "テーブルサイズに基づいて、フッターがテーブルの下に追加されます。",
                page);

            // サンプル NorthWind データベースから従業員データを取得します。
            using (var ds = new DataSet())
            {
                ds.ReadXml(Path.Combine("Resources", "data", "GcNWind.xml"));
                DataTable dtEmps = ds.Tables["Employees"];
                var emps =
                    from emp in dtEmps.Select()
                    orderby emp["LastName"]
                    select new
                    {
                        Name = emp["LastName"] + ", " + emp["FirstName"],
                        Address = emp["Address"],
                        Country = emp["Country"]
                    };

                // HTML テーブルを作成します。
                var sb = new StringBuilder();
                sb.AppendLine(tableHead);
                foreach (var emp in emps)
                    sb.AppendFormat(dataRowFmt, emp.Name, emp.Address, emp.Country);

                var html = tableTpl.Replace(TTAG, string.Format(tableFmt, sb.ToString()));

                // HTML のレンダリングに使用する GcHtmlBrowser のインスタンスを生成します。
                using var browser = Common.Util.NewHtmlBrowser();

                // HTML をレンダリングします。
                // 戻り値は、何かがレンダリングされたかどうかを示します。
                // 出力パラメーターのサイズは、レンダリングされたコンテンツの実際のサイズを返します。
                var ok = g.DrawHtml(browser, html, nrc.Left, nrc.Bottom + 36,
                    new HtmlToPdfFormat(false) { MaxPageWidth = nrc.Width / 72 },
                    out SizeF size);

                Common.Util.AddNote(
                    "このテキストは、HTML テーブルの下に追加されます。 その位置は、" +
                    "GcPdfGraphics.DrawHtml() によって返されるレンダリングサイズによって決まります。",
                    page,
                    new RectangleF(nrc.Left, nrc.Bottom + size.Height + 72, nrc.Width, int.MaxValue));
            }
            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}