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

'' このサンプルは、文字列が割り当てられた領域に収まらない場合に
'' 省略記号を表示する方法を示します。
Public Class TextTrimming
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim g = page.Graphics
        Const Inch = 72

        Dim str = "This is a long line of text which does not fit in the allocated space."
        Dim wid = Inch * 4
        Dim dy = 0.3F

        Dim rc = Util.AddNote(
            "TextLayout では、割り当てられた領域に収まらないテキスト行の末尾に" +
            "省略記号(または他の文字)を表示することができます。" + vbLf +
            "トリミングを使用するには、TrimmingGranularity を Character または Word に" +
            "設定します(デフォルトは None)。トリミングは、WrapMode が NoWrap であり、" +
            "テキストが長すぎる場合に行われます。また、レイアウトの幅が狭すぎて1つの単語が" +
            "収まらない場合、折り返したテキストもトリミングされることがあります。" + vbLf +
            "以下は、トリミングされていないテキスト及び文字や単語にてトリミングされたテキストの例です。" +
            "4行目では、異なるトリミング文字(この場合はチルダ)を使っています。" +
            "5行目では、トリミング文字を追加せずにテキストを" +
            "トリミングする方法(トリミング粒度を考慮)を示しています。" +
            "最後の行では、DelimiterCharCode  プロパティと DelimiterCharCount プロパティを使用して、" +
            "ファイルパスを短縮しています。",
            page)
        Dim top = rc.Bottom + 36

        Dim ip = New PointF(rc.Left, top)

        Dim tl = g.CreateTextLayout()
        tl.DefaultFormat.Font = StandardFonts.Times
        tl.DefaultFormat.FontSize = 12
        tl.MaxWidth = wid
        tl.WrapMode = WrapMode.NoWrap

        '' TrimmingGranularity は、デフォルトでは None です。
        tl.Append(str)
        tl.PerformLayout(True)
        g.DrawTextLayout(tl, ip)
        ip.Y += tl.ContentHeight + dy

        '' 文字のトリミング
        tl.TrimmingGranularity = TrimmingGranularity.Character
        '' 注意:テキスト/フォントが変更されていないため、最初の呼び出し後に PerformLayout の
        '' recalculateGlyphsBeforeLayout パラメータが false になることがあります。
        tl.PerformLayout(False)
        g.DrawTextLayout(tl, ip)
        ip.Y += tl.ContentHeight + dy

        '' 単語のトリミング
        tl.TrimmingGranularity = TrimmingGranularity.Word
        tl.PerformLayout(False)
        g.DrawTextLayout(tl, ip)
        ip.Y += tl.ContentHeight + dy

        '' デフォルトでは、tl.EllipsisCharCode は HorizontalEllipsis(0x2026)です。
        '' それをチルダに変更します。
        tl.EllipsisCharCode = &H7E
        tl.PerformLayout(False)
        g.DrawTextLayout(tl, ip)
        ip.Y += tl.ContentHeight + dy

        '' また、tl.EllipsisCharCode を0に設定すると、トリミング文字を描画せずに
        '' テキストをトリミングすることができます。
        tl.EllipsisCharCode = 0
        tl.PerformLayout(False)
        g.DrawTextLayout(tl, ip)
        ip.Y += tl.ContentHeight + dy

        '' もう一つの有用な機能としては、DelimiterCharCode プロパティと
        '' DelimiterCharCount プロパティを使用するものがあります。
        '' これらのプロパティは、通常、文字列の末尾に指定された数の文字を保持する
        '' 長いパスを短縮するために使用されます。
        tl.Clear()
        tl.EllipsisCharCode = &H2026
        tl.Append("c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe")
        tl.DelimiterCharCode = Asc("\"c)
        tl.DelimiterCharCount = 2
        tl.PerformLayout(True)
        g.DrawTextLayout(tl, ip)
        ip.Y += tl.ContentHeight + dy

        g.DrawRectangle(New RectangleF(rc.Left, top, wid, ip.Y - top), Color.OrangeRed)

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