При автоматизации документооборота в 1С часто возникает задача конвертации входящих PDF-файлов (сертификатов, сканов, накладных) в формат JPG для их последующего отображения в интерфейсе или обработки. Одной из самых популярных библиотек для этой цели является ImageMagick. Однако программисты часто сталкиваются с неприятным эффектом: после конвертации вместо белого листа документа получается полностью черный фон, на котором едва различимы печати или подписи. В этой статье мы разберем, почему это происходит и как правильно настроить параметры конвертации.
Прежде чем переходить к коду, проанализируем ситуацию с технической точки зрения. Основная причина кроется в различиях между форматами. Формат PDF поддерживает прозрачность (так называемый альфа-канал). Многие документы, особенно созданные в графических редакторах или специализированном ПО, имеют прозрачный слой в качестве подложки.
Формат JPG, напротив, прозрачность не поддерживает. Когда ImageMagick выполняет преобразование, он «сталкивается» с прозрачными областями и по умолчанию заполняет их черным цветом, если не указано иное. Наша задача — явно указать приложению, что прозрачные слои нужно заменить на стандартный белый цвет.
Рассмотрим стандартный подход, который часто используют на старых платформах 1С (где нет встроенных средств работы с PDF). Для запуска внешнего приложения используется метод ЗапуститьПриложение. Изначально код может выглядеть следующим образом:
Процедура КонвертироватьPDFtoImg(ИмяВременногоФайла, ИмяВременногоФайла_img) Экспорт
// Начальный вариант строки запуска
СтрокаЗапуска = """C:\Program Files\ImageMagick-7.1.1-Q16-HDRI\convert.exe"" -density 300 -trim "
+ """" + ИмяВременногоФайла + """"
+ " -quality 100 "
+ " " + """" + ИмяВременногоФайла_img + """";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
КонецПроцедуры
В данном примере используется параметр -density 300 для обеспечения приемлемого качества (DPI) и -trim для обрезки пустых краев. Однако именно этот код чаще всего выдает «черный квадрат» вместо документа.
Чтобы устранить проблему с фоном, проанализируем рекомендации документации ImageMagick. Нам необходимо выполнить две операции: установить цвет фона и удалить альфа-канал. Разберем по шагам обновленную строку запуска:
Посмотрим на исправленный вариант процедуры в 1С:
Процедура КонвертироватьPDFtoImg(ИмяВременногоФайла, ИмяВременногоФайла_img) Экспорт
// Исправленный вариант с удалением прозрачности
СтрокаЗапуска = """C:\Program Files\ImageMagick-7.1.1-Q16-HDRI\convert.exe"" -density 300 -background white -alpha remove -trim "
+ """" + ИмяВременногоФайла + """"
+ " -quality 100 "
+ " " + """" + ИмяВременногоФайла_img + """";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
КонецПроцедуры
Важно обратить внимание на версию установленного ПО. В сообщениях форума часто упоминается convert.exe. Это имя исполняемого файла из 6-й версии библиотеки. В 7-й версии основным файлом является magick.exe. Хотя режим совместимости часто работает, для стабильности в современных системах рекомендуется использовать актуальный вызов.
Также для более качественного объединения слоев (особенно если PDF сложный и содержит много наложений) рекомендуется использовать параметр -flatten. Он «сплющивает» все слои документа в один на указанном фоне.
Если вы работаете с сертификатами или полиграфическими макетами, вы можете столкнуться с тем, что цвета после конвертации выглядят инвертированными или слишком яркими. Это происходит из-за того, что документы для печати часто используют цветовую модель CMYK. Для корректного отображения на экране монитора (в 1С) нам нужно принудительно перевести изображение в пространство sRGB.
Добавим параметр -colorspace sRGB в нашу команду:
СтрокаЗапуска = "magick.exe -density 300 ""вход.pdf"" -background white -alpha remove -flatten -colorspace sRGB -quality 90 ""выход.jpg""";
Многие забывают, что ImageMagick не умеет интерпретировать PDF самостоятельно. Он выступает лишь «оболочкой» для другой программы — Ghostscript. Если при выполнении кода файл JPG просто не создается, проверьте следующие моменты:
GPL Ghostscript (например, версия 9.50 или выше).policy.xml в папке установки и убедитесь, что для формата PDF права установлены в "read|write" вместо "none".Рассмотрим ситуацию, когда во входящем PDF несколько страниц. По умолчанию команда создаст файлы с именами img-0.jpg, img-1.jpg и так далее. Если ваша логика в 1С ожидает один конкретный файл, это вызовет ошибку.
Чтобы конвертировать только первую (титульную) страницу документа, добавьте индекс [0] к имени исходного файла:
// Конвертация только первой страницы
СтрокаЗапуска = "magick.exe -density 300 ""документ.pdf[0]"" -background white -alpha remove ""результат.jpg""";
Если ваша организация перешла на современные версии платформы, стоит рассмотреть отказ от внешних приложений. Начиная с версии 8.3.10, в 1С появилась возможность рендеринга страниц PDF штатными средствами. Это работает быстрее, так как не требует запуска внешнего процесса ОС, и избавляет от проблем с установкой стороннего софта на сервер.
Для этого используются объекты РендерингСтраниц и ПотокВПамяти. Пример логики (упрощенно):
ДокументPDF = Новый ДокументPDF(ИмяФайла);
ДанныеСтраницы = ДокументPDF.ПолучитьСтраницу(1);
Картинка = ДанныеСтраницы.ПолучитьКартинку(); // Получаем объект Картинка
Картинка.Записать(ПутьКФайлуJPG);
Этот метод автоматически учитывает фон и корректно обрабатывает большинство современных PDF-файлов без дополнительных манипуляций с альфа-каналом. Однако, если вы ограничены старой платформой, использование ImageMagick с параметрами -background white -alpha remove остается самым надежным и гибким решением.