Сохранить изображение в PDF на C#

Дата: 23.03.2016Метки:

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