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

'' このサンプルは、ソフトハイフン(0x00AD)を含むテキストをハイフネーションする方法を示しています。
'' TextLayout.WrapModeがWordWrapに設定されている場合、ブレークはソフトハイフンの位置(テキスト内に
'' 存在する場合)に挿入されます。ハイフネーションを制御するために2つのプロパティが用意されています。
'' - TextLayout.SoftHyphenReplacementCharCode: 行をまたいで単語を改行する際にソフトハイフンの
''   代わりに使われるキャラクタを指定します。このプロパティのデフォルトは、0x002D(Unicodeの
''   ハイフンマイナス文字)が設定されています。このプロパティを0に設定すると、 ハイフンキャラクタを
''   一切表示せずに単語を区切ることができます。このプロパティを-1に設定すると、ソフトハイフンでの
''   改行を防ぐことができます。
'' - TextLayout.LinesBetweenConsecutiveHyphens: ハイフンで終わる行間の非ハイフン付き行の最小数を
''   指定します。このプロパティのデフォルトはゼロです。
Public Class Hyphenation
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' こちら hypho-o のツールを使用し WordCharWrap のサンプルテキストにソフトハイフンを挿入しました。
        Dim str =
            "Lose noth­ing in your doc­u­ments! Grape­City Doc­u­ments for PDF " +
            "in­cludes text and para­graph format­ting, spe­cial char­ac­ters, " +
            "mul­tiple lan­guages, RTL sup­port, ver­tic­al and ro­tated text " +
            "on all sup­por­ted plat­forms."
        '' HTMLのソフトハイフンをUnicodeのものに置き換えます。
        str = str.Replace("­", $"{ChrW(&HAD)}")

        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim g = page.Graphics

        Dim tl = g.CreateTextLayout()
        tl.Append(str)
        tl.DefaultFormat.Font = Util.getFont()
        tl.DefaultFormat.FontSize = 13
        tl.MaxWidth = 72 * 3

        '' デフォルトでは、ソフトハイフン(0x00AD)で改行する場合は、0x002D(ハイフンマイナス)が
        '' ハイフネーション文字として使用されます。
        tl.PerformLayout(True)

        Dim dy = tl.Lines(0).Height + 72 / 16
        Dim rc = New RectangleF(72, 72 + dy, tl.MaxWidth.Value, 72 * 1.4F)

        g.DrawString("デフォルトのハイフネーション:", tl.DefaultFormat, New PointF(rc.Left, rc.Top - dy))
        g.DrawTextLayout(tl, rc.Location)
        g.DrawRectangle(rc, Color.CornflowerBlue)

        rc.Offset(0, 72 * 2)
        '' これにより、2つの連続した行がハイフンで結ばれることを避けることができます。
        tl.LinesBetweenConsecutiveHyphens = 1
        '' ハイフネーションのオプションを変更するには RecalculateGlyphs() が必要です。
        tl.PerformLayout(True)
        g.DrawString("LinesBetweenConsecutiveHyphens: 1", tl.DefaultFormat, New PointF(rc.Left, rc.Top - dy))
        g.DrawTextLayout(tl, rc.Location)
        g.DrawRectangle(rc, Color.CornflowerBlue)

        rc.Offset(0, 72 * 2)
        '' 前の設定をリセットします。
        tl.LinesBetweenConsecutiveHyphens = 0
        '' 単語のハイフネーションを完全に防ぎます。
        tl.SoftHyphenReplacementCharCode = -1
        '' ハイフネーションのオプションを変更するには RecalculateGlyphs() が必要です。
        tl.PerformLayout(True)
        g.DrawString("SoftHyphenReplacementCharCode: -1", tl.DefaultFormat, New PointF(rc.Left, rc.Top - dy))
        g.DrawTextLayout(tl, rc.Location)
        g.DrawRectangle(rc, Color.CornflowerBlue)

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