SimpleTable.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © MESCIUS inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports System.Text
Imports System.Data
Imports System.Linq
Imports System.Collections.Generic
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Html

'' このサンプルは、HTML テーブルを他の(非 HTML)コンテンツとともに PDF に
'' 挿入する方法を示します。
'' 
'' DsHtml プロジェクトに追加する方法の詳細については、HelloWorldHtml
'' サンプルコードの上部にあるコメントのメモを参照してください。
Public Class SimpleTable
    Function CreatePDF(ByVal stream As Stream) As Integer
        Const TTAG = "___TABLE___"

        '' HTML ページテンプレート。
        Const 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 tableHead = "<h1>従業員</h1>"

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

        Const dataRowFmt =
            "  <tr>" +
            "    <td>{0}</td>" +
            "    <td>{1}</td>" +
            "    <td>{2}</td>" +
            "  </tr>"

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

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

        '' サンプル NorthWind データベースから従業員データを取得します。
        Using ds = New DataSet()
            ds.ReadXml(Path.Combine("Resources", "data", "GcNWind.xml"))
            Dim dtEmps = ds.Tables("Employees")
            Dim emps =
                From emp In dtEmps.Select()
                Order By emp("LastName")
                Select New With
                    {
                        .Name = emp("LastName") + ", " + emp("FirstName"),
                        .Address = emp("Address"),
                        .Country = emp("Country")
                    }

            '' HTML テーブルを作成します。
            Dim sb = New StringBuilder()
            sb.AppendLine(tableHead)
            For Each emp In emps
                sb.AppendFormat(dataRowFmt, emp.Name, emp.Address, emp.Country)
            Next

            Dim html = tableTpl.Replace(TTAG, String.Format(tableFmt, sb.ToString()))

            '' HTML のレンダリングに使用する GcHtmlBrowser のインスタンスを生成します。
            Using browser = Util.NewHtmlBrowser()
                Dim size As SizeF
                '' HTML をレンダリングします。
                '' 戻り値は、何かがレンダリングされたかどうかを示します。
                '' 出力パラメーターのサイズは、レンダリングされたコンテンツの実際のサイズを返します。
                Dim ok = g.DrawHtml(
                    browser, html, nrc.Left, nrc.Bottom + 36,
                    New HtmlToPdfFormat(False) With {.MaxPageWidth = nrc.Width / 72},
                    size)

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