Docx to pdf使用openoffice无头方式太慢了

Res*_*ess 7 php python pdf-generation docx headless

我一直在使用PHPWord生成docx文件.它一直很好用.但是现在我还需要在pdf版本上提供一些这些文件.

经过一些研究后,我发现了使用OOo的PyODConverter.似乎是一个很好的选择,因为我不想依赖第三方Web服务.我在我的机器上尝试了它并且它被罚款,所以我也在我的服务器上应用它.花了一点时间,但我也设法让它在那里工作.

然而,有一个(坏)问题.在服务器上这需要大约21秒来完成它,而在我的机器上它不需要超过2 :(这是太多的时间来满足我的需求所以我一直试图发现可能导致这个问题的原因使用套接字创建在healess模式下启动openoffice是可以的.所以我一直在查看python脚本试图找出哪条指令可能导致速度减慢.我已将它缩小到这一行:

context = resolver.resolve("uno:socket,host=127.0.0.1,port=8100;urp;StarOffice.ComponentContext")
Run Code Online (Sandbox Code Playgroud)

这是需要大约20秒执行的操作.插入的代码:

localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
try:
    context = resolver.resolve("uno:socket,host=127.0.0.1,port=8100;urp;StarOffice.ComponentContext")
except NoConnectException:
    raise DocumentConversionException, "failed to connect to OpenOffice.org on port %s" % port
self.desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)
Run Code Online (Sandbox Code Playgroud)

什么可能导致这种延迟的线索?我已经排除了我试图转换的文档,因为此操作发生在此之前.这可能是'uno'的问题吗?或者可能是另一个丢失的库,可能会在resolve()操作期间导致无用的测试?

欢迎任何想法.:)

最好的问候,不安分

Res*_*ess 5

我设法通过使用管道代替套接字进行连接来消除延迟。

context = resolver.resolve("uno:pipe,name=myuser_OOffice;urp;StarOffice.ComponentContext")
Run Code Online (Sandbox Code Playgroud)

我仍然有一个问题...执行python脚本的用户必须与启动OOo的用户相同才能使一切正常运行。通常这不是什么大问题,但是我正在尝试从Web应用程序执行python,但我仍然没有设法使其正常工作。我正在尝试这样的事情:

exec('sudo -u#1000 -s python path/to/DocumentConverter.py filename.docx filename.pdf');
Run Code Online (Sandbox Code Playgroud)

我对此一无所获..我不明白为什么。也许运行exec()的用户(www-data)没有执行sudo的权限?

  • 就是这样 我将www-data设置为sudoer,现在一切正常。感谢所有尝试提供帮助的人。:) (2认同)