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

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

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

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

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

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

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

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

Docotic.Pdf ライブラリ 9.4.17342 レイアウトアドオン 9.4.17342
回帰テスト 14,727人が合格 NuGet の合計ダウンロード数 4,260,602

コンテナの仕組み

まずはコンテナを入手することから始めます。 たとえば、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 は、Gray、RGB、CMYK 色空間の不透明色と半透明色をサポートします。 実線のほかに、Layout 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 で確認でき ます。

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 で確認できます。

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 にあります。

Inlined

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

Layers

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

Element

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

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