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

'' このサンプルでは、ドキュメントにページラベルを追加する方法を示します。
'' ページラベルを使用すると、ドキュメントを論理的に関連するページ範囲のシーケンスに
'' 分割できます(例:序文、本文、ポストフェイス)。
'' 「チャプター」で構成されるこのサンプルでは、各章に個別のページラベル範囲を追加します。
'' このサンプルのコードは、Outlines サンプルに似ています。
Public Class PageLabels
    Sub CreatePDF(ByVal stream As Stream)
        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.MarginAll = tlCaption.Resolution
        '' ページ間のテキストの分割を制御する分割オプションです。
        Dim tso = New TextSplitOptions(tl) With
        {
            .RestMarginTop = tl.Resolution,
            .MinLinesInFirstParagraph = 2,
            .MinLinesInLastParagraph = 2
        }
        '' いくつかの章を生成し、それぞれにアウトラインエントリーを提供します。
        Const NChapters = 20
        For i = 0 To NChapters - 1
            '' 章タイトル - 章のヘッダーとして印刷し、アウトラインノードとして追加します。
            Dim chapter = $"第 {i + 1} 章"

            '' ページラベルを追加するのに必要なのは、範囲内の最初のページの
            '' インデックスに関連付けられたページラベル範囲、範囲プレフィックス
            '' および番号付けスタイルを追加することだけです。
            doc.PageLabelingRanges.Add(doc.Pages.Count, New PageLabelingRange($"{chapter}, p. ", NumberingStyle.DecimalArabic, 1))

            doc.Pages.Add()
            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, 5))
            '' メインテキストレイアウト内の章ヘッダーを考慮します。
            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
                Dim p = doc.Pages.Add()
            End While
        Next
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
    End Sub
End Class