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

Table コンテナ

最も複雑なデータをレイアウトするには、Table コンテナーを使 用します。テーブルは PDF ドキュメントで重要な役割を果たし、明瞭性と効果を高めます。

表は、データを表示するための構造化された形式を提供します。表を使用すると、複雑な詳細を簡潔かつ視覚 的に魅力的な方法で表示できます。長い段落の代わりに、表を使用して事実、数字、傾向を簡潔に表示できま す。

適切に設計された表は読みやすさを向上させます。列と行を揃えることで、読者の目を誘導する構造を作成し ます。背景、境界線、フォント スタイルを使用して、特定のセルや見出しを強調できます。

Table コンテナ

LayoutContainer.Table メソッドを呼び出して テーブル コンテナーを取得します。次に、コンテナー内に少なくとも 1 つの列を定義する必要があります。 最も単純なケースでは、Cell メソッドを複数回呼び出すこ とで、すべての列と行を埋めることができます。

列の定義方法、テーブルへのヘッダーやフッターの追加方法については、引き続きお読みください。このテキ ストでは、Table コンテナのその他のすべての機能についても説明します。

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

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

列と行

すべてのテーブルには少なくとも 1 つの列を定義する必要があります。列を定義するに は、Table.Columns メソッドを使用します。このメソッ ドは、Action<TableColumnContainer> タイプ のデリゲートを受け入れます。デリゲート コードで、提供されたオブジェクトのメソッドを呼び出して、テー ブルに列を追加します。

ConstantColumn メソッドは、正 確なポイント数に等しい幅の列を追加します。

RelativeColumn メソッドは、相 対的な幅を持つ列を追加します。このメソッドは、列が占める部分の数を受け入れます。部分の合計数は、こ のテーブル内のすべての RelativeColumn 呼び出しのすべての数値の合計です。ほとんどの場合、このメ ソッドは Row コンテナーRelativeItem と同じように機能します。詳細な説明につい ては、リンクをお読みください。

行を明示的に定義する必要はありません。行の数は列とセルのプロパティによって決まります。セルの数も行 の数に影響します。テーブルの高さは、すべての行の高さの合計よりも大きくなる場合があります。行のセル の数は列の数よりも少なくなる場合があります。また、列のセルの数は行の数よりも少なくなる場合がありま す。

PdfDocumentBuilder.Create().Generate("table-basic.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Size(300, 100);
        page.Content()
            .Padding(10)

            //.MinimalBox()

            .Border(b => b.Thickness(1).Color(new PdfRgbColor(250, 123, 5)))
            .Table(table =>
            {
                table.Columns(columns =>
                {
                    columns.ConstantColumn(100);
                    columns.RelativeColumn(1);
                    columns.RelativeColumn(3);
                });

                for (int i = 0; i < 10; i++)
                {
                    table.Cell()
                        .Border(b => b.Thickness(0.1))
                        .AlignCenter()
                        .Text($"Cell {i + 1}");
                }
            });
    });
});

コードの結果は table-basic.pdf で確認できます。

結果の PDF では、テーブルが親コンテナーのスペースをすべて占有します。領域をカバーするのに十分なセル がないにもかかわらずです。テーブルの高さを行の高さの合計に制限するに は、MinimalBox 呼び出しのコメントを解 除します。

このコードは 3 つの列を定義し、テーブルに 10 個のセルを追加します。テーブルはセルを次々に配置し、必 要に応じて新しい行を追加します。行にセルが 1 つだけあっても問題ありません。

現在のページに十分なスペースがない場合、テーブルは次のページにセルを配置します。追加するセルの数を 増やすことで、これを確認できます。

細胞

テーブル セルを操作するために Layout API が提供する機能について説明します。

位置

表のセルを作成する方法は 2 つあります:

  • 明示的な位置情報なし
  • 少なくとも部分的に位置を指定

前のセクションのコードでは、最初の方法を使用しました。パラメータを受け入れない Cell メソッド オーバーロードを呼び出します。このメソッ ドは、最後に追加されたセルの後の列に新しいセルを追加します。右側にスペースがない場合、セルは次の行 に移動します。RTL モードでは、このメソッドは最後に追加されたセルの左側のスペースをチェックします。

