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