このページには自動翻訳されたテキストを含めることができます。

コンテナのサイズ、位置、レンダリング

コンテンツはドキュメントの最も重要な部分です。 それについては間違いありません。 もう 1 つの重要な部 分は、明確で専門的かつ効果的なコミュニケーションを生み出す書式設定です。 適切にフォーマットされた文 書は、視覚的に魅力的で読みやすく、ナビゲートしやすいものです。

コンテナを使用してコンテンツを整理する方法はすでにご存知かもしれません。 そして、それらに背景色を適 用する方法。 この記事では、コンテナーのサイズと位置を指定する方法について説明します。 コンテンツの 条件付きレンダリングなどの高度な機能についても説明します。 右から左へのコンテンツ方向のサポートに関 する情報があります。

コンテナの位置決め

LayoutContainer クラスは、コンテナを専門的に配置 するために必要なものをすべて提供します。 パディングや配置を適用することで、ユーザーに好印象を与える 文書を作成できます。

この記事は、PDF 生成のための Layout API に関するシリーズの一部です。 API を初めて使用する場合は、ま ず Layout API の使用開始 の部分をお読みください。

Docotic.Pdf ライブラリ 9.4.17469-dev レイアウトアドオン 9.4.17469-dev
回帰テスト 14,760人が合格 NuGet の合計ダウンロード数 4,447,259

サイズ

デフォルトでは、コンテナーはそのコンテンツに必要な最小領域を占有します。 別の言い方をすると、コンテ ナのサイズはそのコンテンツの本質的なサイズと同じです。

画像の固有のサイズは、画像ファイル自体の寸法によって決まります。 テキスト スパンの固有のサイズは、 そのスパン内のすべてのグリフをカバーする領域のサイズです。

ColumnTable の ような複合コンテナのサイズは、コンテナ部分のサイズによって異なります。

Width & Height

Width メソッドと Height メソッドを使用すると、コンテナの正 確な幅と高さを指定できます。 これはプレースホルダー コンテナーに非常に便利です。

正確なサイズは画像にも適しています。 これは、Layout API が ImageContentMode に応じてコンテナに合わせてス ケールを調整するためです。

複合コンテナーとテキストを含むコンテナーの正確なサイズに注意する必要があります。 指定されたサイズに コンテンツを収めることができない場合 は、LayoutException が発生します。

幅または高さのみに制約を設定したい場合があります。 MinWidthMinHeightMaxWidth、 および MaxHeight メソッドを使用して制約 を設定できます。

制約を満たすことができない場合、ライブラリは LayoutException をスローすることに注意してください。

Extend

コンテナーは、利用可能なスペースを最大化するためにそれ自体を拡張できます。 これは、正確なサイズやサ イズ制約がわからない場合に便利です。

コンテナが水平方向のみのすべての利用可能なスペースを占めるようにしたい場合 は、ExtendHorizontal メソッドを 使用します。 ExtendVertical はコン テナを垂直方向のみに拡張したい場合に便利です。 Extend メソッドを使用すると、コンテナは両方 向で利用可能なスペースをすべて占有します。

var gray = new PdfGrayColor(75);
var text = "Content goes here";
var size = new PdfSize(150, 50);

PdfDocumentBuilder.Create().Generate("positioning-extend.pdf", doc =>
{
    for (int i = 0; i < 4; i++)
    {
        doc.Pages(page =>
        {
            page.Size(size);
            page.Content().Row(r =>
            {
                var container = r.AutoItem().Background(gray);
                switch (i)
                {
                    case 0:
                        container.Text(text);
                        break;

                    case 1:
                        container.ExtendHorizontal().Text(text);
                        break;

                    case 2:
                        container.ExtendVertical().Text(text);
                        break;

                    case 3:
                        container.Extend().Text(text);
                        break;
                }
            });
        });
    }
});

上記のコードの結果は positioning-extend.pdf に あります。 ご覧のとおり、4 ページのそれぞれに灰色の背景に同じテキストが含まれています。 ただし、コ ンテナのサイズはページごとに異なります。

MinimalBox

LayoutContainerMinimalBox メソッドを提供します。 これ は、Extend メソッドとは逆です。 MinimalBox は、コンテンツに必要な最小限のスペースのみを使用するネストされたコンテナを生成します。

var gray = new PdfGrayColor(75);
var size = new PdfSize(150, 50);

