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

コンテナとそのコンテンツ

ドキュメントは一連のページです。 各ページは、それぞれがコンテンツ部分のセットです。 すでにご存知か もしれませんが、PageLayout はメイン コンテンツと追加コ ンテンツのコンテナを提供します。 しかし、これらのコンテナはどうすればよいでしょうか?

ページコンテンツのコンテナ

コンテナはページ上のコンテンツを整理するのに役立ちます。 ページに置くものはすべてコンテナに入れる必 要があります。 コンテンツが十分に大きい場合、コンテナは複数のページ上のスペースを占有することができ ます。

テキストや画像をコンテナに入れることができます。 整列および位置決めの目的で、コンテナを別のコンテナ の中に入れることができます。 複数のコンテンツを入れるスペースを提供するコンテナがあります。

ページ上のコンテナは、LayoutContainer クラスのオ ブジェクトによって表されます。 このクラスを使用して、コンテナのサイズ、位置、コンテンツ、レンダリン グ プロセスを設定します。

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

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

コンテナの仕組み

まずはコンテナを入手することから始めます。 たとえ ば、PageLayout.Content メソッドを呼び出しま す。このメソッドは、スペースを占有せず、コンテンツもプロパティも設定されていないコンテナを返しま す。 コンテナの設定には LayoutContainer クラスの メソッドを使用します。

理解しておくべき非常に重要なことは、すべてLayoutContainer メソッドがコンテンツをコンテナー に入れるということです。 コンテナにテキストを追加すると、それが期待されます。 しかし、インデントや 幅を設定するとコンテンツはどうなるでしょうか?

コンテナーのプロパティを設定すると、ライブラリは指定されたプロパティを持つ 新しい コンテナーを 作成します。 新しいコンテナは元のコンテナのコンテンツになります。 ライブラリは、メソッドの結果とし てネストされたコンテナを返します。

ネストされたコンテナのプロパティは親コンテナに影響し、その逆も同様です。 たとえば、ネストされたコン テナの幅は、親コンテナのサイズに影響します。 親コンテナのデフォルトのテキスト スタイルは、ネストさ れたコンテナ内のテキストに影響します。 Layout アドオンは、コンテナーの階層とそのプロパティを使用し て、結果として得られるレイアウトを構築します。

次のコードの結果 には驚かれるかもしれませんが、時間 をかけて分析してください。 このコードは、ネストされたコンテナーがどのように機能するかを示していま す。

PdfDocumentBuilder.Create().Generate("containers-how.pdf", doc => doc.Pages(page =>
{
    page.Size(150, 150);
    page.Content()
        .Background(new PdfRgbColor(235, 64, 52)) // red

        .PaddingTop(50)
        .Background(new PdfRgbColor(187, 237, 237)) // blue

        .PaddingRight(50)
        .Background(new PdfRgbColor(15, 130, 9)) // green

        .PaddingBottom(50)
        .Background(new PdfRgbColor(250, 123, 5)) // orange

        .PaddingLeft(50)
        .Background(new PdfRgbColor(204, 204, 204)); // gray
}));

装飾

ドキュメントのデザインには、テキストや画像を配置するだけではありません。 適切にデザインされたドキュ メントは、効果的なだけでなく、視覚的に魅力的なコミュニケーションを生み出します。

Layout API を使用すると、任意のコンテナに背景色を適用できます。 これは、コンテンツ内に階層を確立す るのに役立ちます。 境界線を適用して境界を定義することもできます。 垂直線と水平線を使用してコンテン ツ要素を区切ります。

PdfDocumentBuilder.Create().Generate("containers-decor.pdf", doc => doc.Pages(page =>
{
    page.Size(150, 150);
    page.Content()
        .Background(new PdfRgbColor(250, 123, 5))
        .Border(b =>
        {
            b.Color(new PdfGrayColor(0), 50);
            b.Thickness(15);
        })
        .PaddingTop(74)
        .LineHorizontal(2)
            .Color(new PdfCmykColor(73, 45, 0, 4))
            .DashPattern(new PdfDashPattern(new double[] { 8, 2 }));
}));

APIは、GrayRGBCMYKのカラー スペースで不透明色と半透明色をサポートします。 実線に加えて、レイアウト API は 破線パターン を使用する線 もサポートします。

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

コンテンツ

LayoutContainer クラスがコンテンツを整理するため に提供するものを見てみましょう。

Text

コンテナにテキストを追加するには、Text メ ソッドのいずれかを使用します。

すべてのテキストで同じスタイルを使用する場合は、このメソッドの単純な省略版を使用します。 このバー ジョンは文字列を受け入れ、TextSpan オブジェクトを返しま す。 そのオブジェクトを使用して、スパンのテキスト スタイルを設定できます。

