Генерация PDF отчётов на C# (.NET) с помощью QuestPDF

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Генерация 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                    

Рекомендаций