PdfDocumentBuilder.Create().Generate("positioning-minimalbox.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Size(size);
        page.Content().MinimalBox().Background(gray).Text("I don't want more space");
    });

    doc.Pages(page =>
    {
        page.Size(size);
        page.Content().Background(gray).Text("I'll take everything");
    });
});

上記のコードの結果は positioning-minimalbox.pdf にあります。 MinimalBox 呼び出しにより、最初のペー ジのテキストは必要なスペースのみを占めます。 2 ページ目では、テキストがページ全体をカバーします。

Scale

コンテナ内のあらゆるコンテンツをスケーリングすることが可能です。 Scale メソッドは、水平方向と垂直方向の両方 のコンテンツに影響を与えます。 コンテンツを一方向のみに変更するに は、ScaleHorizontal または ScaleVertical メソッドを使用しま す。 最後の 2 つの方法では、コンテンツのアスペクト比が維持されません。

スケール値が 1 未満の場合、コンテナーが占める領域が減ります。 1 より大きい値を指定すると、面積が増 加します。 コンテナ内のコンテンツを反転するには、負のスケール値を使用します。 たとえ ば、ScaleVertical(-1) を指定すると、元のコンテンツが上下逆さまになります。

PdfDocumentBuilder.Create().Generate("positioning-scale.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content()
            .MinimalBox()
            .Column(column =>
            {
                var scales = new[] { 0.5f, 0.75f, 1, 1.3f, 1.5f };

                foreach (var scale in scales)
                {
                    var percent = (int)(scale * 100);
                    column.Item()
                        .Scale(scale)
                        .Text(FormattableString.Invariant($"Scale equals {scale} ({percent}%)."))
                            .FontSize(20);

                    column.Item().LineHorizontal(0.5);
                }
            });
    });
});

上記のコードの結果は positioning-scale.pdf にあ ります。

ScaleToFit

利用可能なスペースに収まるようにコンテンツを縮小できます。 たとえば、人の名前や住所を出力するための 固定領域がある場合です。 もちろん、長い名前の場合は領域を増やすこともできます。 ただし、より簡単な 方法は、テキストを少し縮小することです。 ScaleToFit メソッドを使用してコンテン ツを縮小します。

ScaleToFit はコンテンツのアスペクト比を保持します。 この方法ではコンテンツが大きくなることはあり ません。 このメソッドは反復計算を実行することに注意してください。 これにより、PDF 生成プロセスが遅 くなる可能性があります。

PdfDocumentBuilder.Create().Generate("positioning-scaletofit.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content().Column(column =>
        {
            for (int i = 0; i < 5; i++)
            {
                column.Item()
                    .Width(230 - 20 * i)
                    .Height(20)
                    .ScaleToFit()
                    .Border(b => b.Thickness(0.5))
                    .Text(" This text should fit into the changing width.");
            }
        });
    });
});

上記のコードの結果は positioning-scaletofit.pdf にあります。

AspectRatio

アスペクト比は、コンテナの幅と高さの比例関係を定義します。 コンテナのアスペクト比を調べるには、コン テナの幅を高さで割ります。

コンテナのアスペクト比を指定するに は、AspectRatio メソッドを使用しま す。 これは、さまざまなレイアウトやページ サイズに合わせて再利用可能なコンテナを設計するときに役立 ちます。

PdfDocumentBuilder.Create().Generate("positioning-aspectratio.pdf", doc =>
{
    var ratios = new double[] { 0.25, 0.5, 1, 2 };
    foreach (var ratio in ratios)
    {
        var ratioText = ratio.ToString(CultureInfo.InvariantCulture);
        doc.Pages(page =>
        {
            page.Size(200, 200);
            page.Content().Column(column =>
            {
                column.Item()
                    .AspectRatio(ratio)
                    .Background(new PdfGrayColor(75))
                    .Text($"Width / Heigth = {ratioText}");
            });
        });
    }
});

上記のコードの結果は positioning-aspectratio.pdf にあります。

このメソッドには、タイプ AspectRatioMode のオプ ションのパラメーターがあります。 このパラメータを使用して、アスペクト比を維持しながらコンテンツのサ イズを変更する方法を指定します。

指定されたアスペクト比を持つコンテナーは、可能な限り多くのスペースを占有します。 モードに応じて、コ ンテナは利用可能な領域 (デフォルト)、幅、または高さ全体を占有しようとします。

ライブラリは LayoutException をスローする可能性が あることに注意してください。 サイズ、アスペクト比、アスペクト比モードの要件を満たせない場合に発生し ます。

Unconstrained

