TateChuYoko.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports System.Text.RegularExpressions
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text

'' このサンプルは、縦書きのブロック内に直立の短い英数字を描画する方法を示します。
'' これは、中国語、日本語、韓国語における縦書きテキストの描画で使用されます。
'' CSS では、これは日本語の名前で「縦中横(Tate Chu Yoko)」と呼ばれています。
'' この処理を実現するには、GcGraphicsのTextFormat.UprightInVerticalText プロパティ
'' を設定し、TextLayout と TextFormat などのプロパティを使用して、動作を調整します。
Public Class TateChuYoko
    Sub CreatePDF(ByVal stream As Stream)
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim g = page.Graphics

        Dim rc = Util.AddNote(
            "縦書きテキストに横書きの数字や英文字がある場合、文字の描画方向を変更して混在させます。" +
            "CSS では、これは日本語の名前で「縦中横(Tate Chu Yoko)」と呼ばれており、" +
            "中国語、日本語、韓国語の縦書きテキストで使われます。" +
            "縦中横をサポートするための機能として、TextFormat.UprightInVerticalText や" +
            "TextLayout 、TextFormat の関連プロパティなどを提供しています。",
            page)

        Dim fntJp = Font.FromFile(Path.Combine("Resources", "Fonts", "YuGothM.ttc"))
        Dim fntLat = Font.FromFile(Path.Combine("Resources", "Fonts", "MyriadPro-Cond.otf"))
        Dim hiliteFore = Color.DarkSlateBlue
        Dim hiliteBack = Color.FromArgb(&HFFFFFF99)

        Dim tl = g.CreateTextLayout()

        '' テキストフローと他のレイアウトプロパティを設定します。
        tl.FlowDirection = FlowDirection.VerticalRightToLeft
        tl.MaxWidth = page.Size.Width
        tl.MaxHeight = page.Size.Height
        tl.MarginAll = 45
        tl.MarginTop = rc.Bottom + 36
        tl.ParagraphSpacing = 12
        tl.LineSpacingScaleFactor = 1.4F

        '' g.FillRectangle(
        '' New RectangleF(tl.MarginLeft, tl.MarginTop, tl.MaxWidth.Value - tl.MarginLeft - tl.MarginRight, tl.MaxHeight.Value - tl.MarginTop - tl.MarginBottom),
        '' Color.AliceBlue)

        '' 直立のテキストのテキスト書式(短いラテン文字または数字)
        '' (GlyphWidths は対応するフォント機能を ON にしますが、フォントに
        '' 存在する機能のみに影響を与えます)
        Dim fUpright = New TextFormat() With
        {
            .Font = fntLat,
            .FontSize = 14,
            .UprightInVerticalText = True,
            .GlyphWidths = GlyphWidths.QuarterWidths,
            .TextRunAsCluster = True
        }

        '' 縦書きのテキスト(日本語)および横書きのテキスト(ラテン文字)のテキスト書式
        Dim fVertical = New TextFormat(fUpright) With
        {
            .Font = fntJp,
            .UprightInVerticalText = False,
            .GlyphWidths = GlyphWidths.Default,
            .TextRunAsCluster = False
        }

        '' 横書きのテキストランが垂直方向の間隔に影響を与えないように設定します。
        fVertical.UseVerticalLineGapForSideways = True

        '' 強調表示されたヘッダ用の2つの追加のテキスト書式
        Dim fUpHdr = New TextFormat(fUpright) With
        {
            .ForeColor = hiliteFore,
            .BackColor = hiliteBack
        }
        Dim fVertHdr = New TextFormat(fVertical) With
        {
        .ForeColor = hiliteFore,
        .BackColor = hiliteBack
        }

        tl.Append("PDF", fUpright)
        tl.Append("ファイルをコードから", fVertical)
        tl.Append("API", fUpright)
        tl.Append("を利用することで操作できます。クロスプラットフォーム環境で動作するアプリケーションの開発を支援する", fVertical)
        tl.Append("API", fUpright)
        tl.Append("ライブラリです。", fVertical)

        '' 残りのテキスト用の小さいフォントサイズ
        fUpright.FontSize -= 2
        fVertical.FontSize -= 2

        '' 1:
        tl.AppendParagraphBreak()
        tl.Append("PDF", fUpHdr)
        tl.Append("用の包括的な", fVertHdr)
        tl.Append("API", fUpHdr)

        tl.AppendSoftBreak()
        tl.Append("PDF", fUpright)
        tl.Append("バージョン「", fVertical)
        tl.Append("1.7", fUpright)
        tl.Append("」に準拠した", fVertical)
        tl.Append("API", fUpright)
        tl.Append("を提供し、レイアウトや機能を損なうことなく、豊富な機能を備えた", fVertical)
        tl.Append("PDF", fUpright)
        tl.Append("文書を生成、編集、保存できます。", fVertical)

        '' 2:
        tl.AppendParagraphBreak()
        tl.Append("完全なテキスト描画", fVertHdr)

        tl.AppendSoftBreak()
        tl.Append("PDF", fUpright)
        tl.Append("文書にテキストの描画情報が保持されます。テキストと段落の書式、特殊文字、複数の言語、縦書き、テキスト角度などが保持さるので、完全な形でテキスト描画を再現できます。", fVertical)

        '' 3:
        tl.AppendParagraphBreak()
        tl.Append(".NET Standard 2.0 準拠", fVertHdr)

        tl.AppendSoftBreak()
        tl.Append(".NET Core、.NET Framework、Xamarinで動作するアプリケーションを開発できます。Windows、macOS、Linuxなどクロスプラットフォーム環境で動作可能です。", fVertical)

        '' 4:
        tl.AppendParagraphBreak()
        tl.Append("100", fUpHdr)
        tl.Append("を超える", fVertHdr)
        tl.Append("PDF", fUpHdr)
        tl.Append("操作機能", fVertHdr)

        tl.AppendSoftBreak()
        tl.Append("ページの追加や削除、ページサイズ、向きの変更だけでなく、ファイルの圧縮、", fVertical)
        tl.Append("Web", fUpright)
        tl.Append("に最適化した", fVertical)
        tl.Append("PDF", fUpright)
        tl.Append("の生成など高度な機能も", fVertical)
        tl.Append("API", fUpright)
        tl.Append("操作で実現します。また、署名からセキュリティ機能まで様々な機能を含んだ", fVertical)
        tl.Append("PDF", fUpright)
        tl.Append("フォームを生成可能です。", fVertical)

        '' 5:
        tl.AppendParagraphBreak()
        tl.Append("高速、軽量アーキテクチャ", fVertHdr)

        tl.AppendSoftBreak()
        tl.Append("軽量", fVertical)
        tl.Append("API", fUpright)
        tl.Append("アーキテクチャでメモリと時間を節約できます。", fVertical)
        tl.AppendSoftBreak()
        tl.Append("また、他の生成用ツールに依存せずドキュメントを生成可能です。", fVertical)

        '' 6:
        tl.AppendParagraphBreak()
        tl.Append("クラウドアプリケーション展開", fVertHdr)
        tl.Append("", fUpHdr)

        tl.AppendSoftBreak()
        tl.Append("Azure、AWSなどのサービスに配置するクラウドアプリケーションの開発で利用可能です。仮想マシン、コンテナ、サーバーレスなどの方法で配置できます。", fVertical)

        tl.AppendParagraphBreak()
        tl.Append("和暦の日付表示", fVertHdr)
        tl.AppendSoftBreak()
        Dim dt As DateTime = DateTime.Today
        Dim ci As System.Globalization.CultureInfo = New System.Globalization.CultureInfo("ja-JP", False)
        ci.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar()
        tl.Append(dt.ToString("gg", ci), fVertical)
        Dim year = ci.DateTimeFormat.Calendar.GetYear(dt)
        If year = 1 Then
            tl.Append("元", fVertical)
        Else
            tl.Append(year.ToString("##"), fUpright)
        End If
        tl.Append("年", fVertical)
        tl.Append(dt.Month.ToString(), fUpright)
        tl.Append("月", fVertical)
        tl.Append(dt.Day.ToString(), fUpright)
        tl.Append("日", fVertical)
        tl.Append("(", fVertical)
        tl.Append(dt.ToString("ddd", ci), fVertical)
        tl.Append(")", fVertical)

        tl.PerformLayout(True)
        g.DrawTextLayout(tl, PointF.Empty)

        '' PDF ドキュメントを保存します。
        doc.Save(stream)
    End Sub
End Class