Web 将libreoffice作为服务运行
我正在构建一个web应用程序,其中包括将文件从Web 将libreoffice作为服务运行,web,libreoffice,openoffice.org,file-conversion,uno,Web,Libreoffice,Openoffice.org,File Conversion,Uno,我正在构建一个web应用程序,其中包括将文件从doc转换为pdf格式 我一直在使用安装在同一台服务器上的LibreOffice和我的web应用程序。通过从我的web应用程序的代码中取出并调用libreofficebinary,我能够成功地转换文档 问题:当我的web应用程序在很短的时间内(例如毫秒)收到多个用于doc->pdf转换的HTTP请求时,调用libreoffice无法一次启动多个实例。这会导致某些文件成功转换,而有些文件则无法成功转换 我认为解决这个问题的办法是: 启动libreoff
doc
转换为pdf
格式
我一直在使用安装在同一台服务器上的LibreOffice和我的web应用程序。通过从我的web应用程序的代码中取出并调用libreoffice
binary,我能够成功地转换文档
问题:当我的web应用程序在很短的时间内(例如毫秒)收到多个用于doc->pdf转换的HTTP请求时,调用libreoffice
无法一次启动多个实例。这会导致某些文件成功转换,而有些文件则无法成功转换
我认为解决这个问题的办法是:
libreoffice
服务一次,确保它接受连接libreoffice
服务交谈,要求其执行文件格式转换libreoffice
API请求)来实现jodconverter cli
转换文件。转换工作正常,但不幸的是,jodconverter
将在执行转换后停止libreoffice
服务器(这方面存在漏洞)。我看不出有什么办法可以阻止这种行为
或者,我正在考虑以下选项:
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上一个名为“.”的问题的长时间讨论中发现了该建议本身。JODConverter项目提供了3个示例项目,它们是处理转换请求的web应用程序。有关更多信息,请参阅。这3个样本使用的是,而不是 在使用Java库时,您可以通过设置“多个”在应用程序启动时启动多个office进程 上面的例子可以同时处理4次转换。JODConverter管理一个内部office进程池,您可以根据需要选择一些选项 因此,根据您的描述,我认为您可以使用配置正确的JODConverter。而且它可能会提高应用程序的性能,因为libreoffice不会为每次转换启动
我不熟悉Elixir,但可能会有所帮助?我在尝试构建涉及 将pptx转换为pdf。libreoffice似乎无法处理并发事务 请求很好。有些请求将失败而没有结果。我的解决办法是 使pptx to pdf进程成为一个单独的服务,并将其部署到多个 码头集装箱。当请求到来时,我们会将请求分发给
这些容器。它适用于我们的用例。如果你是指docx格式,你可以试试pandoc wrappers for Elixir。这个解决方案对我来说非常有用,因为我已经在临时文件夹中生成了需要转换的文档。。。只是把它传递给这个参数,我就不再出现神秘的错误了。不过请注意,这种方法增加了运行时间(在我的系统上是2秒)。如果您已经拥有用户配置文件,您可以将其复制到所需的文件夹中,这样可以避免额外的运行时间。复制@SebastianKreft?Yo可以加快速度,您需要复制有效的用户配置文件。假设您使用选项
-env:UserInstallation运行libreoffice=file:///tmp/libreoffice
,它将创建文件夹/tmp/libreoffice/user
。这是您可以复制的用户配置文件。
// 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();