이 페이지에는 자동 번역된 텍스트가 포함될 수 있습니다.

컨테이너 및 해당 콘텐츠

문서는 페이지의 집합입니다. 각 페이지는 차례대로 콘텐츠 세트입니다. 이미 알고 계시겠지만 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 메서드의 또 다른 버전이 있습니다. 해당 버전을 사용하면 한 텍스트 블록 내에서 다양한 스타일의 범위를 가질 수 있습니다. 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 컨테이너를 사용하세요. 최소한 하나의 열을 정의한 후 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 컨테이너는 바로 이 목적을 수행합니다. 정확히 하나의 기본 레이어와 기본이 아닌 레이어를 원하는 만큼 정의해야 합니다. Layout API는 레이어를 생성할 때와 동일한 순서로 레이어를 구성합니다.

Element

이것은 특별한 종류의 콘텐츠입니다. 요소를 동적으로 생성하고 결과를 컨테이너에 넣을 수 있습니다.

동적으로 생성된 요소는 페이지 번호, 크기 및 기타 속성에 따라 달라지는 레이아웃을 제공할 수 있습니다.