8

我一直在使用 PHPWord 生成 docx 文件。而且效果很好。但现在我还需要在 pdf 版本中提供其中一些文件。

经过一些研究,我发现了使用 OOo的PyODConverter 。似乎是一个不错的选择,因为我不想依赖第三方网络服务。我在我的机器上试用了它,它工作正常,所以我也将它应用到我的服务器上。它花了一点时间,但我也设法让它在那里工作。

然而,有一个(坏的)问题。在服务器上完成它大约需要 21 秒,而在我的机器上它不会超过 2 秒。:( 这对我的需求来说太长了,所以我一直在试图找出可能导致这种情况的原因延迟。以创建套接字的无故障模式启动 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() 操作期间导致无用的测试?

欢迎任何想法。:)

最好的问候,不安分

4

3 回答 3

6

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

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

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

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

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

于 2011-04-05T10:39:26.623 回答
2

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

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

于 2011-03-31T18:17:19.793 回答
2

可惜openoffice这么重。我也在考虑它,但后来我找到了更轻的解决方案,即 abiword。

我必须从上传的文档中生成 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
于 2011-03-31T18:54:18.043 回答