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