이 페이지에는 자동 번역된 텍스트가 포함될 수 있습니다.
PDF 페이지를 레이아웃하는 방법
PdfDocumentBuilder.Generate 메서드는 해당 대리자에 Document 형식의 개체를 제공합니다. 해당 개체의 Pages 메서드를 사용하여 문서 페이지를 구성합니다. 이 메서드에는 PageLayout 형식의 매개 변수를 받는 대리자를 제공해야 합니다.

PDF 문서의 모든 페이지가 동일한 레이아웃을 가진다면 이 메서드를 한 번 호출하면 충분합니다. 문서에 서로 다른 레이아웃이 있다면 Pages 메서드를 두 번 이상 호출하세요. 예를 들어 표지 페이지를 레이아웃하기 위해 한 번 호출한 다음, 보고서 본문을 설명하기 위해 다시 호출할 수 있습니다.
Pages를 호출할 때마다 최소한 한 페이지가 생성됩니다. 제공된 콘텐츠가 없으면 생성된 페이지는 비어 있을 수 있습니다.
이 문서는 PDF 생성용 Layout API에 대한 시리즈의 일부입니다. API가 처음이라면 먼저 Layout API 시작하기 부분을 읽어 보세요.
콘텐츠 슬롯
페이지 레이아웃을 설명하려면 미리 정의된 컨테이너를 사용합니다. 저는 이를 콘텐츠 슬롯이라고도 부릅니다. 이 컨테이너들은 PageLayout 개체의 메서드를 호출하여 사용할 수 있습니다.
주요 슬롯은 Content, Header, Footer의 세 가지입니다. 추가 콘텐츠용 슬롯은 Background, Foreground의 두 가지입니다. 기본적으로 다섯 컨테이너는 모두 비어 있으며 페이지 공간을 차지하지 않습니다. 페이지 콘텐츠를 요구 사항에 따라 슬롯에 분배합니다.
컨테이너를 사용하여 페이지를 레이아웃하는 방법은 컨테이너와 그 내용물 문서를 읽어 보세요.
머리글과 바닥글
머리글 및 바닥글 콘텐츠가 각각 Header 및 Footer 슬롯에 들어간다는 사실은 놀랍지 않을 것입니다. 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 슬롯은 하단에 고정됩니다.
추가 콘텐츠
Background 및 Foreground는 워터마크, 오버레이, 배경에 사용할 수 있는 컨테이너를 제공합니다. Background 슬롯의 모든 콘텐츠는 페이지의 머리글, 바닥글, 주요 콘텐츠 아래에 배치됩니다. Foreground 슬롯의 콘텐츠는 페이지에 추가된 모든 요소를 덮습니다.
이 컨테이너들은 페이지 전체를 차지합니다. 이것이 이 컨테이너들의 고유한 특징입니다. API는 생성되는 각 페이지에서 이들의 콘텐츠를 반복합니다. 머리글 및 바닥글 컨테이너에 하는 것과 정확히 같습니다.
위 코드에 몇 줄을 추가하여 Foreground 및 Background 컨테이너 사용 방법을 보여 주었습니다.
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 메서드를 사용하여 모든 여백을 동일한 포인트 값으로 설정합니다. MarginVertical 및 MarginHorizontal 메서드를 사용하면 세로 또는 가로 여백만 설정할 수 있습니다. 각 여백을 개별적으로 지정하려면 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 메서드로 지정한 스타일을 재정의합니다. 예를 들어 Typography.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는 현재 페이지 번호를 자동으로 계산합니다. 문서의 총 페이지 수도 계산합니다. 모든 텍스트 컨테이너의 CurrentPageNumber 및 PageCount 메서드를 호출하여 번호를 얻을 수 있습니다. 컨테이너가 머리글, 바닥글, 주요 콘텐츠 슬롯 중 어디에 있든 상관없습니다.
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 문서에 머리글 및 바닥글 추가 예제는 페이지 번호에 사용자 지정 서식을 적용하는 방법을 보여 줍니다.
샘플 코드
앞서 언급한 기능을 더 자세히 다루는 샘플 앱이 있습니다. 시간을 내어 살펴보세요.