コンテナーにはサイズの制約がまったくない場合があります。 コンテナからすべてのサイズ制約を削除するに は、Unconstrained メソッドを使用し ます。

制約のないコンテナ内のコンテンツは、コンテンツの固有サイズと同じサイズのスペースを占有します。 制約 のないコンテナ自体はスペースを占有しません。 その結果、兄弟コンテナが制約のないコンテナのコンテンツ をカバーできるようになります。

PdfDocumentBuilder.Create().Generate("positioning-unconstrained.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content().MinimalBox()
            .Border(b => b.Thickness(0.5))
            .Column(column =>
            {
                column.Item().Text("First item");

                column.Item().Unconstrained()
                    .Text("Second item ignores all size constraints");

                // 3 番目の項目に空行を使用する
                column.Item().Text(new string(' ', 20))
                    .BackgroundColor(new PdfRgbColor(187, 237, 237), 50);

                column.Item().Text("Fourth item");
            });
    });
});

上記のコードの結果は positioning-unconstrained.pdf にありま す。 コードでは、列の 3 番目の項目に半透明の背景を持つスペース行を使用しました。 ご覧のとおり、3 番 目の項目は 2 番目の (制約されていない) 項目を部分的にカバーしています。

位置

コンテナの位置はさまざまな要因によって決まります。 それらの一部には、配置、パディング、親コンテナの 位置、コンテンツの方向などがあります。 デフォルトでは、コンテナは左端と一番上の利用可能な位置に固定 されます。

Padding

最も一般的な要件の 1 つは、コンテナーのコンテンツの周囲にスペースを追加することです。 LayoutContainer は、コンテナーのパディング領域を 設定するための一連のメソッドを提供します。 パディング領域は、コンテンツとその境界線の間のスペースで す。 言い換えると、パディングはコンテンツを囲む内部空間を表します。

Padding メソッドは、コンテナの 4 つの側面 すべてに一度にパディングを設定します。 左側と右側のみにパディングを指定するに は、PaddingHorizontal メソッド を使用します。 PaddingVertical は 上辺と下辺のみで同じことを行います。 片側に個別にパディングを設定するに は、PaddingTop/Bottom/Left/Right メソッドのいずれかを使用します。

Align

コンテナの位置を変更するには、位置合わせメソッドを使用します。 AlignLeft/AlignCenter/AlignRight メ ソッドは水平方向の配置を適用し、ネストされたコンテナを返します。 AlignTop/AlignMiddle/AlignBottom メソッドは、対応する垂直方向の配置を持つネストされたコンテナを返します。

明示的にアラインメントが適用されたコンテナーは、必要最小限の幅および/または高さの領域を取得します。 次のコードは、2 つの項目を含む列を作成します。 1 つのアイテムには位置合わせが明示的に適用されていま す。

PdfDocumentBuilder.Create().Generate("positioning-alignment.pdf", doc =>
{
    var color = new PdfRgbColor(187, 237, 237);
    var text = "Hello";
    doc.Pages(page =>
    {
        page.Size(200, 100);
        page.Content().Column(c =>
        {
            c.Item().Extend().Background(color).Text(text);
            c.Item().Extend().AlignLeft().Background(color).Text(text);
        });
    });
});

Extend 呼び出しにより、両方の項目がページ 全体を占有します。 2 番目の項目で AlignLeft メソッドを呼び出します。 項目 のコンテナはデフォルトでテキストを左に揃えるため、この呼び出しでは位置は変更されません。 ただし、明 示的に適用された配置により、2 番目の項目が占める領域が変更されます。

上記のコードの結果は positioning-alignment.pdf にあります。

Translate

コンテナを水平または垂直に再配置するには、Translate/TranslateX/TranslateY メソッドを使用します。 最初の方法では、コンテナを水平方向と垂直方向の両方に移動します。 他の 2 つはコンテナを一方向にのみ 移動します。

これらのメソッドはすべて位置をオーバーライドしますが、サイズ制約は保持します。 移動されたコンテナは 他のコンテナと重なることがあります。 左および/または上に移動するには、負のパラメータ値を使用しま す。 正の値を指定すると、右および/または下へのシフトが発生します。

PdfDocumentBuilder.Create().Generate("positioning-translate.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Size(200, 100);
        page.Content().Row(r =>
        {
            r.ConstantItem(50)
                .Background(new PdfRgbColor(187, 237, 237))
                .Text("Left");

            r.ConstantItem(50)
                // この項目を左に 10 ポイント、下に 5 ポイント移動します
                .Translate(-10, 5)
                .Background(new PdfRgbColor(15, 130, 9))
                .Text("Right");
        });
    });
});

