NumberedList.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.Drawing

'' テキストの段落を DsPdf の番号付きリストとして描画する方法を示します。
'' このサンプル内におけるテキストのページを描画するメソッドは、PaginatedText サンプルから取得されます。
'' TextRendering も参照してください。
Public Class NumberedList
    '' サンプルで使用されているページレイアウト定数をカプセル化します。
    Private Structure Layout
        Public Shared Margin As Single = 72.0F
        Public Shared ListOffset As Single = 24.0F
    End Structure

    '' TextLayout 内のすべての段落の先頭に数値を付加するユーティリティメソッドです。
    Private Sub AddBullets(ByVal g As GcGraphics, ByVal pt As PointF, ByVal tl As TextLayout, ByRef itemNo As Integer)
        Dim tlBullet = g.CreateTextLayout()
        tlBullet.DefaultFormat.FontName = "Yu Gothic"
        tlBullet.DefaultFormat.FontSize = 12
        For Each line In tl.Lines
            If (line.FirstLineInParagraph) Then
                tlBullet.Clear()
                tlBullet.Append($"{itemNo})")
                itemNo += 1
                tlBullet.PerformLayout(True)
                g.DrawTextLayout(tlBullet, New PointF(pt.X, pt.Y + line.Position + line.LineGap))
            End If
        Next
    End Sub

    '' メインエントリポイントです。
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim ip = New PointF(Layout.Margin, Layout.Margin)

        '' TextLayout.MarginLeft を使用して、リスト番号/箇条書き用ののスペースを予約します。
        Dim tl = New TextLayout(72) With {
            .MaxWidth = doc.PageSize.Width - Layout.Margin * 2,
            .MaxHeight = doc.PageSize.Height - Layout.Margin * 2,
            .ParagraphSpacing = 8,
            .MarginLeft = Layout.ListOffset
        }
        tl.DefaultFormat.FontName = "Yu Gothic"

        '' 20 項目の番号付きリストとして描画される 20 段落のテキストを追加します。
        tl.Append(Util.getString_ja(0, 0, 20, 1, 6))
        '' レイアウトを実行します。
        tl.PerformLayout(True)
        '' 分割オプションを使用して、widow/orphan の制御を提供します。
        Dim tso = New TextSplitOptions(tl)
        tso.MinLinesInFirstParagraph = 2
        tso.MinLinesInLastParagraph = 2
        '' ループ内でテキストを分割して描画し(PaginatedText を参照)、
        '' リスト番号を追加します。
        Dim itemNo = 1
        While (True)
            '' 'rest' は、収まりきらなかったテキストを受け入れます。
            Dim rest As TextLayout = Nothing
            Dim splitResult = tl.Split(tso, rest)
            Dim g = doc.Pages.Add().Graphics
            g.DrawTextLayout(tl, ip)
            AddBullets(g, ip, tl, itemNo)
            If splitResult <> SplitResult.Split Then
                Exit While
            End If
            tl = rest
        End While
        ''
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class