Сегодня расскажу как написать простую программу на C#, которая будет выполнять преобразование изображений в PDF. Все началось с того, что мне понадобилось перевести в PDF большое количество изображений. Нужно было группировать и сохранять изображения в отдельный PDF-документ. Для этого я попытался использовать готовые решения, но несмотря на кажущуюся простоту, процесс быстро утомлял и требовал достаточно много времени.
Я уже давно не занимаюсь разработкой на C#, поэтому для конвертации изображений в PDF взял первую попавшуюся мне библиотеку — iTextSharp. Ничего не могу сказать про ее возможности, я использовал только базовый функционал. Но в плане производительности библиотека зарекомендовала себя вполне неплохо.
Создайте новый проект и подключите библиотеку itextsharp.dll. Укажите в программе пространства имен:
using iTextSharp; using iTextSharp.text.pdf;
Для своей задачи я использовал группировку файлов по маске на основе названия файла. Для лучшей наглядности, приведу самый простой вариант, когда необходимо преобразовать в PDF все изображения. При необходимости вы сможете быстро переписать этот код под свои потребности.
Для начала запишем в массив путь ко всем изображениям в каталоге. Чтобы получить список только файлов изображений, создадим специальный фильтр на основе расширения файла:
string folder;
string[] images;
DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
folder = folderBrowserDialog1.SelectedPath;
images = Directory.GetFiles(folder);
var files = Directory.EnumerateFiles(folder, "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".jpg") || s.EndsWith(".tif"));
textBox1.Text = folderBrowserDialog1.SelectedPath;
}
Далее идет код для преобразования изображений в PDF:
private void ImgToPdf(string folder, string[] images)
{
// Создаем документ
var document = new Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);
using (var stream = new FileStream(folder + "\\document.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
{
PdfWriter.GetInstance(document, stream);
document.Open();
// Проходим по всем изображениям в каталоге
foreach (var image in images)
{
using (var imageStream = new FileStream(image, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
var page = iTextSharp.text.Image.GetInstance(imageStream);
// Размеры изображения
float width = page.Width;
float height = page.Height;
if (width < height)
{
// Книжная
document.SetPageSize(iTextSharp.text.PageSize.A4);
}
else
{
// Альбомная
document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate());
}
document.NewPage();
// Масштабируем размеры изображения под параметры страницы
if (width < height)
{
// Для книжной ориентации
if (page.Height > iTextSharp.text.PageSize.A4.Height - 25)
{
page.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
}
else if (page.Width > iTextSharp.text.PageSize.A4.Width - 25)
{
page.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
}
}
else
{
// Для альбомной ориентации
if (page.Height > iTextSharp.text.PageSize.A4.Height - 25)
{
page.ScaleToFit(iTextSharp.text.PageSize.A4.Height - 25, iTextSharp.text.PageSize.A4.Width - 25);
}
else if (page.Width > iTextSharp.text.PageSize.A4.Width - 25)
{
page.ScaleToFit(iTextSharp.text.PageSize.A4.Height - 25, iTextSharp.text.PageSize.A4.Width - 25);
}
}
// Добавляем страницу в документ
page.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
document.Add(page);
}
}
document.Close();
}
}
Для вызова функции преобразования изображений в PDF используйте код:
ImgToPdf(folder, images);
Чтобы уменьшить размер PDF-файлов на выходе, можно добавить код для сжатия изображений. Но об этом постараюсь написать в следующей статье.