PaginatedText.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;

namespace DsPdfWeb.Demos.Basics
{
    // このサンプルは、複数のページにわたる長いテキストを描画する方法を示します。
    public class PaginatedText
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            // TextLayout を使用してテキストを描画します。
            var tl = new TextLayout(72);
            // 個々の実行において書式を指定しない場合は、フォントとフォントサイズを
            //  TextLayout.DefaultFormat に指定する必要があります。
            tl.DefaultFormat.FontName = "Yu Gothic";
            tl.DefaultFormat.FontSize = 12;
            // 最初の行のオフセットを 1/2 インチにします。
            tl.FirstLineIndent = 72 / 2;
            //
            // 他のすべての書式設定プロパティはデフォルト値のままです。
            // とくに、TextLayoutのデフォルト解像度は72 dpiです。
            // これは DsPdf と同じで、WordWrap は true です。
            // 
            // TextLayout の領域をページ全体に設定します。
            tl.MaxWidth = doc.PageSize.Width;
            tl.MaxHeight = doc.PageSize.Height;
            // ...そして、ページマージンを管理します(外周に 1 インチ)。
            tl.MarginAll = tl.Resolution;
            //
            // テキストを追加します(単一のページに収まらないように 20 段落)
            // TextLayout は段落区切り文字として "\r\n" を解釈することに注意してください)。
            tl.Append(Common.Util.getString_ja(0, 0, 20, 20));
            //
            // すべてのテキストが追加されたら、テキストの描画に必要なグリフを計算し、レイアウトを実行する必要があります。
            // これは、PerformLayout を一回呼び出すことで行うことができ、最初にグリフを再計算するために true を渡します
            // (テキストは指定された最大サイズに収まるわけではありませんが、PerformLayout を一度呼び出す必要があります)。
            tl.PerformLayout(true);
            // 分割オプションを使用して、widow/orphan の制御を提供します。
            var to = new TextSplitOptions(tl);
            to.MinLinesInFirstParagraph = 2;
            to.MinLinesInLastParagraph = 2;
            // ループ内で、テキストを分割して描画します。
            while (true)
            {
                // 'rest' は、収まりきらなかったテキストを受け入れます。
                var splitResult = tl.Split(to, out TextLayout rest);
                doc.Pages.Add().Graphics.DrawTextLayout(tl, PointF.Empty);
                if (splitResult != SplitResult.Split)
                    break;
                tl = rest;
            }
            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}