Предлагаю вашему вниманию удобный инструмент для работы с PDF форматом.
Несмотря на то, что на ИС существует множество подобных вещей, но для универсальности и простоты пришлось собрать собственный велосипед.
Это обыкновенная COM-компонента под Win, позволяющая преобразовывать PDF файлы в изображения (с отличным качеством), изображения в PDF, а также разбивать PDF на более мелкие файлы и склеивать файлы PDF в единый документ, извлекать текст из PDF, имеющих текстовые слои, вставлять на страницы PDF водяные знаки, логотипы, печати.
Есть поддержка x86 и x64 платформ.
В основе движка лежат две мощные библиотеки: iTextSharp 5 и PdfiumViewer .
Как пользоваться:
сначала просто проинсталлировать в систему пакет "SetupArrowPDF.msi" (выбираем что-то одно: из папки "x86" или из "x64") -> необходимые библиотеки скопируются в программные файлы, а компонента зарегистрируется автоматически.
далее инициализируем:
Конвертер = Новый COMОбъект("ArrowPDF.Converter");
можно сразу посмотреть версию:
Сообщить(Конвертер.Version());
[пока] есть <8> прикладных методов:
1) для сборки изображений в единый PDF файл:
// ширина и высота создаваемого PDF
// т.к. для PDF дефолтный DPI = 72, то лист формата A4 будет 595*842 пикселей
Конвертер.PdfWidth = 595;
Конвертер.PdfHeight = 842;
// отступы от краёв
Конвертер.PdfLeftMargin = 0;
Конвертер.PdfRightMargin = 0;
Конвертер.PdfTopMargin = 0;
Конвертер.PdfBottomMargin = 0;
// пути к изображениям
изо1 = "C:\Images\img1.png";
изо2 = "C:\Images\img2.jpg";
// пути добавим в массив
Изображения = Новый Массив;
Изображения.Добавить(изо1);
Изображения.Добавить(изо2);
// преобразуем массив в безопасный
Если Изображения.Количество() <> 0 Тогда
Файлы = Новый COMSafeArray(Изображения, "VT_BSTR");
КонецЕсли;
// путь к создаваемому PDF
НовыйПДФ = "C:\TEMP\new.pdf";
Результат = Конвертер.IMG2PDF(Файлы, НовыйПДФ);
Если НЕ ПустаяСтрока(Результат) Тогда
Сообщить(Результат);
КонецЕсли;
2) для конвертации страниц PDF в изображения:
Исходный = "С:\Temp\Book.pdf";
Папка = "С:\Temp\Images";
Конвертер.PdfPages = "3, 5,8,16, 19 ,28 "; // номера страниц через запятую
Конвертер.ImgFormat = "JPG"; // или "bmp", или "TiF", или "Png" (по умолчанию)
// размеры изображений
Конвертер.ImgWidth = 4000;
Конвертер.ImgHeight = 6000;
// разрешающая способность
//Конвертер.ImgDpiX = 1200;
//Конвертер.ImgDpiY = 1200;
Результат = Конвертер.PDF2IMG(Исходный, Папка);
Если НЕ ПустаяСтрока(Результат) Тогда
Сообщить(Результат);
КонецЕсли;
3) для дробления PDF:
Исходник = "C:\Temp\Manual.pdf";
Папка = "C:\Man\";
// диапазон задается начальной и конечной страницей через знак тире
// диапазоны разделяются запятой
Конвертер.PdfRanges = "1-3, 6, 15 - 20"; // для постраничного разбиения указать только "*"
Результат = Конвертер.SplitPDF(Исходник, Папка);
Если НЕ ПустаяСтрока(Результат) Тогда
Сообщить(Результат);
КонецЕсли;
4) для слияния PDF:
п1 = "C:\PDFs\header.pdf";
п2 = "C:\PDFs\footer.pdf";
ПДФы = Новый Массив;
ПДФы.Добавить(п1);
ПДФы.Добавить(п2);
Если ПДФы.Количество() <> 0 Тогда
Файлы = Новый COMSafeArray(ПДФы, "VT_BSTR");
КонецЕсли;
БольшойПДФ = "C:\Temp\ALL.pdf";
Результат = Конвертер.MergePDF(Файлы, БольшойПДФ);
Если НЕ ПустаяСтрока(Результат) Тогда
Сообщить(Результат);
КонецЕсли;
5) для извлечения текста из PDF:
ДокументСТекстовымСлоем = "D:\Temp\Kniga.pdf";
ТекстИзПДФ = "";
ПутьТхт = "D:\Temp\Txt.txt";
Конвертер.PdfPages = "1,3,5";
Результат = Конвертер.GetText(ДокументСТекстовымСлоем, ТекстИзПДФ);
Тхт = Новый ТекстовыйДокумент;
Тхт.УстановитьТекст(ТекстИзПДФ);
Тхт.Записать(ПутьТхт);
Если НЕ ПустаяСтрока(Результат) Тогда
Сообщить(Результат);
КонецЕсли;
6) для вставки в PDF логотипов, водяных знаков, печатей и штампов:
ИсходныйПДФ = "D:\Temp\Document.pdf";
ВодянойЗнак = "D:\Temp\Logo.pdf";
НовыйПДФ = "D:\Temp\Stamped.pdf";
Конвертер.PdfPages = "2,4,6";
Результат = Конвертер.AddWatermark(ИсходныйПДФ, ВодянойЗнак, НовыйПДФ);
Если НЕ ПустаяСтрока(Результат) Тогда
Сообщить(Результат);
КонецЕсли;
7) для сжатия PDF файлов:
ИсходныйПДФ = "D:\Temp\Document.pdf";
СжатыйПДФ = "D:\Temp\CompressedDocument.pdf";
Результат = Конвертер.Compress(ИсходныйПДФ, СжатыйПДФ);
Если НЕ ПустаяСтрока(Результат) Тогда
Сообщить(Результат);
КонецЕсли;
8) для защиты PDF файлов от печати и изменений:
ИсходныйПДФ = "D:\Temp\Document.pdf";
ЗащищенныйПДФ = "D:\Temp\ProtectedDocument.pdf";
Пароль = "MasTer-PassW0rd!"
Результат = Конвертер.Protect(ИсходныйПДФ, ЗащищенныйПДФ, Пароль);
Если НЕ ПустаяСтрока(Результат) Тогда
Сообщить(Результат);
КонецЕсли;
Почти все свойства данной компоненты, за исключением диапазонов или номеров страниц, можно не указывать принудительно, тогда они будут выставлены по умолчанию.
Горизонты использования компоненты не ограничены только 1с. Можете использовать её аналогично и в других ЯП.
Если будут пожелания на расширение функционала - высказывайтесь. Вместе сделаем мир лучше )
P.S. Просьба не сообщать, что можно сделать подобное через ghostscript или другие библиотеки или приложения. Перепробовал несколько разных инструментов - либо оч. сложно, либо не то качество или удобство.
Так как публикация вызвала интерес у сообщества, буду развивать функционал по мере появления новых идей и свободного времени.
Upd. 03.04.2020 - v.1.1
Доработка регистрации библиотеки типов. Исправление ошибки COM-взаимодействия из других ЯП.
Upd. 04.04.2020 - v.1.2
Добавлены методы GetText() и AddWatermark(). Свойство ImgPages заменено на PdfPages, которое может использоваться в нескольких методах.
Upd. 19.05.2020 - v.1.3
Добавлено сжатие PDF файлов - метод Compress().
Upd. 08.07.2020 - v.1.4
Добавлена возможность установки пароля на PDF документ - метод Protect().
Upd. 20.11.2020 - v.1.5
Добавлена 64-х разрядная версия компоненты.