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;
}
}
}