首页 > 解决方案 > 将 libreoffice 作为服务运行

问题描述

我正在构建一个 Web 应用程序,除其他外,它执行文件从格式docpdf格式的转换。

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

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

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

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

经过一番研究,我找到了一个名为jodconverter. 从中,我可以jodconverter-cli用来转换文件。转换工作,但不幸的是在转换完成后jodconverter会停止libreoffice服务器(有一个未解决的问题)。我看不到关闭这种行为的方法。

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

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

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

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

标签: weblibreofficeopenoffice.orgfile-conversionuno

解决方案


我最终提出了一个并行启动多个实例的建议。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 上一个名为“并行转换和同步”的问题的长时间讨论中发现的。


推荐阅读