Генерация PDF отчётов на C# (.NET) с помощью QuestPDF
В современной разработке на платформе .NET часто возникает необходимость создавать профессиональные PDF-документы: отчёты, счета, накладные, аналитические сводки и другие бизнес-документы. Библиотека QuestPDF — это современное, высокопроизводительное и интуитивно понятное решение для генерации PDF на C#. Она не требует установки сторонних утилит (например, wkhtmltopdf) и работает полностью в управляемом коде .NET.
В этой статье мы подробно разберём, как начать работу с QuestPDF, настроить проект, создать простой отчёт с таблицей, изображением и форматированием текста.
Установка и настройка
QuestPDF распространяется через NuGet. Для установки выполните команду в Package Manager Console или через интерфейс Visual Studio/Rider:
Install-Package QuestPDF
Или через .NET CLI:
dotnet add package QuestPDF
После установки необходимо один раз инициализировать лицензию. Для коммерческого использования требуется платная лицензия, но для тестирования и небольших проектов доступен бесплатный режим с водяным знаком. Чтобы убрать водяной знак, добавьте в начало программы:
QuestPDF.Settings.License = LicenseType.Community;
// или для коммерческого использования:
// QuestPDF.Settings.License = LicenseType.Professional;
Создание первого PDF-документа
QuestPDF использует Fluent API — вы описываете структуру документа последовательными вызовами методов. Рассмотрим минимальный пример:
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
// Настройка лицензии (обязательно)
QuestPDF.Settings.License = LicenseType.Community;
// Создаём документ
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.DefaultTextStyle(x => x.FontSize(12));
page.Header()
.Text("Отчёт о продажах")
.SemiBold().FontSize(24).FontColor(Colors.Blue.Medium);
page.Content()
.PaddingVertical(1, Unit.Centimetre)
.Column(col =>
{
col.Item().Text("Дата: " + DateTime.Now.ToShortDateString());
col.Item().PaddingBottom(10).LineHorizontal(1);
col.Item().Text("Ниже представлена таблица с данными:");
});
page.Footer()
.AlignCenter()
.Text(x =>
{
x.Span("Страница ");
x.CurrentPageNumber();
});
});
})
.GeneratePdf("report.pdf");
Этот код создаёт PDF-файл с заголовком, датой, горизонтальной линией и номером страницы в подвале.
Работа с таблицами
Одна из самых частых задач — вывод табличных данных. QuestPDF предоставляет мощный API для создания таблиц с автоматической настройкой ширины столбцов:
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(20);
page.Content().Table(table =>
{
// Определяем столбцы (ширина в процентах от доступного пространства)
table.ColumnsDefinition(columns =>
{
columns.RelativeColumn(3); // Наименование
columns.RelativeColumn(1); // Количество
columns.RelativeColumn(1); // Цена
columns.RelativeColumn(1); // Сумма
});
// Заголовок таблицы
table.Header(header =>
{
header.Cell().Background(Colors.Grey.Lighten2).Padding(5).Text("Товар");
header.Cell().Background(Colors.Grey.Lighten2).Padding(5).AlignCenter().Text("Кол-во");
header.Cell().Background(Colors.Grey.Lighten2).Padding(5).AlignCenter().Text("Цена");
header.Cell().Background(Colors.Grey.Lighten2).Padding(5).AlignCenter().Text("Сумма");
});
// Данные (пример)
var items = new[]
{
new { Name = "Ноутбук", Qty = 2, Price = 45000m },
new { Name = "Мышь", Qty = 5, Price = 1200m },
new { Name = "Клавиатура", Qty = 3, Price = 2500m }
};
foreach (var item in items)
{
table.Cell().Padding(5).Text(item.Name);
table.Cell().Padding(5).AlignCenter().Text(item.Qty.ToString());
table.Cell().Padding(5).AlignCenter().Text($"{item.Price:N2}");
var total = item.Qty * item.Price;
table.Cell().Padding(5).AlignRight().Text($"{total:N2}");
}
});
});
Добавление изображений и графики
QuestPDF поддерживает вставку изображений из файлов, потоков или массивов байт. Пример добавления логотипа:
page