新しいセルの正確な位置がわかっている場合は、Cell メソッドの別のオーバーロードを使用します。これ は、Action<TableCell> 型のデリゲートを受け入れるオー バーロードです。デリゲート コードでは、提供されたオブジェクトの RowIndex メソッドと ColumnIndex メソッドを呼び出して、セルの行 とインデックスを指定します。

新しいセルの行インデックスまたは列インデックスのみを指定することもできます。行インデックスのみを指 定した場合、列インデックスは 0 になります。その逆も同様です。

セルを作成するときに、両方の Cell オーバーロードの呼び出しを任意の順序で混在させることができま す。

この記事の次のコード例では、次の 拡張メソッド を使用します。これにより、例がより 簡潔になり、読みやすくなります。

static class LayoutHelpers
{
    public static TextSpan BoxWithText(this LayoutContainer cell, string caption)
        => cell.Border(b => b.Thickness(0.5))
            .Background(new PdfGrayColor(75))
            .ShowOnce()
            .MinWidth(50)
            .MinHeight(50)
            .Padding(10)
            .AlignCenter()
            .AlignMiddle()
            .Text(caption);
}

明示的に配置されたセルと暗黙的に配置されたセルの両方を含むテーブルを作成する例を次に示します。拡張 メソッドを使用して、セルにスタイルとテキストを適用しました。セル内の数字は、セルの作成順序を反映し ています。

PdfDocumentBuilder.Create().Generate("table-cells.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Size(300, 200);
        page.Content()
            .Padding(10)
            .MinimalBox()
            .Border(b => b.Thickness(0.1))
            .Table(table =>
            {
                table.Columns(columns =>
                {
                    for (int i = 0; i < 4; i++)
                        columns.RelativeColumn();
                });

                table.Cell().BoxWithText("1");
                table.Cell(c => c.RowIndex(1).ColumnIndex(1)).BoxWithText("2");
                table.Cell().BoxWithText("3");
                table.Cell(c => c.RowIndex(2).ColumnIndex(2)).BoxWithText("4");
                table.Cell(c => c.RowIndex(0).ColumnIndex(3)).BoxWithText("5");
            });
    });
});

コードの結果は table-cells.pdf で確認できます。

行と列の範囲

セルは複数の行や列にまたがることができます。デリゲートを受け入れる Cell オーバーロードを使用して、セルがまたがる行と列の 数を指定します。

PdfDocumentBuilder.Create().Generate("table-cellspans.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Size(300, 150);
        page.Content()
            .Padding(10)
            .MinimalBox()
            .Border(b => b.Thickness(0.1))
            .Table(table =>
            {
                table.Columns(columns =>
                {
                    for (int i = 0; i < 4; i++)
                        columns.RelativeColumn();
                });

                table.Cell(c => c.RowSpan(2).ColumnSpan(2)).BoxWithText("1");
                table.Cell(c => c.ColumnSpan(2)).BoxWithText("2");
                table.Cell().BoxWithText("3");
                table.Cell().BoxWithText("4");
            });
    });
});

コードの結果は table-cellspans.pdf で確認できま す。

重複

セルが互いに重なり合うことは可能です。その場合、作成順序によってどのセルが他のセルの上に重なるかが 決まります。

セルが複数の列または行にまたがる場合、またはセルを明示的および暗黙的に配置する場合に、一部のセルが 重なり合うことがあります。

PdfDocumentBuilder.Create().Generate("table-overlapping.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Size(300, 300);
        page.Content()
            .Padding(10)
            .MinimalBox()
            .Border(b => b.Thickness(0.1))
            .Table(table =>
            {
                table.Columns(columns =>
                {
                    for (int i = 0; i < 4; i++)
                        columns.RelativeColumn();
                });

                for (int i = 0; i < 16; i++)
                    table.Cell().BoxWithText($"{i + 1}");

                table.Cell(c => c.RowIndex(2).ColumnIndex(1).ColumnSpan(3))
                    .Background(new PdfRgbColor(250, 123, 5), 50);
            });
    });
});

コードの結果は table-overlapping.pdf で確認でき ます。

下まで延長

テーブルのレイアウトが複雑な場合、ページング メカニズムによって一部の列の下部に空白スペースが生じる ことがあります。空白スペースをなくしたい場合 は、ExtendCellsToBottom メソッドを使用 します。このメソッドは、各列の最後のセルを拡張して、セルがテーブルの下部で終了するようにします。

次の例では、最初のページにデフォルトの動作が示されています。2 番目のページに は、ExtendCellsToBottom 呼び出しが列にどのように影響するかが示されています。

