HelloWorldHtml.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS 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 DsPdfWeb.Demos
{
    // このサンプルは、ハードコードされた HTML 文字列をレンダリングする方法を示しています。
    // 
    // DsHtml をプロジェクトに追加するには:
    // - GrapeCity.DioDocs.Html.ja(DsHtml)パッケージにより、HTML のレンダリングを
    //   可能にするパブリッククラスと拡張メソッドが提供されます。
    // - DsHtml は、Windows、macOS、Linuxの各プラットフォームに対応しています。
    // 
    // DsHtml を使用する際のエラーへの対処:
    // - DsHtml が期待どおりに動作しない場合(例えば、HTML を PDF にレンダリング
    //   すると無効な PDF が生成される)、SaveAsPdf の呼び出しが戻った後に
    //   文字列プロパティ GcHtmlBrowser.ErrorLog の内容を確認すると、
    //   エラーが発生した理由がわかる場合があります。
    // 
    // DsHtmlは、ローカルにある Chromium ベースのブラウザを使用します。
    // OS にインストールされている Google Chrome または Microsoft Edge ブラウザを使用するか、
    // Chromium ブラウザのインスタンスをアプリケーションのローカルフォルダまたは
    // 任意の共有フォルダにダウンロードするかを選択できます。
    // インストールされている Chromium ベースのブラウザへのパスがわかる場合は、
    // 上記の選択をせずにそのブラウザを使用します。
    // BrowserFetcher クラスを使用して、ブラウザをインストールまたは既にインストールされた
    // ブラウザを取得でき、BrowserFetcher.GetDownloadedPath() を使用して、
    // ブラウザへのパスを取得できます。Chrome または Edge の実行ファイルへの
    // パスを取得するメソッドや、必要に応じて Chromium ブラウザをローカルフォルダに
    // ダウンロードするのに役立つその他のオプションやメソッドについては、
    // BrowserFetcherクラスを参照してください。
    // 
    // 実装例として、本サンプルで使用している Util.NewHtmlBrowser() メソッドをご参照ください。
    // 
    // 上記の注意事項は、DsHtml を使用するすべてのプロジェクトに適用されます。
    public class HelloWorldHtml
    {
        public int 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'>DsHtml</span>!</p>" +
                "</body>" +
                "</html>";

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

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

                // HTML をレンダリングします。
                // DrawHtml() からの戻り値は、何かがレンダリングされたかどうかを示します。
                // 出力パラメーター 'size'は、レンダリングされたコンテンツの実際のサイズを返します。
                var ok = g.DrawHtml(browser, html, 72, 72,
                    new HtmlToPdfFormat(false) { MaxPageWidth = 6.5f, MaxPageHeight = 9f },
                    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);
                }
                else if (!string.IsNullOrEmpty(browser.ErrorLog))
                {
                    // ブラウザエラーを診断する際に役立つオプションの診断です。
                    // なお、エラーログには、エラーがなくても無害な情報メッセージが含まれていることがあるため、
                    // エラーログが空かどうかでエラーが発生しているかどうかを判断しないでください。
                    Common.Util.AddNote(browser.ErrorLog, 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}");
            }

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