Web 将libreoffice作为服务运行

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

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

我一直在使用安装在同一台服务器上的LibreOffice和我的web应用程序。通过从我的web应用程序的代码中取出并调用
libreoffice
binary,我能够成功地转换文档

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

我认为解决这个问题的办法是:

  • 启动
    libreoffice
    服务一次,确保它接受连接
  • 在我的web应用程序中处理HTTP请求时,与正在运行的
    libreoffice
    服务交谈,要求其执行文件格式转换
  • “对话”部分可以通过向某个CLI工具发送命令或通过其他方式(如向端口或套接字文件发送
    libreoffice
    API请求)来实现
  • 经过一番研究,我发现了一个名为的CLI工具。从中,我可以使用
    jodconverter cli
    转换文件。转换工作正常,但不幸的是,
    jodconverter
    将在执行转换后停止
    libreoffice
    服务器(这方面存在漏洞)。我看不出有什么办法可以阻止这种行为

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

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

  • 进一步研究并使用一种叫做“Elixir”的东西,但是我正在使用的语言没有绑定(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上一个名为“.”的问题的长时间讨论中发现了该建议本身。

    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();