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

'' LTR および RTL モードにおける縦書きテキストの描画を示します。
'' また、矩形オブジェクトの周りにテキストをフローする方法も示します。
'' JapaneseColumns も参照してください。
Public Class VerticalText
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        '' 横向きを使用します。
        page.Landscape = True
        Dim g = page.Graphics
        '' 日本語、英語、アラビア語のサンプルテキストです。
        Dim text1 = "日本語のサンプル文字列"
        Dim text2 = " テキストの方向 "
        Dim text3 = "النص العربي 12 + 34 = 46 مع الأرقام "
        '' フォントキャッシュを初期化し、必要なフォントを取得します。
        Dim fc = New FontCollection()
        fc.RegisterDirectory(Path.Combine("Resources", "Fonts"))
        Dim fYuMin = fc.FindFamilyName("Yu Mincho")
        Dim fTimes = fc.FindFamilyName("Times New Roman")
        Dim fArial = fc.FindFamilyName("Arial")
        '' テキストの書式を作成します。
        Dim tf1 = New TextFormat() With {.Font = fYuMin}
        Dim tf2 = New TextFormat() With {.Font = fTimes}
        Dim tf3 = New TextFormat() With {.Font = fArial}
        '' TextLayout を作成し、いくつかのオプションを設定します。
        Dim tl = g.CreateTextLayout()
        tl.FirstLineIndent = 36
        tl.TextAlignment = TextAlignment.Justified
        '' この設定は最後の行も両端揃えにします。
        tl.LastLineIsEndOfParagraph = False
        '' すべてのマージンを 1 インチに設定します。
        tl.MarginAll = tl.Resolution
        tl.MaxWidth = page.Size.Width
        tl.MaxHeight = page.Size.Height
        '' RTL レイアウト。
        tl.RightToLeft = False
        '' テキストをフローさせるオブジェクトのリストを作成します。
        tl.ObjectRects = New List(Of ObjectRect) From {
                New ObjectRect(540, 100, 120, 160),
                New ObjectRect(100, 290, 170, 100),
                New ObjectRect(500, 350, 170, 100)
            }
        '' ページ上の対応する矩形を塗りつぶして表示させます。
        For Each objRect In tl.ObjectRects
            g.FillRectangle(objRect.ToRectangleF(), Color.PaleVioletRed)
        Next

        '' レイアウトにテキストを追加します。
        For i = 1 To 3
            tl.Append(text1, tf1)
            tl.Append("Horizontal Top To Bottom" + text2, tf2)
            tl.AppendLine(text3, tf3)
        Next

        '' 1番目のレイアウトを実行して描画します。
        tl.PerformLayout(True)
        g.DrawTextLayout(tl, PointF.Empty)
        g.FillRectangle(tl.ContentRectangle, Color.FromArgb(20, Color.Red))

        '' 2番目のレイアウトを作成します(縦方向に反時計回りに回転)。
        Dim t = tl.ContentHeight
        tl.Clear()
        tl.RotateSidewaysCounterclockwise = True
        tl.FlowDirection = FlowDirection.VerticalLeftToRight
        tl.MarginTop += t
        '' レイアウトにテキストを追加します。
        For i = 1 To 3
            tl.Append(text1, tf1)
            tl.Append("Vertical Left To Right" + text2, tf2)
            tl.AppendLine(text3, tf3)
        Next
        '' 2番目のレイアウトを実行して描画します。
        tl.PerformLayout(True)
        g.DrawTextLayout(tl, PointF.Empty)
        g.FillRectangle(tl.ContentRectangle, Color.FromArgb(20, Color.Green))

        '' 3番目のレイアウトを作成します(縦書き)。
        tl.Clear()
        tl.FlowDirection = FlowDirection.VerticalRightToLeft
        tl.RotateSidewaysCounterclockwise = False
        '' レイアウトにテキストを追加します。
        For i = 1 To 3
            tl.Append(text1, tf1)
            tl.Append("Vertical Right To Left" + text2, tf2)
            tl.AppendLine(text3, tf3)
        Next
        '' 3番目のレイアウトを実行して描画します。
        tl.PerformLayout(True)
        g.DrawTextLayout(tl, PointF.Empty)
        g.FillRectangle(tl.ContentRectangle, Color.FromArgb(20, Color.Blue))
        ''
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class