PdfDocumentBuilder.Create().Generate("table-extendcells.pdf", doc =>
{
    for (int take = 0; take < 2; take++)
    {
        doc.Pages(page =>
        {
            page.Size(300, 200);
            page.Content()
                .Padding(10)
                .MinimalBox()
                .Border(b => b.Thickness(0.1))
                .Table(table =>
                {
                    if (take != 0)
                        table.ExtendCellsToBottom();

                    table.Columns(columns =>
                    {
                        for (int i = 0; i < 4; i++)
                            columns.RelativeColumn();
                    });

                    table.Cell(c => c.RowIndex(0).ColumnIndex(0)).BoxWithText("1");
                    table.Cell(c => c.RowIndex(2).ColumnIndex(0)).BoxWithText("2");
                    table.Cell(c => c.RowIndex(1).ColumnIndex(1)).BoxWithText("3");
                    table.Cell(c => c.RowIndex(2).ColumnIndex(2)).BoxWithText("4");
                    table.Cell(c => c.RowIndex(1).ColumnIndex(3)).BoxWithText("5");
                });
        });
    }
});

コードの結果は table-extendcells.pdf で確認でき ます。

テーブルにはヘッダーとフッターを設定できます。Header メソッドと Footer メソッドを使用して、対応する TableCellContainer にアクセスして設定します。 コンテナーには、セルを作成するための Cell メソッドが用意されています。これらのメソッドは、メインのテーブル コンテンツのメソッドとまったく同じ ように機能します。

ヘッダー、フッター、およびメイン テーブル セルは同じ列定義を使用します。ただし、3 つのセル コレク ションはすべて独立しており、互いに影響しません。

表が 1 ページに収まらない場合は、表が占める各ページにヘッダーとフッターが繰り返されます。

前の例では、BoxWithText 拡張メソッドを使用しました。次のコードでも、WhiteBoxWithText 拡張メソッ ドを使用します。

static class LayoutHelpers
{
    public static TextSpan WhiteBoxWithText(
        this LayoutContainer cell, string caption, bool center = true)
    {
        return cell.Border(b => b.Thickness(0.5))
            .ShowOnce()
            .MinWidth(50)
            .MinHeight(50)
            .Padding(10)
            .Container(l => center ? l.AlignCenter() : l)
            .AlignMiddle()
            .Text(caption);
    }
}

次の例は、ヘッダー付きの表を作成する方法を示しています。5 つの必須化学元素を含む表を使用します。各 元素の名前と融点が摂氏とケルビンの両方で示されています。

var elements = new (string Name, double Celsius, double Kelvin)[] {
    ("Oxygen", -218.79, 54.36),
    ("Carbon", double.NaN, double.NaN),
    ("Hydrogen", -259.16, 13.99),
    ("Nitrogen", -209.86, 63.23),
    ("Sulfur", 115.21, 388.36),
};

static string formatDouble(double val)
{
    return double.IsNaN(val)
        ? string.Empty
        : val.ToString(CultureInfo.InvariantCulture);
}

PdfDocumentBuilder.Create().Generate("table-header.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Size(400, 500);
        page.Content()
            .Padding(10)
            .MinimalBox()
            .Border(b => b.Thickness(0.1))
            .Table(table =>
            {
                table.Columns(columns =>
                {
                    columns.RelativeColumn();
                    columns.ConstantColumn(100);
                    columns.ConstantColumn(100);
                });

                table.Header(header =>
                {
                    header.Cell(c => c.RowSpan(2)).BoxWithText("Chemical element");
                    header.Cell(c => c.ColumnSpan(2)).BoxWithText("Melting point");

                    header.Cell().BoxWithText("Celsius");
                    header.Cell().BoxWithText("Kelvin");
                });

                foreach (var (Name, Celsius, Kelvin) in elements)
                {
                    table.Cell().WhiteBoxWithText(Name, false);

                    table.Cell().WhiteBoxWithText(formatDouble(Celsius));
                    table.Cell().WhiteBoxWithText(formatDouble(Kelvin));
                }
            });
    });
});

コードの結果は table-header.pdf で確認できます。

サンプル コード

PDF ドキュメントに表を追加する の例を確認してください。ヘッダー付きのテーブルを作成する方法も示されていま すが、拡張メソッドは使用されていません。また、VB.NET バージョンもあります。