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

时间:2011-03-31 18:06:34

标签: php python pdf-generation docx headless

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

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

但是有一个(坏)问题。在服务器上这需要大约21秒才能完成,而在我的机器上它不需要超过2。:( 这对我的需求来说太多了,所以我一直试图发现可能导致这种延迟的原因。 在套接字创建的healess模式下启动openoffice是可以的。 所以我一直在查看python脚本试图找出可能导致减速的指令。我把它缩小到这条线:

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

这是需要大约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)

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

欢迎任何想法。 :)

祝福,不安分

3 个答案:

答案 0 :(得分:4)

我设法通过使用管道而不是套接字来消除延迟。

context = resolver.resolve("uno:pipe,name=myuser_OOffice;urp;StarOffice.ComponentContext")

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

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

我从中得不到任何东西......我不明白为什么。也许运行exec()的用户(www-data)没有执行sudo的权限?

答案 1 :(得分:2)

也许服务器上的名称解析器不知道localhost(这将是非常奇怪的,但20秒听起来像DNS超时)。您可以尝试将其替换为127.0.0.1

或者,也许它正在进行查找正常,同时获取localhost的IPv6和IPv4地址,尝试通过IPv6建立连接并失败(即组件可能不支持IPv6,或者不绑定到默认情况下该接口)然后才回退到IPv4。在这种情况下,补救措施将是相同的:将localhost替换为127.0.0.1

答案 2 :(得分:2)

遗憾的是,openoffice非常繁重。我也在考虑它,但后来我找到了更轻松的解决方案。

我必须从上传的文档中生成4个第一页的预览。这就是我所做的:

abiword document.doc --to=ps --exp-props="pages:1-4"
gs -q -dNOPAUSE -dBATCH -dTextAlphaBits=4  -dGraphicsAlphaBits=4 -r72 -sDEVICE=pnggray -sOutputFile=preview%d.png document.ps

所以你可能会得到最近的abiword并尝试这样的事情:

abiword document.docx --to=pdf