上記のコードの結果は positioning-translate.pdf にあります。

Rotate

回転されたコンテンツ、特にテキストは、さまざまな方法で文書を改善できます。 たとえば、スペースを節約 し、ドキュメントをより魅力的で美しいものにすることができます。

LayoutContainer は、コンテンツを回転するための 2 つの方法を提供します。 どのアプローチを使用する場合でも、回転されたコンテンツを含むコンテナーでは位 置とサイズの制約が考慮されます。

90度回転

RotateRight メソッドと RotateLeft メソッドは、コンテンツをそ れぞれ時計回りと反時計回りに 90 度回転します。

次のコードは、メイン ページのコンテンツの隣に縦書きテキストを含むドキュメントを作成する方法を示して います。

PdfDocumentBuilder.Create().Generate("positioning-rotate.pdf", doc =>
{
    var lightGray = new PdfGrayColor(90);
    doc.Pages(page =>
    {
        page.Size(298, 210);
        page.Content().Row(r =>
        {
            r.AutoItem()
                .RotateLeft()
                .Background(lightGray)
                .Text("This content goes up");

            r.RelativeItem(1)
                .ExtendVertical()
                .PaddingHorizontal(10)
                .Column(t =>
                {
                    for (int i = 0; i < 15; i++)
                        t.Item().Text("The main content line goes here");
                });

            r.AutoItem()
                .RotateRight()
                .Background(lightGray)
                .Text("This content goes down");
        });
    });
});

上記のコードの結果は positioning-rotate.pdf に あります。

任意の角度に回転

Rotate メソッドは、コンテンツを任意の角度 だけ回転します。 正の数を指定すると時計回りに回転します。 負の数は反時計回りの回転を表します。

回転の原点はコンテナの左上隅です。 回転されたコンテンツは他のコンテナと重なることがあります。

PdfDocumentBuilder.Create().Generate("positioning-rotate2.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Size(298, 210);
        page.Content()
            .Padding(25)
            .Background(new PdfGrayColor(70)) // グレー
            .AlignCenter()
            .AlignMiddle()

            .Background(new PdfGrayColor(100)) // 白

            .Rotate(30)

            .Width(100)
            .Height(100)
            .Background(new PdfRgbColor(187, 237, 237)); // ブルー
    });
});

上記のコードの結果は positioning-rotate2.pdf にあります。

回転の原点を変更するには、Rotate 呼び出し の前に Translate メソッドの 1 つを呼び出します。 呼び出し後に発信元を翻訳して戻すことを忘れないで ください。

// 回転の原点を平行移動します
.TranslateX(50)
.TranslateY(50)

.Rotate(30)

// 逆翻訳する
.TranslateX(-50)
.TranslateY(-50)

条件付きレイアウト

PDF ドキュメントのレイアウトは条件によって異なる場合があります。 たとえば、列内の偶数行と奇数行に異 なる配置や背景色を使用できます。

条件に依存するレイアウトを持つネストされたコンテナを挿入するに は、Container メソッドを使用します。 こ のメソッドを呼び出しても、呼び出しのチェーンは中断されません。

PdfDocumentBuilder.Create().Generate("positioning-container.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content().Column(c =>
        {
            for (int i = 0; i < 15; i++)
            {
                c.Item()
                    .TextStyle(TextStyle.Parent.FontSize(14))
                    .Container(x => i % 2 == 0 ? x.Background(new PdfGrayColor(70)) : x)
                    .Text($"Row {i + 1}");
            }
        });
    });
});

上記のコードの結果は positioning-container.pdf にあります。

DSL

ドキュメントの一部の部分では同じレイアウトを使用できます。 たとえば、同じ外観の境界線を設定したり、 同じ書式設定を使用したりできます。 「同じことを繰り返さない」原則に従って、共通のコードをメソッドに 抽出することをお勧めします。

共通コードの拡張メソッドを使用すると、次の 2 つの利点があります。

  • メソッド呼び出しのチェーン内でメソッドを使用できます
  • 一連のメソッド呼び出しには意味のある名前を付けることができます

これらの利点を考慮して、ドメイン固有言語 (DSL) を構築できます。 DSL を使用すると、レイアウト コード が短くなり、理解しやすくなります。

