KeepWithNext.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
{
    // このサンプルは、TextLayout を分割するときに、段落と次の段落の間で改ページを防ぐ方法を示します。
    // このサンプルのテキストの分割は、PaginatedText のテキストの分割と似た仕組みになっています。
    // テキスト処理の詳細については、PaginatedText のコメントを参照してください。
    public class KeepWithNext
    {
        public int CreatePDF(Stream stream)
        {
            const int NPAR = 40;
            var doc = new GcPdfDocument();
            var tl = new TextLayout(72)
            {
                FirstLineIndent = 72 / 2,
                MaxWidth = doc.PageSize.Width,
                MaxHeight = doc.PageSize.Height,
                MarginAll = 72,

            };
            tl.DefaultFormat.Font = Common.Util.getFont();
            tl.DefaultFormat.FontSize = 12;
            // キャプションのテキスト書式を設定します
            var tf = new TextFormat(tl.DefaultFormat)
            {
                FontSize = tl.DefaultFormat.FontSize + 2,
                FontBold = true
            };
            // ドキュメントにキャプションとランダムな段落(文のまとまり)をいくつか追加します。
            for (int i = 0; i < NPAR; i++)
            {
                // キャプションを追加します
                tl.Append("このキャプションと次の段落は同じページに表示されます。", tf);
                // AppendParagraphBreakを使うことで段落を分けつつ、キャプションと続く段落がページをまたがないようにしています。
                tl.AppendParagraphBreak();
                // キャプションの後に続く、ランダムな段落を追加します。
                tl.Append(Common.Util.getString_ja(0,0,1));
            }
            tl.PerformLayout(true);
            // すべての段落行が同じページに収まるよう強制します。
            // これを追加することで、キャプションとその後に続く段落が
            // 同じページに配置されることが、より確実となります。
            var to = new TextSplitOptions(tl)
            {
                KeepParagraphLinesTogether = true,
            };
            // ループ内で、テキストを分割してレンダリングします。
            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;
        }
    }
}