このページには自動翻訳されたテキストを含めることができます。
PDF ページのレイアウト方法
PdfDocumentBuilder.Generate メソッドは、Document 型のオブジェクトをデリゲートに渡します。そのオブジェクトの Pages メソッドを使用して文書ページを構築します。メソッドには、PageLayout 型のパラメーターを受け取るデリゲートを指定する必要があります。

PDF 文書のすべてのページが同じレイアウトであれば、メソッドの呼び出しは 1 回で十分です。文書内に異なるレイアウトがある場合は、Pages メソッドを 2 回以上呼び出します。たとえば、表紙のレイアウトを 1 回呼び出して設定し、その後でもう一度呼び出してレポート本文を記述できます。
Pages を呼び出すたびに、少なくとも 1 ページが作成されます。内容が指定されていなければ、作成されたページは空になることがあります。
この記事は、PDF 生成のための Layout API に関する連載の一部です。API が初めての場合は、先に Layout API のはじめに をお読みください。
コンテンツ スロット
ページのレイアウトを記述するには、あらかじめ定義されたコンテナーを使用します。これらをコンテンツ スロットとも呼びます。これらのコンテナーには、PageLayout オブジェクトのメソッドを呼び出してアクセスできます。
主なスロットは 3 つあります。Content、Header、Footer です。さらに追加コンテンツ用のスロットとして Background と Foreground があります。既定では、5 つのコンテナーはすべて空で、ページ領域を消費しません。ページ内容を要件に応じてスロットに振り分けます。
コンテナーを使ってページをレイアウトする方法については、コンテナーとその内容 の記事を参照してください。
ヘッダーとフッター
ヘッダーとフッターの内容がそれぞれ Header と Footer のスロットに入ることは、想像どおりでしょう。API は、生成される各ページのメイン コンテンツの上と下にこれらのスロットを繰り返し配置します。Layout API はヘッダーやフッターの内容をページ間で分割しません。ヘッダーまたはフッターがページに収まらない場合は、LayoutException が発生します。
本文
画像、表、テキストなどのページ本文は、Content スロットに入ります。Layout API はこの内容を自動的にページに分割します。
次のコードは、すべてのメイン コンテンツ スロットに単純なテキスト コンテンツを割り当てます。コードでは、スロットの背景色も設定しています。
PdfDocumentBuilder.Create().Generate("pages-main-slots.pdf", doc => doc.Pages(pages => {
pages.Header()
.Text("This text goes to the header")
.BackgroundColor(new PdfRgbColor(66, 135, 245));
pages.Content()
.Text("The main content goes in this slot")
.BackgroundColor(new PdfRgbColor(242, 233, 206));
pages.Footer()
.Text("This is the footer contents")
.BackgroundColor(new PdfRgbColor(194, 192, 188));
}));
コードの結果は pages-main-slots.pdf で確認できます。
ご覧のとおり、各スロットはページの一部しか占有しません。正確な領域はスロット内の内容によって異なります。Header スロットはページ上部に固定されます。Content スロットは Header の直後から始まります。Footer スロットは下部に固定されます。
追加コンテンツ
Background と Foreground は、透かし、オーバーレイ、背景に使えるコンテナーを提供します。Background スロット内の内容は、ページのヘッダー、フッター、本文の下に配置されます。Foreground スロット内の内容は、ページに追加されたすべての内容の上に重なります。
これらのコンテナーはページ全体を占有します。これがこれらのコンテナーの特有の機能です。API は、ヘッダーとフッターのコンテナーと同様に、生成される各ページでその内容を繰り返します。
上のコードにいくつかの行を追加し、Foreground と Background コンテナーの使い方を示しています。
PdfDocumentBuilder.Create().Generate("pages-all-slots.pdf", doc => doc.Pages(pages => {
// ...
pages.Background()
.Background(new PdfRgbColor(208, 227, 204));
pages.Foreground()
.Rotate(45)
.Text(new string(' ', 30) + "Your watermark could go here, in the foreground");
}));
Background コンテナーには、テキストなどは指定していません。背景色だけを指定しています。ヘッダー、本文、フッターの下にあるすべての要素が、この緑色の色調で表示されます。
Foreground コンテナーの内容を回転させ、テキストを追加しています。先頭の空白のため、テキストはヘッダーやフッターの内容を覆いません。すべてのコンテナーの内容がページ上に表示されます。
コードの結果は pages-all-slots.pdf で確認できます。
設定
これまでは、すべてのコード スニペットでページを構成するコンテナーに注目してきました。ここからは、コンテンツ スロットではなく、ページ自体をどのようにカスタマイズできるかを見ていきます。
ページを設定するには、PageLayout クラスのメソッドを使用します。PageLayout オブジェクトは複数ページを記述できることを覚えておいてください。メソッドの呼び出しは、記述したすべてのページに影響します。
サイズ
おそらく最も基本的な設定はページ サイズです。Size メソッドを使うと、ページに対してあらかじめ定義されたサイズを指定できます。A4、Ledger、Monarch Envelope など、一般的なサイズが用意されています。
必要に応じて、ページの向きを指定できます。幅と高さをポイント単位で指定して、カスタムのページ サイズを設定することもできます。
余白
ページの余白は、可読性、見栄え、そしてページ全体の構成に寄与します。
Margin メソッドを使って、すべての余白を同じポイント値に設定します。MarginVertical と MarginHorizontal メソッドを使うと、縦方向または横方向の余白だけを設定できます。MarginLeft/Top/Right/Bottom メソッドを使えば、各余白を個別に指定できます。
テキスト スタイル
Layout API には、テキスト スタイルを作成するための TextStyle クラスがあります。必要な見た目を得るために、スタイルを作成してテキストに適用します。
ページ上のテキストの大部分が同じスタイルを使用する場合があります。その場合は、そのスタイルをページの既定テキスト スタイルとして設定できます。既定スタイルは、本文コンテンツ スロット内のすべてのテキストに適用されます。ただし、特定の要素に対しては既定スタイルを上書きできます。見た目を変えたいテキスト部分に別のスタイルを適用するだけです。
PdfDocumentBuilder.Create().Generate("pages-text-styles.pdf", doc =>
{
var defaultStyle = TextStyle.Parent.FontSize(30);
var tightSpacing = TextStyle.Parent.LetterSpacing(-0.1);
doc.Pages(pages =>
{
pages.TextStyle(defaultStyle);
pages.Content().Text(t =>
{
t.Line("This line uses the default text style.");
t.Line("This line uses a tight letter spacing.").Style(tightSpacing);
t.Line("This line uses the default text style, again.");
});
});
});
コードの結果は pages-text-styles.pdf で確認できます。
文書全体のテキスト スタイルは Document.Typography メソッドで設定できます。Typography クラスの各プロパティは、用途ごとのスタイルを定義します。これらのスタイルは、PageLayout.TextStyle メソッドで指定されたスタイルを上書きします。たとえば、Typography.Body プロパティは、Content コンテナー内のテキストに対する既定スタイルを上書きします。
コンテンツの方向
右から左に書く言語があります。Layout API はそのような言語のテキストも問題なく処理します。ただし、文字方向は明示的に指定する必要があります。
ページ上のテキストのほとんどが RTL 言語である場合は、ページの既定コンテンツ方向を右から左に設定できます。ページ内の任意のコンテナーに対して、異なる方向を指定できます。
PdfDocumentBuilder.Create().Generate("pages-content-direction.pdf", doc =>
{
var defaultTextStyle = doc.TextStyleWithFont(SystemFont.Family("Calibri"));
doc.Pages(pages =>
{
pages.Size(PdfPaperSize.A6).TextStyle(defaultTextStyle);
pages.ContentFromRightToLeft();
pages.Content().Column(column =>
{
column.Item()
.ContentFromLeftToRight()
.Text("There are languages written from right to left.");
column.Item()
.Text("هناك لغات تكتب من اليمين إلى اليسار.");
column.Item()
.Text("יש שפות שנכתבות מימין לשמאל.");
});
});
});
上のコードでは、既定のコンテンツ方向を右から左に設定しています。英語版のフレーズを入れるコンテナーでは、方向を左から右に変更しています。コードの結果は pages-content-direction.pdf で確認できます。
ページ番号
PDF を生成すると、Layout API は現在のページ番号を自動計算します。また、文書内の総ページ数も計算します。番号は、任意のテキスト コンテナーの CurrentPageNumber および PageCount メソッドを呼び出して取得できます。コンテナーがヘッダー、フッター、本文スロットのどこにあるかは関係ありません。
PdfDocumentBuilder.Create().Generate("pages-page-numbers.pdf", doc => doc.Pages(pages =>
{
pages.Content().Text(t =>
{
t.Span("This line is on page ");
t.CurrentPageNumber();
t.Line();
t.Line("Check the footer.");
});
pages.Footer().Row(r =>
{
r.AutoItem().Text("Created with Docotic.Pdf Layout API");
r.RelativeItem(2).Text(t =>
{
t.AlignRight();
t.Span("Page ");
t.CurrentPageNumber();
t.Span(" of ");
t.PageCount();
});
});
}));
コードの結果は pages-page-numbers.pdf にあります。
どちらのメソッドも TextPageNumber のインスタンスを返し、番号の書式設定に使用できます。
PDF ドキュメントにヘッダーとフッターを追加する の例では、ページ番号にカスタム書式を適用する方法を示しています。
サンプル コード
前述の機能をより詳しく扱ったサンプル アプリがあります。ぜひ時間を取って確認してください。