static class LayoutHelpers
{
    public static LayoutContainer NumberCell(this Table table)
        => table.Cell().Border(b => b.Thickness(0.5)).PaddingHorizontal(10);
}

PdfDocumentBuilder.Create().Generate("positioning-dsl.pdf", doc => doc.Pages(page =>
{
    page.Content().Table(t =>
    {
        t.Columns(c =>
        {
            for (int i = 0; i < 4; ++i)
                c.ConstantColumn(50);
        });

        for (int i = 0; i < 16; i++)
            t.NumberCell().Text($"{i + 1}");
    });
}));

レンダリング処理

Layout アドオンは、コンテナーに配置されたコンテンツをサイズと位置の制約に従って配置します。 一部の コンテンツは複数のページにまたがることがあります。 コンテンツがレンダリングされるには厳密な順序があ ります。 コンテンツ フローは、この注文の別名です。

LayoutContainer は、コンテンツ フローを調整するた めのメソッドをいくつか提供します。 毎回必要になるわけではありませんが、必要なレイアウトを実現する他 に方法がない場合もあります。

PageBreak

新しいページからコンテンツのブロックを開始する必要がある場合 は、PageBreak メソッドを使用します。た とえば、このメソッドを使用して、新しいページから Column 項 目を開始できます。

以下は、各ページに 2 行のみが含まれるように列を分割するサンプル コードです。

PdfDocumentBuilder.Create().Generate("positioning-pagebreak.pdf", doc => doc.Pages(page =>
{
    page.Size(200, 100);
    page.Content().Column(c =>
    {
        for (int i = 1; i <= 10; ++i)
        {
            c.Item().Text($"Item {i}");

            if (i % 2 == 0)
                c.Item().PageBreak();
        }
    });
}));

上記のコードの結果は positioning-pagebreak.pdf にあります。

ShowIf

状況によっては、コンテナの表示/非表示が必要になる場合があります。 本質的に条件付きレイアウトのこの 特殊な場合の糖衣構文である ShowIf メソッド があります。

次のコードでは、ShowIf メソッドを使用して、行内の 5 つの要素ごとに縦線を挿入します。

PdfDocumentBuilder.Create().Generate("positioning-showif.pdf", doc => doc.Pages(page =>
{
    page.Size(200, 100);
    page.Content().Row(r =>
    {
        for (int i = 0; i < 10; ++i)
        {
            r.AutoItem().Text(i.ToString());
            r.AutoItem().ShowIf(i > 0 && (i + 1) % 5 == 0).LineVertical(0.5);
        }
    });
}));

上記のコードの結果は positioning-showif.pdf に あります。

ShowOnce

コンテンツの一部が次のページで繰り返されないようにすることができます。 ShowOnce メソッドを使用して、コンテンツ を 1 回だけ完全にレンダリングするようにレイアウト エンジンに指示します。

次のコードをチェックして、ShowOnce がどのようにして「Environment」が 2 ページ目に表示されないよう にするかを確認してください。

PdfDocumentBuilder.Create().Generate("positioning-showonce.pdf", doc => doc.Pages(page =>
{
    page.Size(200, 100);
    page.Content().Row(r =>
    {
        r.RelativeItem()
            .Background(new PdfGrayColor(75))
            .Border(b => b.Thickness(0.5))
            .Padding(5)
            .ShowOnce()
            .Text("Environment");

        r.RelativeItem()
            .Border(b => b.Thickness(0.5))
            .Padding(5)
            .Column(c =>
            {
                c.Item().Text(Environment.OSVersion.VersionString);
                c.Item().Text(string.Empty);
                c.Item().Text(
                    Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER")
                    ?? string.Empty
                );
            });
    });
}));

上記のコードの結果は positioning-showonce.pdf にあります。

ShowEntire

デフォルトの動作では、コンテンツが 1 ページに収まらない場合、ページ間でコンテンツが分割されます。 ShowEntire メソッドを使用して、コンテ ナ全体を 1 ページにレンダリングします。

コンテンツ全体を 1 ページに収めることができない場合、ライブラリは LayoutException をスローすることに注意してくださ い。

次のコードの ShowEntire 呼び出しにより、2 番目の項目テキストは 2 ページ目から始まります。 呼び出 しがなければ、最初のページ、最初の項目テキストの直後から開始されます。

