PDF генерация в C# (.NET): лучшие библиотеки и примеры кода

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

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

Начать курс

PDF генерация в C# (.NET): обзор библиотек и практические примеры

Генерация PDF-документов — одна из самых частых задач в корпоративной разработке на C#. Отчеты, счета, накладные, договоры — всё это удобно формировать программно. В экосистеме .NET существует несколько зрелых библиотек, каждая со своими сильными сторонами. В этой статье мы разберем четыре основных инструмента, покажем примеры кода и поможем выбрать подходящий для вашего проекта.

1. iTextSharp / iText 7 for .NET

iText — пожалуй, самая известная библиотека для работы с PDF. Версия iTextSharp была портом Java-библиотеки для .NET Framework. Сейчас актуальна iText 7 for .NET (лицензия AGPL для open-source проектов или коммерческая).

Возможности:

  • Создание PDF с нуля
  • Работа с шаблонами (PdfTemplate)
  • Добавление изображений, таблиц, списков
  • Поддержка Unicode, кириллицы
  • Цифровая подпись, шифрование

Пример: простой документ с таблицей

using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;

public void CreateSimplePdf(string filePath)
{
    using (PdfWriter writer = new PdfWriter(filePath))
    using (PdfDocument pdf = new PdfDocument(writer))
    using (Document doc = new Document(pdf))
    {
        doc.Add(new Paragraph("Привет, мир!"));
        
        Table table = new Table(3);
        table.AddCell("Имя");
        table.AddCell("Возраст");
        table.AddCell("Город");
        table.AddCell("Анна");
        table.AddCell("28");
        table.AddCell("Москва");
        
        doc.Add(table);
    }
}

2. PDFsharp / MigraDoc

PDFsharp — легковесная библиотека с открытым исходным кодом (MIT). В паре с MigraDoc позволяет описывать документы в стиле "word processor": абзацы, стили, колонтитулы. Отлично подходит для генерации простых отчетов без сложной графики.

Преимущества:

  • Низкий порог входа
  • Хорошая поддержка кириллицы
  • Не требует лицензирования
  • Работает с .NET Framework и .NET Core

Пример: создание документа через MigraDoc

using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;

public void CreateWithMigraDoc(string filePath)
{
    Document doc = new Document();
    Section section = doc.AddSection();
    
    Paragraph para = section.AddParagraph("Заголовок отчета");
    para.Format.Font.Size = 18;
    para.Format.Font.Bold = true;
    
    section.AddParagraph("Это текст отчета. Сгенерировано с помощью PDFsharp и MigraDoc.");
    
    PdfDocumentRenderer renderer = new PdfDocumentRenderer(true);
    renderer.Document = doc;
    renderer.RenderDocument();
    renderer.PdfDocument.Save(filePath);
}

3. QuestPDF

QuestPDF — современная библиотека с fluent-интерфейсом (синтаксис, похожий на LINQ). Распространяется по лицензии MIT (бесплатно для коммерческого использования). Активно развивается, поддерживает .NET 6/7/8.

Ключевые фичи:

  • Декларативное построение макета
  • Автоматическое разбиение на страницы
  • Поддержка изображений, SVG, QR-кодов
  • Высокая производительность

Пример: генерация счета

using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

public byte[] GenerateInvoice()
{
    return Document.Create(container =>
    {
        container.Page(page =>
        {
            page.Size(PageSizes.A4);
            page.Margin(2, Unit.Centimetre);
            page.DefaultTextStyle(x => x.FontSize(12));
            
            page.Header().Element(ComposeHeader);
            page.Content().Element(ComposeContent);
            page.Footer().AlignCenter().Text(x =>
            {
                x.Span("Страница ");
                x.CurrentPageNumber();
            });
        });
    }).GeneratePdf();
}

void ComposeHeader(IContainer container)
{
    container.Row(row =>
    {
        row.RelativeItem().Text("Счет №123", TextStyle.Default.FontSize(20).Bold());
        row.ConstantItem(100).Image("logo.png");
    });
}

void ComposeContent(IContainer container)
{
    container.Table(table =>
    {
        table.ColumnsDefinition(columns =>
        {
            columns.RelativeColumn();
            columns.RelativeColumn();
            columns.ConstantColumn(70);
        });
        
        table.Header(header =>
        {
            header.Cell().Text("Товар");
            header.Cell().Text("Количество");
            header.Cell().AlignRight().Text("Цена");
        });
        
        table.Cell                    

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