Сегодня расскажу как написать простую программу на 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-файлов на выходе, можно добавить код для сжатия изображений. Но об этом постараюсь написать в следующей статье.