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

namespace GcPdfWeb.Samples.Basics
{
    // このサンプルは、ソフトハイフン(0x00AD)を含むテキストをハイフネーションする方法を示しています。
    // TextLayout.WrapModeがWordWrapに設定されている場合、ブレークはソフトハイフンの位置(テキスト内に
    // 存在する場合)に挿入されます。ハイフネーションを制御するために2つのプロパティが用意されています。
    // - TextLayout.SoftHyphenReplacementCharCode: 行をまたいで単語を改行する際にソフトハイフンの
    //   代わりに使われるキャラクタを指定します。このプロパティのデフォルトは、0x002D(Unicodeの
    //   ハイフンマイナス文字)が設定されています。このプロパティを0に設定すると、 ハイフンキャラクタを
    //   一切表示せずに単語を区切ることができます。このプロパティを-1に設定すると、ソフトハイフンでの
    //   改行を防ぐことができます。
    // - TextLayout.LinesBetweenConsecutiveHyphens: ハイフンで終わる行間の非ハイフン付き行の最小数を
    //   指定します。このプロパティのデフォルトはゼロです。
    public class Hyphenation
    {
        public int CreatePDF(Stream stream)
        {
            // こちら hypho-o のツールを使用し WordCharWrap のサンプルテキストにソフトハイフンを挿入しました。
            var 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("­", "\u00AD");

            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;

            var tl = g.CreateTextLayout();
            tl.Append(str);
            tl.DefaultFormat.Font = StandardFonts.Times;
            tl.DefaultFormat.FontSize = 12;
            tl.MaxWidth = 72 * 3;

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

            var dy = tl.Lines[0].Height + 72 / 16;
            var 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;
        }
    }
}