Как программно конвертировать документы DOC в PDF на сервере Linux из 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе автоматизации документооборота часто возникает задача преобразования файлов Microsoft Word в формат PDF. Если сервер 1С работает под управлением Windows, задача обычно решается через COM-объекты. Однако на Linux механизмы COM недоступны, что требует поиска альтернативных инструментов. Разберем наиболее эффективные способы реализации этой задачи, начиная от простых консольных команд и заканчивая современными архитектурными решениями.

Способ 1. Использование LibreOffice в режиме Headless

Самым популярным и надежным бесплатным инструментом для Linux является пакет LibreOffice. Он обладает мощным движком рендеринга, который корректно обрабатывает сложную верстку документов. Основной утилитой здесь выступает soffice (или libreoffice).

Рассмотрим базовую команду для конвертации:

soffice --headless --convert-to pdf --outdir /путь/к/папке/результата /путь/к/файлу/источнику.doc

Разберем параметры подробнее:

Проанализируем пример кода на языке 1С для вызова этой команды с сервера:


КомандаЗапуска = "soffice --headless --convert-to pdf --outdir " + ПутьВыгрузки + " " + ПолныйПутьКФайлу;
ЗапуститьПриложение(КомандаЗапуска, , Истина);

Важный нюанс: Если ваш сервер 1С выполняет несколько конвертаций одновременно, LibreOffice может выдать ошибку из-за блокировки профиля пользователя. Чтобы избежать этого, мы рекомендуем для каждого вызова создавать временный профиль пользователя с помощью параметра -env:UserInstallation.


УникальныйПутьПрофиля = "/tmp/1c_pdf_profile_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
КомандаЗапуска = "soffice -env:UserInstallation=file://" + УникальныйПутьПрофиля + 
                 " --headless --convert-to pdf --outdir " + ПутьВыгрузки + " " + ПолныйПутьКФайлу;
ЗапуститьПриложение(КомандаЗапуска, , Истина);
// После выполнения желательно удалить временную папку профиля

Способ 2. Конвертация через пакет AbiWord

Если LibreOffice кажется слишком тяжеловесным для вашей системы, можно использовать AbiWord. Это легкий текстовый процессор, который также поддерживает консольный режим.

Синтаксис команды для AbiWord выглядит следующим образом:

abiword --to=pdf /путь/к/файлу.doc

Преимущество этого метода в скорости запуска и меньшем потреблении оперативной памяти. Однако стоит учитывать, что AbiWord может хуже справляться со сложными таблицами и специфическим форматированием документов, созданными в последних версиях MS Word.

Способ 3. Штатные средства платформы 1С:Предприятие

Начиная с версии платформы 8.3.15, в 1С появились встроенные возможности по работе с документами Word. Рассмотрим, как это можно использовать. Выясним, подходит ли метод Прочитать() для нашей задачи.

Объект ТабличныйДокумент умеет читать файлы .docx, но при этом он преобразует их в свою внутреннюю структуру. Это удобно для извлечения данных, но визуальное оформление может "поехать".


ТабДок = Новый ТабличныйДокумент;
// СпособЧтенияЗначенийТабличногоДокумента.Значение позволяет сохранить данные
ТабДок.Прочитать(ПутьКФайлуDocx, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ТабДок.Записать(ПутьКФайлуPdf, ТипФайлаТабличногоДокумента.PDF);

Ограничение: Этот метод работает только с форматом .docx. Старые файлы .doc (Binary) платформа прочитать таким образом не сможет. Кроме того, колонтитулы и сложные диаграммы при таком подходе часто теряются.

Способ 4. Использование микросервиса (Gotenberg) через Docker

Для крупных промышленных систем мы рекомендуем выносить задачу конвертации в отдельный микросервис. Одним из лучших решений является Gotenberg. Это готовый API-сервис, работающий в Docker-контейнере, который принимает файлы по HTTP и возвращает PDF.

Разберем преимущества этого подхода:

  1. Сервер 1С не нагружается тяжелыми процессами офисных пакетов.
  2. Нет проблем с правами доступа и шрифтами на самом сервере 1С.
  3. Изоляция: если процесс конвертации "зависнет", это не повлияет на работу 1С.

Пример реализации в 1С через HTTPСоединение:


Запрос = Новый HTTPЗапрос("/forms/libreoffice/convert");
// Здесь должен быть код формирования Multipart FormData с файлом
Соединение = Новый HTTPСоединение("адрес_сервиса_gotenberg", 3000);
Ответ = Соединение.ОтправитьДляОбъекта(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ПутьКPDF);
КонецЕсли;

Критически важный момент: Шрифты в Linux

Проанализируем типичную проблему: документ сконвертировался, но вместо текста в PDF отображаются "квадратики" или верстка сильно смещена. Причина в том, что в Linux по умолчанию отсутствуют шрифты Microsoft (Arial, Times New Roman, Calibri).

Чтобы конвертация работала корректно, необходимо установить пакет шрифтов на сервер Linux. Для дистрибутивов Ubuntu/Debian выполните команду в терминале:

sudo apt-get install ttf-mscorefonts-installer

После установки обязательно обновите кэш шрифтов: fc-cache -f -v. Без этого шага любой из вышеописанных способов (кроме Docker, где шрифты могут быть внутри контейнера) будет выдавать некачественный результат.

Проверка прав доступа

Выясним еще одну причину возможных ошибок. Сервер 1С обычно запускается от имени специального пользователя (например, usr1cv8). Этот пользователь должен иметь:

Посмотрим, как проверить доступность утилиты из кода 1С:


ФайлУтилиты = Новый Файл("/usr/bin/soffice");
Если Не ФайлУтилиты.Существует() Тогда
    Сообщить("Утилита LibreOffice не найдена по указанному пути!");
КонецЕсли;

Подводя итог, можно сказать: для простых задач достаточно прямого вызова LibreOffice с параметром --headless, а для стабильной работы в многопоточном режиме обязательно используйте разделение профилей через UserInstallation и следите за наличием установленных шрифтов в системе.

← На главную