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

PDF 페이지 레이아웃 방법

PdfDocumentBuilder.Generate 메서드는 위임자에게 Document 유형의 개체를 제공합니다. 해당 개체의 Pages 메서드를 사용하여 문서 페이지를 구성하세요. 메소드에 PageLayout 유형의 매개변수를 허용하는 대리자를 제공해야 합니다.

PDF 페이지 레이아웃

PDF 문서의 모든 페이지에 동일한 레이아웃이 있는 경우 메서드를 한 번만 호출하면 충분합니다. 문서에 다른 레이아웃이 있는 경우 Pages 메서드를 두 번 이상 호출하세요. 예를 들어 메서드를 한 번 호출하여 표지를 레이아웃할 수 있습니다. 그런 다음 메서드를 다시 호출하여 보고서 본문을 설명합니다.

Pages 를 호출할 때마다 최소한 하나의 페이지가 생성됩니다. 제공된 콘텐츠가 없으면 생성된 페이지가 비어 있을 수 있습니다.

이 기사는 PDF 생성을 위한 Layout API에 관한 시리즈의 일부입니다. API를 처음 사용하는 경우 Layout API 시작하기 부분을 먼저 읽어보세요.

Docotic.Pdf 라이브러리 9.4.17342 레이아웃 애드온 9.4.17342
회귀 테스트 14,727건의 테스트 통과 총 NuGet 다운로드 4,260,602

콘텐츠 슬롯

페이지 레이아웃을 설명하려면 미리 정의된 컨테이너를 사용하세요. 나는 또한 이를 콘텐츠 슬롯이라고 부릅니다. PageLayout 개체의 메서드를 호출하여 이러한 컨테이너에 액세스할 수 있습니다.

세 가지 기본 슬롯이 있습니다: Content, Header, Footer. 추가 콘텐츠를 위한 두 개의 슬롯: BackgroundForeground. 기본적으로 5개의 컨테이너는 모두 비어 있으며 페이지 공간을 차지하지 않습니다. 요구 사항에 따라 슬롯 간에 페이지 콘텐츠를 배포합니다.

컨테이너를 사용하여 페이지 레이아웃을 지정하는 방법을 알아보려면 컨테이너 및 해당 콘텐츠 문서를 읽어보세요.

머리글과 바닥글 내용이 각각 HeaderFooter 슬롯에 들어간다는 사실을 알고 계시다면 놀라지 않으실 것입니다. API는 생성된 각 페이지의 기본 콘텐츠 위와 아래에 이러한 슬롯을 반복합니다. Layout API는 페이지 간에 머리글이나 바닥글 콘텐츠를 분할하지 않습니다. 머리글이나 바닥글이 페이지 크기에 맞지 않으면 LayoutException이 발생합니다.

메인 콘텐츠

이미지, 표, 텍스트와 같은 기본 페이지 콘텐츠는 Content 슬롯에 들어갑니다. Layout API는 해당 콘텐츠를 자동으로 페이지로 분할합니다.

다음 코드는 모든 기본 콘텐츠 슬롯에 간단한 텍스트 콘텐츠를 할당합니다. 코드는 또한 슬롯의 배경색을 설정합니다.

PdfDocumentBuilder.Create().Generate("pages-main-slots.pdf", doc => doc.Pages(pages => {
    pages.Header()
        .Text("This text goes to the header")
        .BackgroundColor(new PdfRgbColor(66, 135, 245));

    pages.Content()
        .Text("The main content goes in this slot")
        .BackgroundColor(new PdfRgbColor(242, 233, 206));

    pages.Footer()
        .Text("This is the footer contents")
        .BackgroundColor(new PdfRgbColor(194, 192, 188));
}));

pages-main-slots.pdf에서 코드 결과를 확인하세요.

보시다시피 각 슬롯은 페이지의 일부만 차지합니다. 정확한 면적은 슬롯 내부의 콘텐츠에 따라 다릅니다. Header 슬롯은 페이지 상단에 고정됩니다. Content 슬롯은 Header 바로 다음에 시작됩니다. Footer 슬롯은 하단에 붙어 있습니다.

