TextTrimming.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS 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 DsPdfWeb.Demos.Basics
{
    // このサンプルは、文字列が割り当てられた領域に収まらない場合に
    // 省略記号を表示する方法を示します。
    public class TextTrimming
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;
            const float In = 72;

            var str = "This is a long line of text which does not fit in the allocated space.";
            var wid = In * 4;
            var dy = 0.3f;

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

            var ip = new PointF(rc.Left, top);

            var 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 = 0x007E;
            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 = 0x2026;
            tl.Append(@"c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
            tl.DelimiterCharCode = '\\';
            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;
        }
    }
}