Введение в iTextSharp: что это и зачем нужно
iTextSharp — это мощная библиотека для генерации и обработки PDF-документов на платформе .NET (C#, VB.NET, F#). Она является портом популярной Java-библиотеки iText и предоставляет разработчикам полный контроль над созданием, модификацией и чтением PDF-файлов.
Основные возможности iTextSharp:
- Создание PDF-документов с нуля
- Добавление текста, изображений, таблиц, списков
- Работа с шрифтами (включая кириллицу и Unicode)
- Вставка гиперссылок, закладок, метаданных
- Шифрование и защита паролем
- Слияние и разделение PDF-файлов
- Добавление водяных знаков и колонтитулов
- Работа с формами (AcroForms)
Библиотека широко используется в корпоративных приложениях для генерации отчетов, счетов, накладных, сертификатов и других документов. iTextSharp поддерживает .NET Framework 2.0+ и .NET Core (через iTextSharp.LGPLv2.Core).
Установка iTextSharp
Для установки iTextSharp в проект .NET используется NuGet Package Manager. Существует несколько версий библиотеки:
- iTextSharp (старая версия 5.x, LGPL) — бесплатная, но с ограничениями
- iTextSharp.LGPLv2.Core — форк для .NET Core / .NET 5+
- iText7 (iText.LGPLv2.Core) — новая версия iText 7 для .NET
Установка через Package Manager Console:
Install-Package iTextSharp.LGPLv2.Core -Version 1.7.0
Установка через .NET CLI:
dotnet add package iTextSharp.LGPLv2.Core --version 1.7.0
Установка через Visual Studio NuGet UI:
- Правый клик на проекте → "Manage NuGet Packages"
- Поиск: "iTextSharp.LGPLv2.Core"
- Выбрать версию и нажать "Install"
Важно: Для работы с кириллицей и другими нестандартными шрифтами потребуется дополнительная настройка (см. раздел "Советы").
Быстрый старт: создание первого PDF-документа
Рассмотрим минимальный пример создания PDF-файла с текстом "Hello, World!":
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
class Program
{
static void Main()
{
// Создаем документ
Document doc = new Document();
// Создаем поток для записи в файл
using (FileStream fs = new FileStream("HelloWorld.pdf", FileMode.Create))
{
// Получаем экземпляр PdfWriter
PdfWriter writer = PdfWriter.GetInstance(doc, fs);
// Открываем документ
doc.Open();
// Добавляем параграф с текстом
doc.Add(new Paragraph("Hello, World!"));
// Закрываем документ
doc.Close();
}
Console.WriteLine("PDF создан успешно!");
}
}
Этот код создаст файл HelloWorld.pdf в папке с исполняемым файлом. Обратите внимание на последовательность: создание Document → открытие → добавление контента → закрытие.
Основные методы и функции iTextSharp
Рассмотрим 10 ключевых методов/классов библиотеки с подробным описанием и примерами.
1. Document (класс)
Что делает: Представляет сам PDF-документ. Управляет страницами, полями и ориентацией.
Параметры конструктора:
Rectangle pageSize— размер страницы (например, PageSize.A4)float marginLeft, marginRight, marginTop, marginBottom— отступы
Пример:
// Создание документа A4 с альбомной ориентацией и кастомными полями
Document doc = new Document(PageSize.A4.Rotate(), 50, 50, 30, 30);
doc.Open();
doc.Add(new Paragraph("Альбомная ориентация"));
doc.Close();
2. PdfWriter.GetInstance()
Что делает: Связывает документ с выходным потоком (файл, MemoryStream и т.д.).
Параметры:
Document document— экземпляр документаStream stream— поток для записи
Пример с MemoryStream:
using (MemoryStream ms = new MemoryStream())
{
Document doc = new Document();
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
doc.Open();
doc.Add(new Paragraph("PDF в памяти"));
doc.Close();
// Получаем байты
byte[] pdfBytes = ms.ToArray();
}
3. Paragraph (класс)
Что делает: Создает текстовый абзац с возможностью форматирования.
Параметры:
string text— текст абзацаFont font— шрифт (опционально)
Пример с форматированием:
BaseFont baseFont = BaseFont.CreateFont("c:/windows/fonts/arial.ttf",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(baseFont, 14, Font.BOLD, BaseColor.RED);
Paragraph p = new Paragraph("Форматированный текст", font);
p.Alignment = Element.ALIGN_CENTER;
doc.Add(p);
4. PdfPTable (класс)
Что делает: Создает таблицу в PDF-документе.
Параметры:
int numColumns— количество колонокfloat totalWidth— общая ширина (опционально)
Пример таблицы:
PdfPTable table = new PdfPTable(3);
table.WidthPercentage = 100;
// Добавляем ячейки
table.AddCell("Имя");
table.AddCell("Возраст");
table.AddCell("Город");
table.AddCell("Иван");
table.AddCell("30");
table.AddCell("Москва");
table.AddCell("Мария");
table.AddCell("25");
table.AddCell("СПб");
doc.Add(table);
5. PdfPCell (класс)
Что делает: Настраивает отдельную ячейку таблицы (цвет, границы, выравнивание).
Пример:
PdfPCell cell = new PdfPCell(new Phrase("Заголовок"));
cell.BackgroundColor = BaseColor.LIGHT_GRAY;
cell.HorizontalAlignment = Element.ALIGN_CENTER;
cell.VerticalAlignment = Element.ALIGN_MIDDLE;
cell.Colspan = 2; // Объединение колонок
cell.Padding = 10;
table.AddCell(cell);
6. Image (класс)
Что делает: Вставляет изображение в документ.
Параметры:
string path— путь к файлуbyte[] data— массив байтов
Пример:
Image img = Image.GetInstance("logo.png");
img.ScaleToFit(200, 100); // Масштабирование
img.Alignment = Element.ALIGN_CENTER;
img.Border = Rectangle.BOX;
img.BorderColor = BaseColor.BLUE;
doc.Add(img);
7. Chunk (класс)
Что делает: Создает фрагмент текста с особым форматированием (цвет, подчеркивание, ссылка).
Пример с гиперссылкой:
Chunk link = new Chunk("Нажмите здесь");
link.SetAnchor("https://pythonlib.ru");
link.Font = FontFactory.GetFont(FontFactory.HELVETICA, 12, Font.UNDERLINE, BaseColor.BLUE);
doc.Add(new Paragraph(link));
8. PdfReader (класс)
Что делает: Читает существующий PDF-файл для извлечения данных или модификации.
Пример чтения метаданных:
PdfReader reader = new PdfReader("document.pdf");
int pages = reader.NumberOfPages;
string author = reader.Info["Author"];
string title = reader.Info["Title"];
Console.WriteLine($"Страниц: {pages}, Автор: {author}, Название: {title}");
reader.Close();
9. PdfStamper (класс)
Что делает: Модифицирует существующий PDF (добавляет водяные знаки, колонтитулы).
Пример добавления водяного знака:
PdfReader reader = new PdfReader("original.pdf");
using (FileStream fs = new FileStream("stamped.pdf", FileMode.Create))
{
PdfStamper stamper = new PdfStamper(reader, fs);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
Rectangle pageSize = reader.GetPageSize(i);
PdfContentByte over = stamper.GetOverContent(i);
over.BeginText();
over.SetFontAndSize(BaseFont.CreateFont(), 60);
over.SetColorFill(BaseColor.LIGHT_GRAY);
over.ShowTextAligned(Element.ALIGN_CENTER, "КОНФИДЕНЦИАЛЬНО",
pageSize.Width / 2, pageSize.Height / 2, 45);
over.EndText();
}
stamper.Close();
}
reader.Close();
10. PdfCopy (класс)
Что делает: Копирует страницы из одного или нескольких PDF в новый документ (слияние).
Пример слияния двух PDF:
using (Document doc = new Document())
using (PdfCopy copy = new PdfCopy(doc, new FileStream("merged.pdf", FileMode.Create)))
{
doc.Open();
string[] files = { "file1.pdf", "file2.pdf" };
foreach (string file in files)
{
PdfReader reader = new PdfReader(file);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
copy.AddPage(copy.GetImportedPage(reader, i));
}
reader.Close();
}
doc.Close();
}
Реальный практический пример: генерация счета-фактуры
Создадим полноценный счет-фактуру с таблицей, логотипом и нумерацией страниц:
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
public class InvoiceGenerator
{
public static void GenerateInvoice(string outputPath)
{
Document doc = new Document(PageSize.A4, 50, 50, 50, 50);
using (FileStream fs = new FileStream(outputPath, FileMode.Create))
{
PdfWriter writer = PdfWriter.GetInstance(doc, fs);
// Добавляем колонтитулы
writer.PageEvent = new InvoiceFooter();
doc.Open();
// Заголовок
BaseFont titleFont = BaseFont.CreateFont("c:/windows/fonts/arialbd.ttf",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font titleStyle = new Font(titleFont, 24, Font.BOLD, BaseColor.DARK_GRAY);
Paragraph title = new Paragraph("СЧЕТ-ФАКТУРА №123", titleStyle);
title.Alignment = Element.ALIGN_CENTER;
title.SpacingAfter = 30;
doc.Add(title);
// Информация о компании
BaseFont normalFont = BaseFont.CreateFont("c:/windows/fonts/arial.ttf",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font normalStyle = new Font(normalFont, 11);
Paragraph companyInfo = new Paragraph(
"ООО \"Ромашка\"\nИНН: 1234567890\nАдрес: г. Москва, ул. Ленина, д