추가 콘텐츠

BackgroundForeground 는 워터마크, 오버레이 및 배경에 사용할 수 있는 컨테이너를 제공합니다. Background 슬롯의 모든 콘텐츠는 페이지의 머리글, 바닥글 및 기본 콘텐츠 아래에 배치됩니다. Foreground 슬롯의 콘텐츠는 페이지에 추가된 모든 내용을 포함합니다.

이러한 컨테이너는 전체 페이지를 차지합니다. 이것이 이 컨테이너의 독특한 특징입니다. API는 생성된 각 페이지에서 해당 내용을 반복합니다. 머리글 및 바닥글 컨테이너와 똑같습니다.

ForegroundBackground 컨테이너를 사용하는 방법을 보여주기 위해 위 코드에 몇 줄을 추가했습니다.

PdfDocumentBuilder.Create().Generate("pages-all-slots.pdf", doc => doc.Pages(pages => {
    // ... 

    pages.Background()
        .Background(new PdfRgbColor(208, 227, 204));

    pages.Foreground()
        .Rotate(45)
        .Text(new string(' ', 30) + "Your watermark could go here, in the foreground");
}));

Background 컨테이너의 경우 텍스트 등을 제공하지 않습니다. 배경색만 지정합니다. 머리글, 기본 콘텐츠, 바닥글 아래의 모든 항목에는 녹색 음영이 표시됩니다.

Foreground 컨테이너의 콘텐츠를 회전하고 여기에 텍스트를 추가합니다. 선행 공백으로 인해 텍스트가 머리글이나 바닥글 내용을 덮지 않습니다. 모든 컨테이너의 콘텐츠가 페이지에 표시됩니다.

pages-all-slots.pdf에서 코드 결과를 확인할 수 있습니다.

설정

지금까지 모든 코드 조각은 페이지를 구성하는 컨테이너에 중점을 두었습니다. 이제 콘텐츠 슬롯이 아닌 페이지 자체를 사용자 정의할 수 있는 방법을 살펴보겠습니다.

페이지를 설정하려면 PageLayout 클래스의 메서드를 사용하세요. PageLayout 개체는 두 개 이상의 페이지를 설명할 수 있다는 점을 기억하세요. 메소드 호출은 설명하는 모든 페이지에 영향을 미칩니다.

크기

아마도 가장 기본적인 설정은 페이지 크기일 것입니다. Size 방법을 사용하여 페이지에 대해 사전 정의된 크기 중 하나를 지정할 수 있습니다. A4, Ledger 또는 Monarch Envelope와 같은 일반적인 크기가 모두 있습니다.

선택적으로 페이지 방향을 지정할 수 있습니다. 너비와 높이를 포인트 단위로 제공하여 사용자 정의 페이지 크기를 설정할 수 있습니다.

여백

페이지 여백은 페이지의 가독성, 미적 측면, 전체적인 구성에 기여할 수 있습니다.

Margin 방법을 사용하여 모든 여백을 포인트 단위로 동일한 값으로 설정합니다. 수직 또는 수평 여백만 설정하려면 MarginVerticalMarginHorizontal 메서드를 사용하세요. 각 여백을 독립적으로 지정하려면 MarginLeft/Top/Right/Bottom 메서드를 사용하세요.

텍스트 스타일

Layout API는 텍스트 스타일을 생성하기 위한 TextStyle 클래스를 제공합니다. 원하는 모양을 얻기 위해 텍스트에 스타일을 만들고 적용합니다.

페이지 텍스트의 상당 부분이 동일한 스타일을 사용하는 경우가 있습니다. 해당 스타일을 페이지의 기본 텍스트 스타일로 설정할 수 있습니다. 기본 스타일은 기본 콘텐츠 슬롯의 모든 텍스트에 영향을 미칩니다. 그러나 특정 요소의 기본 스타일을 재정의할 수 있습니다. 다르게 보여야 하는 텍스트 부분에 다른 스타일을 적용하면 됩니다.

