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

namespace GcPdfWeb.Samples
{
    // このサンプルは、ハードコードされた HTML 文字列をレンダリングする方法を示しています。
    // 
    // GcHtml をプロジェクトに追加する:
    // - GrapeCity.Documents.Html(GcHtml)パッケージにより、HTML のレンダリングを
    //   可能にするパブリッククラスと拡張メソッドが提供されます。
    // - GcHtml は、Windows、macOS、および Linuxプ ラットフォームをサポートしています。
    // - 内部的には、3つのシステム依存 HTML エンジンパッケージのいずれかを使用します。
    //   - GrapeCity.Documents.Html.Windows.X64
    //   - GrapeCity.Documents.Html.Mac.X64
    //   - GrapeCity.Documents.Html.Linux.X64
    // - GcHtml は、実行時に正しいシステム依存エンジンパッケージを自動的に選択しますが、
    //   GcHtml がそれを見つけることができるように、そのパッケージをプロジェクトで参照する
    //   必要があります。3つすべてのプラットフォームパッケージへの参照をプロジェクトに追加でき
    //   ます。1つまたは2つのプラットフォームのみを対象とする場合は、これらの対象プラット
    //   フォームのパッケージのみを追加できます。
    // 
    // GcHtml を使用する際のエラーの処理:
    // - GcHtml が期待どおりに動作しない場合(たとえば、HTML を PDF にレンダリング
    //   すると無効な PDF が生成される)- GcHtml の呼び出しが戻った後に静的文字列
    //   プロパティ GcHtmlRenderer.LastLogMessage の内容を確認し、エラーが発生した
    //   理由を説明する場合があります(たとえば、Linuxで必要な共有ライブラリが欠落
    //   している可能性があります)。
    // - 診断が GcHtmlRenderer.LastLogMessage に書き込まれずに、HTML レンダリング
    //   プロセスがハングすることがあります。この場合、GcHtml はハングプロセスを自動的に
    //   強制終了しますが、診断はありません。通常、このような状況は発生しません。
    // 
    // 上記の注意事項は、GcHtml を使用するすべてのプロジェクトに適用されます。
    public class HelloWorldHtml
    {
        public void CreatePDF(Stream stream)
        {
            // レンダリングするコンテンツを表すHTMLコード。
            var html = "<!DOCTYPE html>" +
                "<html>" +
                "<head>" +
                "<style>" +
                "span.bold {" +
                    "font-weight: bold;" +
                "}" +
                "p.round {" +
                    "font: 36px arial, sans-serif;" +
                    "color: DarkSlateBlue;" +
                    "border: 4px solid SlateBlue;" +
                    "border-radius: 16px;" +
                    "padding: 3px 5px 3px 5px;" +
                    "text-shadow: 3px 2px LightSkyBlue;" +
                "}" +
                "</style>" +
                "</head>" +
                "<body>" +
                "<p class='round'>Hello, World, from <span class='bold'>GcHtml</span>!</p>" +
                "</body>" +
                "</html>";

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

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

                // レンダリングされたものがある場合、レンダリングされたコンテンツの周りに追加の境界線を描画します。
                if (ok)
                {
                    var rc = new RectangleF(72 - 4, 72 - 4, size.Width + 8, size.Height + 8);
                    g.DrawRoundRect(rc, 8, Color.PaleVioletRed);
                }

                // Chromium の動作を診断するのに役立つオプションの診断(最後のログ
                // メッセージに問題がない場合でも、最後のログメッセージに無害なメッセージが
                // 含まれている可能性があるため、このようなコードを本番環境のままにしないでください):
                // if (!string.IsNullOrEmpty(GcHtmlRenderer.LastLogMessage))
                // {
                //   Common.Util.AddNote(GcHtmlRenderer.LastLogMessage, page, 
                //     new RectangleF(72, 72 + size.Height + 36, page.Size.Width - 144, page.Size.Height - size.Height - 108));
                // }
            }
            catch (Exception ex)
            {
                throw new Exception($"エラー:\n{ex.Message}\nChromium の最後のログメッセージ\n{GcHtmlRenderer.LastLogMessage}");

            }

            // PDF ドキュメントを保存します。
            doc.Save(stream);
        }
    }
}