【问题标题】:Running libreoffice as a service将 libreoffice 作为服务运行
【发布时间】:2020-05-16 03:39:07
【问题描述】:

我正在构建一个 Web 应用程序,其中包括将文件从 doc 转换为 pdf 格式。

我一直在使用安装在同一台服务器上的 LibreOffice 以及我的 Web 应用程序。通过从我的网络应用程序的代码中取出并调用libreoffice 二进制文件,我能够成功地转换文档。

问题:当我的 web 应用程序在很短的时间(例如毫秒)内收到多个 doc->pdf 转换的 HTTP 请求时,调用 libreoffice 无法同时启动多个实例.这会导致一些文件被成功转换,而另一些则没有。

我认为这个问题的解决方案是这样的:

  1. 启动libreoffice服务一次,确保它接受连接,
  2. 在我的 Web 应用程序中处理 HTTP 请求时,与正在运行的 libreoffice 服务通信,要求它执行文件格式转换,
  3. “谈话”部分可以通过使用某些 CLI 工具或通过其他方式(例如向端口或套接字文件发送 libreoffice API 请求)来实现。

经过一番研究,我发现了一个名为 jodconverter 的 CLI 工具。从中,我可以使用jodconverter-cli 来转换文件。转换工作,但不幸的是jodconverter 将在转换完成后停止libreoffice 服务器(有一个开放的issue 关于那个)。我看不到关闭此行为的方法。

或者,我正在考虑以下选项:

  1. 在我的网络应用程序中,确保所有转换请求都已排队;这显然会破坏并发性,例如我的用户将不得不等待他们的文件被转换,

  2. 进一步研究并使用名为 UNO 的东西,但是我使用的语言 (Elixir) 没有绑定,而且我似乎看不到手动构建 UNO 有效负载的方法。

    李>

如何使用 UNO 将libreoffice 用作服务?

【问题讨论】:

  • 如果你指的是 docx 格式,你可以试试 Elixir 的 pandoc 包装器。

标签: web libreoffice openoffice.org file-conversion uno


【解决方案1】:

我最终选择了an advice 来并行启动许多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 上一个名为“Parallel conversions and synchronization”的问题的长时间讨论中发现的。

【讨论】:

  • 这个解决方案对我来说很有效,因为我已经在临时文件夹中生成需要转换的文档......只是将它传递给这个参数,我就不再遇到神秘错误了。
  • 请注意,这种方法会增加运行时间(在我的系统上为 2 秒)。如果您已经有用户配置文件,则可以将其复制到所需的文件夹,这样可以避免额外的运行时间。
  • 复制什么@SebastianKreft?
  • 哟加快速度,您需要复制有效的用户配置文件。假设您使用选项-env:UserInstallation=file:///tmp/libreoffice 运行libreoffice,它将创建文件夹/tmp/libreoffice/user。这就是您可以复制的用户配置文件。
【解决方案2】:

JODConverter 项目提供了 3 个示例项目,它们是处理转换请求的 Web 应用程序。请参阅here 了解更多信息。这 3 个示例使用 Java Library 而不是 Command Line Tool

使用Java库时,可以通过设置多个port numbers在应用启动时启动多个office进程。

// 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 管理内部的办公流程池,您可以根据自己的需要configure 一些选项。

所以,根据您的描述,我认为您可以通过正确的配置使用 JODConverter。而且它可能会提高您的应用程序的性能,因为每次转换都不会启动 libreoffice。

我对 Elixir 不熟悉,但也许 this 有帮助?

【讨论】:

    【解决方案3】:

    我在尝试构建涉及的 Web 服务时遇到了与您相同的问题 将pptx转换为pdf。似乎 libreoffice 无法处理并发 要求很好。一些请求将失败而没有结果。我的解决方案是 使 pptx to pdf 进程成为一个单独的服务,并将其部署到多个 码头集装箱。当请求到来时,我们会将请求分发给 这些容器。它适用于我们的用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多