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 = StandardFonts.Times;
            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("Caption kept together with the next paragraph. No page break after this.", tf);
                // AppendParagraphBreak は段落区切りを追加しますが、2つの段落間の改ページを防ぎます。
                tl.AppendParagraphBreak();
                // キャプションの後のランダムな段落。
                tl.Append(Common.Util.LoremIpsum(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;
        }
    }
}