Запуск libreoffice как службы - PullRequest
       112

Запуск libreoffice как службы

0 голосов
/ 30 января 2020

Я создаю веб-приложение, которое, помимо прочего, выполняет преобразование файлов из doc в pdf формат.

Я использовал LibreOffice, установленный на том же сервере вместе с мое веб-приложение. Выдавая и вызывая двоичный код libreoffice из кода моего веб-приложения, я могу успешно конвертировать документы.

Проблема : когда мое веб-приложение получает несколько HTTP-запросов на выполнение c -> преобразование pdf в течение очень короткого периода времени (например, в миллисекундах), при вызове libreoffice не удается запустить несколько экземпляров одновременно. Это приводит к тому, что некоторые файлы успешно преобразуются, а некоторые нет.

Решение этой проблемы, как я вижу, будет следующим:

  1. запустите libreoffice службу один раз, сделайте если он принимает подключения,
  2. при обработке HTTP-запросов в моем веб-приложении, обратитесь к работающей службе libreoffice, запрашивающей его выполнить преобразование формата файла,
  3. упрощение "разговорной" части через оболочку некоторому инструменту CLI или с помощью других средств, таких как отправка libreoffice запросов API в файл порта или сокета).

После небольшого исследования я нашел инструмент CLI под названием jodconverter. Из него я могу использовать jodconverter-cli для конвертации файлов. Преобразование работает, но, к сожалению, jodconverter остановит сервер libreoffice после выполнения преобразования (об этом есть открытая проблема ). Я не вижу способа отключить это поведение.

В качестве альтернативы я рассматриваю следующие варианты:

  1. в моем веб-приложении, убедитесь, что все преобразования выполнены запросы ставятся в очередь; это явно побеждает параллелизм, например, моим пользователям придется ждать конвертации своих файлов,

  2. исследовать дальше и использовать что-то под названием UNO , однако для этого нет привязки для язык, который я использую (Elixir), и я не могу найти способ создать полезную нагрузку UNO вручную.

Как я могу использовать libreoffice как сервис, использующий UNO

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Проект JODConverter предлагает 3 примера проектов, которые являются веб-приложениями, обрабатывающими запросы на конвертацию. См. здесь для получения дополнительной информации. Эти 3 примера используют Java Библиотека вместо Инструмент командной строки

При использовании библиотеки Java вы можете запускать несколько офисных процессов при запуске приложения путем установки нескольких номеров портов .

// This example will use 4 TCP ports, which will cause
// JODConverter to start 4 office processes when the
// OfficeManager will be started.
OfficeManager officeManager =
    LocalOfficeManager.builder()
        .portNumbers(2002, 2003, 2004, 2005)
        .build();

В приведенном выше примере можно будет обрабатывать 4 преобразования одновременно. JODConverter управляет внутренним пулом офисных процессов, и вы можете настроить некоторые параметры в соответствии с вашими потребностями.

Итак, согласно вашему описанию, я думаю, что вы можете использовать JODConverter с правильной конфигурацией. И это, вероятно, повысит производительность вашего приложения, поскольку libreoffice не будет запускаться для каждого преобразования.

Я не знаком с Elixir, но, возможно, этот может помочь?

0 голосов
/ 03 февраля 2020

В итоге я получил совет для параллельного запуска многих libreoffice экземпляров. Это работает путем добавления -env:UserInstallation=file:///tmp/... переменной командной строки:

libreoffice -env:UserInstallation=file:///tmp/delete_me_#{timestamp} \
            --headless \
            --convert-to pdf \
            --outdir /tmp \
            /path/to/my_file.doc

Сам совет был замечен в долгом обсуждении проблемы на GitHub под названием " Параллельные преобразования и синхронизация ".

...