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

'' このサンプルは、ハードコードされた 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
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' レンダリングするコンテンツを表す HTML コード。
        Dim 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ドキュメントを作成し、ページを追加し、描画するグラフィックを取得します。
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim g = page.Graphics

        Try
            '' HTML のレンダリングに使用する GcHtmlBrowser のインスタンスを生成します。
            Using browser = Util.NewHtmlBrowser()

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

                '' レンダリングされたものがある場合、レンダリングされたコンテンツの周りに追加の境界線を描画します。
                If ok Then
                    Dim rc = New RectangleF(72 - 4, 72 - 4, size.Width + 8, size.Height + 8)
                    g.DrawRoundRect(rc, 8, Color.PaleVioletRed)
                ElseIf Not String.IsNullOrEmpty(browser.ErrorLog) Then
                    '' ブラウザエラーを診断する際に役立つオプションの診断です。
                    '' なお、エラーログには、エラーがなくても無害な情報メッセージが含まれていることがあるため、
                    '' エラーログが空かどうかでエラーが発生しているかどうかを判断しないでください。
                    Util.AddNote(browser.ErrorLog, page,
                        New RectangleF(72, 72 + size.Height + 36, page.Size.Width - 144, page.Size.Height - size.Height - 108))
                End If
            End Using
        Catch ex As Exception
            Throw New Exception($"エラー:\n{ex.Message}")
        End Try

        '' PDF を保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class