将 libreoffice 作为服务运行

gmi*_*ile 2 openoffice.org file-conversion uno libreoffice web

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

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

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

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

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

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

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

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

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

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

gmi*_*ile 7

我最终提出libreoffice并行启动多个实例的建议。这通过添加-env:UserInstallation=file:///tmp/...命令行变量来实现:

libreoffice -env:UserInstallation=file:///tmp/delete_me_#{timestamp} \
            --headless \
            --convert-to pdf \
            --outdir /tmp \
            /path/to/my_file.doc
Run Code Online (Sandbox Code Playgroud)

该建议本身是在对 GitHub 上一个名为“并行转换和同步”的问题的长时间讨论中发现的。