PdfDocumentBuilder.Create().Generate("pages-text-styles.pdf", doc =>
{
    var defaultStyle = TextStyle.Parent.FontSize(30);
    var tightSpacing = TextStyle.Parent.LetterSpacing(-0.1);

    doc.Pages(pages =>
    {
        pages.TextStyle(defaultStyle);

        pages.Content().Text(t =>
        {
            t.Line("This line uses the default text style.");
            t.Line("This line uses a tight letter spacing.").Style(tightSpacing);
            t.Line("This line uses the default text style, again.");
        });
    });
});

pages-text-styles.pdf에서 코드 결과를 확인할 수 있습니다.

Document.Typography 메서드를 사용하여 문서 전체의 텍스트 스타일을 설정할 수 있습니다. Typography 클래스의 각 속성은 사용 사례에 대한 스타일을 정의합니다. 이러한 스타일은 PageLayout.TextStyle 메서드로 지정된 스타일을 재정의합니다. 예를 들어 Body 속성은 Content 컨테이너의 텍스트에 대한 기본 스타일을 재정의합니다.

콘텐츠 방향

오른쪽에서 왼쪽으로 쓰여진 언어가 있습니다. Layout API는 이러한 언어의 텍스트를 잘 처리합니다. 하지만 텍스트 방향을 명시적으로 지정해야 합니다.

페이지의 텍스트 대부분이 RTL 언어로 되어 있는 경우 오른쪽에서 왼쪽을 페이지의 기본 콘텐츠 방향으로 설정할 수 있습니다. 페이지의 모든 컨테이너에 대해 다른 방향을 지정할 수 있습니다.

PdfDocumentBuilder.Create().Generate("pages-content-direction.pdf", doc =>
{
    var defaultTextStyle = doc.TextStyleWithFont(SystemFont.Family("Calibri"));

    doc.Pages(pages =>
    {
        pages.Size(PdfPaperSize.A6).TextStyle(defaultTextStyle);

        pages.ContentFromRightToLeft();

        pages.Content().Column(column =>
        {
            column.Item()
                .ContentFromLeftToRight()
                .Text("There are languages written from right to left.");

            column.Item()
                .Text("هناك لغات تكتب من اليمين إلى اليسار.");

            column.Item()
                .Text("יש שפות שנכתבות מימין לשמאל.");
        });
    });
});

위 코드에서는 오른쪽에서 왼쪽을 기본 콘텐츠 방향으로 설정했습니다. 영어 버전의 문구가 포함된 컨테이너의 경우 방향을 왼쪽에서 오른쪽으로 변경합니다. 코드의 결과는 pages-content-direction.pdf에서 확인할 수 있습니다.

페이지 번호

PDF를 생성할 때 Layout API는 현재 페이지 번호를 자동으로 계산합니다. 또한 문서의 총 페이지 수를 계산합니다. 텍스트 컨테이너의 CurrentPageNumberPageCount 메서드를 호출하여 숫자를 얻을 수 있습니다. 컨테이너가 머리글, 바닥글 또는 기본 콘텐츠 슬롯에 있는지 여부는 중요하지 않습니다.

PdfDocumentBuilder.Create().Generate("pages-page-numbers.pdf", doc => doc.Pages(pages =>
{
    pages.Content().Text(t =>
    {
        t.Span("This line is on page ");
        t.CurrentPageNumber();
        t.Line();
        t.Line("Check the footer.");
    });

    pages.Footer().Row(r =>
    {
        r.AutoItem().Text("Created with Docotic.Pdf Layout API");

        r.RelativeItem(2).Text(t =>
        {
            t.AlignRight();

            t.Span("Page ");
            t.CurrentPageNumber();
            t.Span(" of ");
            t.PageCount();
        });
    });
}));

코드의 결과는 pages-page-numbers.pdf에 있습니다.

두 메서드 모두 숫자 형식을 지정하는 데 사용할 수 있는 TextPageNumber를 반환합니다.

PDF 문서에 머리글 및 바닥글 추가 예는 페이지 번호에 사용자 정의 서식을 적용하는 방법을 보여줍니다.

샘플 코드

앞서 언급한 기능을 더 자세히 다루는 몇 가지 샘플 앱이 있습니다. 시간을 내어 확인해 보세요.