Action<TextContainer> 型のデリゲートを受け入れる別のバージョンの Text メソッドがあります。 その バージョンを使用して、テキストの 1 ブロック内に異なるスタイルのスパンを含めます。 TextContainer は、テキスト スパンの間に画像やその他 の要素を挿入するメソッドを提供します。 段落間の距離を設定する機能など、他の高度な機能もあります。

PdfDocumentBuilder.Create().Generate("containers-text.pdf", doc => doc.Pages(page =>
{
    page.Header().Text("This is a simple text span");

    page.Content().Text(t =>
    {
        t.Span("This line contains ");
        t.Span("some underlined text").Style(TextStyle.Parent.Underline());
    });
}));

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

Image

Layout API は、ファイルまたはストリーム内の画像データから Image オブジェクトを作成するメソッドを提供します。 任意の Image オブジェクトをコンテナのコンテンツとして機能させることができます。 複数のコンテナで同じ Image オブジェクトを使用できます。 コンテナ内で画像がどのように見えるかに影響を与えるさまざまなコ ンテンツ モードがあります。

ライブラリは、ラスター形式の画像のみをロードできます: PNG、JPEG、JPEG 2000、BMP、GIF、および TIFF。

PdfDocumentBuilder.Create().Generate("containers-image.pdf", doc =>
{
    var imageFile = new FileInfo(@"path-to-image.jpg");
    var image = doc.Image(imageFile);

    doc.Pages(pages =>
    {
        pages.Size(image.Width, image.Height);
        pages.Content().Image(image, ImageContentMode.FitArea);
    });
});

Column

列には、無制限の数のアイテムを垂直方向に次々に配置するためのスペースが提供されます。 列内では任意の タイプの項目を使用できます。 たとえば、列には画像アイテムとテキストアイテムを含めることができます。 各項目の幅は列の幅と同じです。 各アイテムの高さは、アイテムの内容とプロパティによって異なります。

PdfDocumentBuilder.Create().Generate("containers-column.pdf", doc => doc.Pages(page =>
{
    page.Content().Column(c =>
    {
        for (int i = 0; i < 10; i++)
        {
            PdfColor color = i % 2 == 0
                ? new PdfRgbColor(187, 237, 237)
                : new PdfGrayColor(66);

            c.Item().Background(color).Height(10 + i * 3);
        }
    });
}));

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

Column コンテナの機能の詳細については、複合コンテナ の記事をお読みください。

Row

Row コンテナは、無制限の数のアイテムを水平方向に整理するのに 役立ちます。 行内の各項目はコンテナーです。 このため、異なる種類のコンテンツを連続して配置できま す。

PdfDocumentBuilder.Create().Generate("containers-row.pdf", doc => doc.Pages(page =>
{
    var rowItems = new[] { "three", "two", "one" };

    page.Content().Row(row =>
    {
        for (int index = 0; index < rowItems.Length; index++)
        {
            row.AutoItem().Text(rowItems[index]);

            if (index != rowItems.Length - 1)
                row.AutoItem().PaddingHorizontal(10).LineVertical(0.5);
        }
    });
}));

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

複合コンテナ の記事には、Row コンテナに関する詳細情報が記載されています。

Table

最も複雑なデータをレイアウトするには、Table コンテナを使用 します。 まず少なくとも 1 つの列を定義し、次に Cell メ ソッドを複数回呼び出して列と行を埋めます。

テーブルにはヘッダーとフッターを含めることができます。 テーブル内のセルは、複数の列や行にまたがるこ とができます。 以下は、単純なテーブルを追加するコードです。

PdfDocumentBuilder.Create().Generate("containers-table.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.Cell()
                .Border(b => b.Thickness(0.5))
                .PaddingHorizontal(10)
                .Text($"{i + 1}");
        }
    });
}));

コードの結果は containers-table.pdf にあります。

Table コンテナ の記事で、Table コンテナのすべての機能について読んでください。

Inlined

InlineContainer コンテナは、コンテナのコレクショ ンからのアイテムで領域を埋める便利な方法を提供します。アイテムを次々に追加するだけで、ライブラリは アイテムを次々と列に配置します。 項目を配置するスペースがない場合、ライブラリは新しい行を開始しま す。

InlineContainer コンテナの詳細については、複合コンテナ の記事を参照してください。

Layers

コンテンツを複数のレイヤーに配置することが最適な場合があります。 LayerContainer コンテナはまさにこの目的を果たしま す。 プライマリ レイヤーを 1 つだけ定義し、非プライマリ レイヤーを任意の数定義する必要があります。 Layout API は、レイヤーの作成と同じ順序でレイヤーを構成します。

LayerContainer タイプの詳細については、複合コンテナ を参照してください。

Element

これは特別な種類のコンテンツです。 要素を動的に作成し、その結果をコンテナーに入れることができます。

動的に作成された要素は、ページ番号、サイズ、その他のプロパティに応じたレイアウトを提供できます。