web - 将 libreoffice 作为服务运行
问题描述
我正在构建一个 Web 应用程序,除其他外,它执行文件从格式doc
到pdf
格式的转换。
我一直在使用与我的 Web 应用程序一起安装在同一台服务器上的 LibreOffice。通过libreoffice
从我的网络应用程序的代码中提取和调用二进制文件,我能够成功地转换文档。
问题:当我的 Web 应用程序在很短的时间(例如毫秒)内收到多个 doc->pdf 转换的 HTTP 请求时,调用libreoffice
无法一次启动多个实例。这会导致某些文件被成功转换,而有些则不是。
我认为这个问题的解决方案是这样的:
- 启动
libreoffice
服务一次,确保它接受连接, - 在我的 Web 应用程序中处理 HTTP 请求时,与正在运行的
libreoffice
服务交谈,要求它执行文件格式转换, - “谈话”部分将通过使用某些 CLI 工具或通过其他方式(如将
libreoffice
API 请求发送到端口或套接字文件)来促进。
经过一番研究,我找到了一个名为jodconverter
. 从中,我可以jodconverter-cli
用来转换文件。转换工作,但不幸的是在转换完成后jodconverter
会停止libreoffice
服务器(有一个未解决的问题)。我看不到关闭这种行为的方法。
或者,我正在考虑以下选项:
在我的网络应用程序中,确保所有转换请求都已排队;这显然会破坏并发性,例如我的用户将不得不等待他们的文件被转换,
进一步研究并使用称为UNO的东西,但是我使用的语言(Elixir)没有绑定,我似乎看不到手动构建 UNO 有效负载的方法。
如何libreoffice
使用 UNO 将其用作服务?
解决方案
我最终提出了一个并行启动多个实例的建议。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 上一个名为“并行转换和同步”的问题的长时间讨论中发现的。
推荐阅读
- c# - 如何检查是否未分配 lambda 表达式?
- excel - 使用 VBA 循环遍历定义的子文件夹
- c - C 程序不会打印行,已尝试刷新
- go - 分叉存储库上的“go build”问题
- fpga - Zynq + Microblaze 通过智能互连共享 DDR 内存
- regex - 正则表达式替换日期时间格式之间的时间值
- php - 调用未定义的方法 Poll::updatePoll()
- tensorflow - 在低级张量流的上下文中,“嵌入”是什么意思?
- java - android中的计时器类还是处理程序计时器?
- c++ - 如何从重载的下标 [] 运算符返回 std::unique_ptr&?