При интеграции 1С с внешними утилитами обработки изображений, такими как ImageMagick, программисты часто сталкиваются с проблемой: если путь к файлу или его имя содержит пробелы, внешнее приложение отказывается работать или выдает ошибку о том, что файл не найден. Это происходит потому, что операционная система воспринимает пробел как разделитель между аргументами командной строки.
В данной статье мы подробно разберем, как правильно сформировать строку запуска, рассмотрим нюансы работы с ImageMagick версии 7 и выше, а также изучим дополнительные настройки, без которых конвертация может не заработать вовсе.
Рассмотрим стандартную ситуацию. У нас есть путь к исполняемому файлу и пути к исходному PDF и результирующему JPG. Если мы просто объединим их в строку, система воспримет часть пути после первого пробела как отдельный параметр. Чтобы этого избежать, пути необходимо заключать в двойные кавычки.
Проанализируем пример кода, который вызывает ошибку при наличии пробелов:
Процедура КонвертироватьPDFtoImg(ИмяВременногоФайла, ИмяВременногоФайла_img) Экспорт
СтрокаЗапуска = """C:\Program Files\ImageMagick-7.1.1-Q16-HDRI\convert.exe"" -density 300 -trim "+ИмяВременногоФайла+" -quality 100 "+" "+ИмяВременногоФайла_img;
ЗапуститьПриложение(СтрокаЗапуска,,Истина,Неопределено);
КонецПроцедуры
В данном примере кавычки стоят только вокруг пути к convert.exe. Если в переменной ИмяВременногоФайла окажется значение типа "C:\My Documents\file.pdf", программа convert.exe получит аргумент "C:\My", что приведет к ошибке.
Выясним, как правильно экранировать переменные в 1С. Поскольку в языке 1С двойная кавычка внутри строки обозначается двумя двойными кавычками, итоговая конструкция должна выглядеть следующим образом:
// Правильный вариант формирования строки запуска
СтрокаЗапуска = """C:\Program Files\ImageMagick-7.1.1-Q16-HDRI\convert.exe"" -density 300 -trim """
+ ИмяВременногоФайла + """ -quality 100 """ + """ "
+ ИмяВременногоФайла_img + """";
Или более читаемый вариант с использованием функции СтрШаблон (если версия платформы позволяет):
Шаблон = """%1"" -density 300 -trim ""%2"" -quality 100 ""%3""";
СтрокаЗапуска = СтрШаблон(Шаблон, ПутьККонвертеру, ИмяВременногоФайла, ИмяВременногоФайла_img);
Важный момент: Обратите внимание, что каждый путь, который потенциально может содержать пробел, должен быть обрамлен символами """ с обеих сторон внутри конкатенации строк 1С.
Проанализируем ситуацию с версиями ПО. В 7-й версии ImageMagick основным исполняемым файлом стал magick.exe. Использование имени convert.exe оставлено для обратной совместимости, однако в операционной системе Windows уже существует встроенная утилита convert.exe, предназначенная для работы с файловыми системами.
Чтобы исключить конфликты, рекомендуется:
magick.exe.convert писать magick, если вы вызываете программу просто по имени из системного PATH.Часто программисты 1С сталкиваются с тем, что код написан верно, кавычки расставлены, но файл JPG не создается. Выясним причину: ImageMagick не является интерпретатором PDF. Он использует для этого внешнюю библиотеку Ghostscript.
Для успешной работы необходимо:
В последних версиях ImageMagick чтение PDF может быть заблокировано политикой безопасности. Проверим файл policy.xml, который обычно находится в папке C:\Program Files\ImageMagick...\etc\ImageMagick-7\.
Найдем строку:
<policy domain="module" rights="none" pattern="{PS,PDF,XPS}" />
Если она присутствует, ее нужно закомментировать или изменить rights="none" на rights="read|write". Без этого изменения утилита будет выдавать ошибку доступа при попытке прочитать любой PDF файл.
Рассмотрим ситуацию, когда в исходном PDF файле несколько страниц. По умолчанию ImageMagick создаст для каждой страницы отдельный файл, добавляя индекс в конец имени (например, image-0.jpg, image-1.jpg). Это может сломать логику 1С, которая ожидает один файл.
Если нам нужна только первая страница, к пути файла следует добавить индекс в квадратных скобках:
ИмяВременногоФайла = "C:\Files\document.pdf[0]";
Это заставит конвертер обработать только первую страницу (индексация начинается с нуля).
Файлы PDF часто содержат прозрачные области. Формат JPG прозрачность не поддерживает, поэтому при конвертации прозрачные зоны могут стать черными, что делает текст нечитаемым. Чтобы избежать этого, добавим параметры принудительного белого фона:
// Добавляем -alpha remove и -background white
СтрокаЗапуска = """..."" -density 300 ""...[0]"" -alpha remove -background white -quality 100 ""...""";
Если работа с кавычками кажется слишком громоздкой, можно использовать короткие имена путей в формате DOS (8.3), которые никогда не содержат пробелов. Рассмотрим, как получить такой путь программно через COMОбъект:
ФСО = Новый COMОбъект("Scripting.FileSystemObject");
Файл = ФСО.GetFile(ИмяВременногоФайла);
КороткоеИмя = Файл.ShortPath; // Вернет путь вида C:\DOCUME~1\FILE.PDF
Использование ShortPath позволяет формировать строку запуска без дополнительных кавычек, что иногда упрощает отладку.
Вместо использования функции ПаузаВСекундах, что является крайне ненадежным методом, мы рекомендуем использовать объект WScript.Shell. Это позволит 1С дождаться завершения процесса и прочитать ошибки, если они возникли.
WshShell = Новый COMОбъект("WScript.Shell");
КодВозврата = WshShell.Run(СтрокаЗапуска, 0, Истина);
Если КодВозврата <> 0 Тогда
Сообщить("Ошибка конвертации! Код: " + КодВозврата);
КонецЕсли;
Использование параметра Истина в методе Run заставляет 1С ждать завершения работы конвертера, что исключает ситуацию, когда код пытается прочитать файл, который еще не успел создаться.