PdfDocumentBuilder.Create().Generate("positioning-showentire.pdf", doc => doc.Pages(page =>
{
    page.Size(100, 100);
    page.Content().Column(c =>
    {
        c.Item().Text(t =>
        {
            for (var i = 0; i < 4; i++)
                t.Line($"First item line {i + 1}");
        });

        c.Item()
            .Background(new PdfRgbColor(250, 123, 5))
            .ShowEntire()
            .Text(t =>
            {
                for (var i = 0; i < 4; i++)
                    t.Line($"Second item line {i + 1}");
            });
    });
}));

上記のコードの結果は positioning-showentire.pdf にあります。

EnsureSpace

ある意味、EnsureSpaceShowEntire メソッドの特殊なケースで す。違いは、EnsureSpace ではコンテンツ全体がページに収まる必要がないことです。 このメソッドは、コ ンテンツの一部を指定された高さに合わせることのみを試みます。 それ以外はすべて次のページに進みます。

現在のページの空いている領域の高さが要求された高さよりも低い場合、コンテンツ全体が新しいページにレ ンダリングされます。 ここで、このメソッドは ShowEntire メソッドと同じ結果を生成します。

StopPaging

StopPaging メソッドを使用して、最大 1 ページの出力を生成します。 コンテナーでこのメソッドを呼び出すと、ページングが防止されます。 Layout アドオンは、このコンテナのコンテンツをページ間で分割しません。 1 ページに収まらないデータは表示され ません。

次のサンプル コードは、2 セットのページをドキュメントに追加します。 どちらのセットも内容として曜日 名のリストを使用します。 コードがページのコンテンツ コンテナに対して StopPaging メソッドを呼び出 すため、最初のセットには 1 ページのみがあります。

PdfDocumentBuilder.Create().Generate("positioning-stoppaging.pdf", doc =>
{
    static Action<TextContainer> produceText(string heading)
    {
        var text = string.Join('\n', DateTimeFormatInfo.InvariantInfo.DayNames);
        return t =>
        {
            t.Line(heading).BackgroundColor(new PdfRgbColor(250, 123, 5));
            t.Span(text);
        };
    }

    doc.Pages(page =>
    {
        page.Size(100, 100);
        page.Content()
            .StopPaging()
            .Text(produceText("Without paging:"));
    });

    doc.Pages(page =>
    {
        page.Size(100, 100);
        page.Content()
            .Text(produceText("Default behaviour:"));
    });
});

上記のコードの結果は positioning-stoppaging.pdf にあります。

SkipOnce

コンテンツの表示を延期することができます。 コンテナが複数のページに表示される場合 は、SkipOnce を使用して最初のページをス キップし、2 ページ目以降のすべてのページでコンテンツをレンダリングします。

この機能はあらゆる種類のヘッダーに役立ちますが、他のコンテンツにも使用できます。 次のコードをチェッ クして、SkipOnce が最初のページにヘッダーが表示されないようにする方法を確認してください。

PdfDocumentBuilder.Create().Generate("positioning-skiponce.pdf", doc => doc.Pages(page =>
{
    page.Size(298, 210);

    page.Header()
        .SkipOnce()
        .Text("This header will appear starting from page 2")
        .Style(TextStyle.Parent.Underline());

    page.Content().Column(c =>
    {
        for (int i = 0; i < 5; i++)
        {
            if (i > 0)
                c.Item().PageBreak();

            c.Item().Text($"Page {i + 1}");
        }
    });
}));

上記のコードの結果は positioning-skiponce.pdf にあります。

コンテンツディレクション

デフォルトのコンテンツ方向は左から右です。 コンテナはテキストとその他のコンテンツを左に揃えます。

しかし、右から左に書かれる言語もあります (アラビア語やヘブライ語など)。 これらの言語でコンテンツを 作成する場合 は、ContentFromRightToLeft メソッドを使用します。 これを呼び出すと、コンテナのコンテンツの方向が右から左に切り替わります。 こ のメソッドはデフォルトの配置も切り替えます。

ページ上のコンテンツのほとんどが RTL 言語である場合は、ページのデフォルトのコンテンツ方向として右か ら左を設定できます。 これには PageLayout.ContentFromRightToLeft メソッドを使用します。 次に、選択したコンテナのデフォルトのコンテンツ方向をオーバーライドするに は、ContentFromLeftToRight メソッドを使用します。

コンテンツの方向は、明示的に指定された配置に影響を与えないことに注意してください。 たとえば、コンテ ナにどのようなコンテンツの方向を設定しても、右揃えのコンテンツは右側に固定されます。 子要素の視覚的 な順序は、コンテンツの方向に応じて異なります。