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

'' このサンプルは、ハードコードされた 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
    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'>GcHtml</span>!</p>" +
                "</body>" +
                "</html>"

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

        Try
            '' HTML をレンダリングします。
            '' DrawHtml() からの戻り値は、何かがレンダリングされたかどうかを示します。
            '' 出力パラメーター 'size'は、レンダリングされたコンテンツの実際のサイズを返します。
            Dim size As SizeF
            Dim ok = g.DrawHtml(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)
            End If

            '' 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 ex As Exception
            Throw New Exception($"エラー:\n{ex.Message}\nChromium の最後のログメッセージ:\n{GcHtmlRenderer.LastLogMessage}")
        End Try

        '' Save the PDF
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class