Outlines.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

'' ドキュメントにアウトラインエントリを追加する方法を示します。
'' PaginatedText も参照してください。
Public Class Outlines
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        '' メインテキストのテキストレイアウト(デフォルトの DsPdf 解像度は 72 dpi です)。
        Dim tl = New TextLayout(72)
        tl.DefaultFormat.Font = Util.getFont()
        tl.DefaultFormat.FontSize = 12
        tl.FirstLineIndent = 72 / 2
        tl.MaxWidth = doc.PageSize.Width
        tl.MaxHeight = doc.PageSize.Height
        tl.MarginAll = tl.Resolution
        '' 章のヘッダーのテキストレイアウトです。
        Dim tlCaption = New TextLayout(72)
        tlCaption.DefaultFormat.Font = Util.getFont()
        tlCaption.DefaultFormat.FontBold = True
        tlCaption.DefaultFormat.FontSize = tl.DefaultFormat.FontSize + 4
        tlCaption.DefaultFormat.Underline = True
        tlCaption.MaxWidth = tl.MaxWidth
        tlCaption.MarginLeft = tlCaption.Resolution
        tlCaption.MarginTop = tlCaption.Resolution
        tlCaption.MarginRight = tlCaption.Resolution
        tlCaption.MarginBottom = tlCaption.Resolution
        '' ページ間のテキストの分割を制御する分割オプションです。
        Dim tso = New TextSplitOptions(tl) With {
            .RestMarginTop = tl.Resolution,
            .MinLinesInFirstParagraph = 2,
            .MinLinesInLastParagraph = 2
        }
        '' いくつかの章を生成し、それぞれにアウトラインエントリーを提供します。
        Const NChapters = 20
        For i = 0 To NChapters - 1

            doc.Pages.Add()
            '' 章タイトル - 章のヘッダーとして印刷し、アウトラインノードとして追加します。
            Dim chapter = $"第 {i + 1} 章"
            tlCaption.Clear()
            tlCaption.Append(chapter)
            tlCaption.PerformLayout(True)
            '' 章のアウトラインノードを追加します。
            doc.Outlines.Add(New OutlineNode(chapter, New DestinationFitH(doc.Pages.Last, tlCaption.MarginTop)))
            '' 章を出力します。
            doc.Pages.Last.Graphics.DrawTextLayout(tlCaption, PointF.Empty)
            '' 章のテキストです。
            tl.Clear()
            tl.FirstLineIsStartOfParagraph = True
            tl.LastLineIsEndOfParagraph = True
            tl.Append(Util.getString_ja(1, 0, 7))
            '' メインテキストレイアウト内の章ヘッダーを考慮します。
            tl.MarginTop = tlCaption.ContentRectangle.Bottom + 12
            tl.PerformLayout(True)
            '' 章を出力します。
            While True
                '' 'rest' は、収まりきらなかったテキストを受け入れます。
                Dim rest As TextLayout = Nothing
                Dim splitResult = tl.Split(tso, rest)
                doc.Pages.Last.Graphics.DrawTextLayout(tl, PointF.Empty)
                If splitResult <> SplitResult.Split Then
                    Exit While
                End If
                tl = rest
                doc.Pages.Add()
            End While
        Next
        ''
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class