Главная
» PC Советы
»
Запустите LibreOffice в безголовом режиме в Docker для преобразования PDF-файлов.
Запустите LibreOffice в безголовом режиме в Docker для преобразования PDF-файлов.
Да. Для разовых преобразований документов создайте небольшой образ Docker с установленным LibreOffice и запустите soffice --headlessего --convert-to. Смонтируйте входной каталог только для чтения, а отдельный выходной каталог — с правами на запись, чтобы PDF-файл отображался на вашем хосте. В этом примере используется образ на основе Debian и преобразуется один файл DOCX в PDF; LibreOffice не предоставляется в качестве сетевой службы.
В Dockerfile устанавливается LibreOffice Writer и базовый пакет шрифтов, а затем в качестве команды для контейнера используется soffice.
Что делает безголовый режим и когда Docker полезен?
В безголовом режиме LibreOffice запускается без графического интерфейса. LibreOffice описывает этот режим для использования через командную строку и API, а его параметры командной строки поддерживают преобразование файлов с указанием выходного каталога. Docker упаковывает приложение и его зависимости, поэтому скрипт или рабочая станция могут запускать тот же образ контейнера без установки пакета приложений на хост.
Этот подход хорошо подходит для локальных пакетных заданий, задач CI или бэкенд-воркера, который получает файл и сохраняет преобразованный результат. Обычный безголовый контейнер сам по себе не является HTTP-API для преобразования: он не прослушивает порты и не принимает веб-загрузки. Если вам нужен постоянный сервис, создайте API и очередь заданий вокруг процесса преобразования и добавьте проверку запросов, тайм-ауты, ограничения размера файлов и изоляцию.
1. Создайте папки для ввода и вывода.
На компьютере под управлением Linux или macOS с использованием Bash или аналогичной оболочки создайте папку проекта с отдельными каталогами. Поместите в неё исходный документ inputи оставьте её outputпустой для первого запуска:
mkdir -p lo-work/input lo-work/output
cp report.docx lo-work/input/
cd lo-work
Приведённые ниже команды Docker используют пути в стиле Unix и синтаксис командной оболочки. В Windows измените синтаксис пути хоста для PowerShell или командной строки и убедитесь, что Docker Desktop имеет право совместного использования диска, содержащего эти папки.
2. Создайте образ с помощью LibreOffice.
DockerfileСоздайте внутри файл с именем, lo-workсодержащим следующее:
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
libreoffice-writer fonts-liberation \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["soffice"]
libreoffice-writerПредоставляет Writer и необходимые фильтры преобразования для распространенных форматов текстовых редакторов. Добавьте libreoffice-calcили, libreoffice-impressесли контейнер должен преобразовывать электронные таблицы или презентации. Пакет шрифтов является лишь базовым; установите шрифты, необходимые для ваших документов и на использование которых у вас есть права, поскольку отсутствующие шрифты могут изменить перенос строк и разрывы страниц.
Создайте образ из каталога, содержащего Dockerfile:
docker build -t lo-headless .
В примере используются имена пакетов Debian Bookworm. Теги базовых образов и пакеты репозитория со временем меняются; для производственной сборки выбирайте поддерживаемый базовый образ, регулярно пересобирайте его для обновлений безопасности и закрепляйте базовый образ по дайджесту, если вам нужны воспроизводимые сборки. Избегайте установки пакетов из несвязанного репозитория только для того, чтобы соответствовать руководству.
Перед запуском контейнера для преобразования соберите локальный образ из Dockerfile.
3. Запустите LibreOffice с отдельными точками монтирования.
Запустите временный контейнер и передайте параметры преобразования после имени образа. Входной каталог доступен только для чтения; запись доступна только в выходной каталог. Параметр --userзапускает процесс с использованием идентификаторов пользователя и группы хоста в Linux, а параметр HOME=/tmpпредоставляет LibreOffice доступный для записи домашний каталог. Измените права доступа к папке, если пользователь хоста не может записывать в output.
--headlessЭтот процесс отключает графический интерфейс пользователя, --convert-to pdf:writer_pdf_Exportвыбирает фильтр экспорта в PDF и --outdirнаправляет результат в смонтированную выходную папку. Уникальный путь в профиле пользователя предоставляет этому процессу каталог конфигурации LibreOffice с возможностью записи; если вы одновременно выполняете несколько преобразований в одном долгоживущем контейнере, используйте разные пути в профиле для каждого процесса.
Используйте --mountвместо , -vесли вам больше нравится более явный синтаксис монтирования Docker. Привязанные монтирования привязаны к путям на хосте демона Docker, а монтирование с возможностью чтения и записи позволяет процессам контейнера изменять файлы хоста. Держите монтирование узким, избегайте монтирования домашнего каталога или сокета Docker и не запускайте обработчик преобразования документов с ненужными привилегиями.
Команда запуска передает исходный файл в soffice, ограничивая при этом доступ хоста к двум папкам проекта.
4. Убедитесь, что PDF-файл создан.
Проверьте выходной каталог хоста после завершения работы Docker:
ls -l output/
file output/report.pdf
test -s output/report.pdf
PDF-файл должен существовать и быть непустым. Откройте его в программе для чтения PDF-файлов и проверьте количество страниц, таблицы, изображения, разрывы страниц и шрифты, прежде чем полагаться на него. Успешное завершение процесса не доказывает, что каждый элемент отображен должным образом, особенно если документ использует шрифты или функции, недоступные в контейнере. Используйте чистую директорию для вывода или новое имя выходного файла для каждого запуска, чтобы старый PDF-файл нельзя было принять за последний преобразованный.
Убедитесь, что выходной файл существует и распознается как PDF, затем проверьте страницы на предмет изменений в макете.
Что следует проверить, если преобразование не удалось?
Нет выходного файла: подтвердите имя исходного файла и путь к контейнеру, который inputбыл смонтирован в /input, и убедитесь, что каталог хоста outputдоступен для записи выбранным пользователем.
Ошибки профиля или блокировки: убедитесь, что -env:UserInstallationпуть доступен для записи. Используйте отдельный каталог профиля для каждого одновременно запущенного процесса LibreOffice.
Измененная верстка: установите необходимые шрифты на изображение и просмотрите PDF-файл. Отображение может отличаться от отображения в настольной системе из-за доступности шрифтов, фильтров экспорта и различий в версиях.
Ошибка монтирования Docker: убедитесь, что обе директории хоста существуют, прежде чем использовать -vили --mount, и убедитесь, что демон может получить к ним доступ.