php - Docx 到 pdf 使用 openoffice headless 方式太慢

标签 php python pdf-generation docx headless

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

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

但是有一个(坏的)问题。在服务器上这需要大约 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() 操作期间进行无用的测试?

欢迎任何想法。 :)

最好的问候,不安

最佳答案

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

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 的权限??

关于php - Docx 到 pdf 使用 openoffice headless 方式太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5504308/

相关文章:

php - 在php中自动执行链接

javascript - 为什么我无法从单选按钮获取值?

Python字符串删除十六进制代码,如 'president trump\\xe2\\x80\\x99s'

c# - 使用ABCPDF在内存中生成文档,而不是保存在物理驱动器上

c# - 主要内容重叠在页 footer 分 PDF 文档 iTextSharp

c# - 从一组 JPEG 生成 PDF

php - 无法将字符串或日期时间对象插入 mysql

php - 在PHP中为函数返回逻辑错误的最佳实践是什么

Python Azure Durable Functions : how to change the local. settings.json 文件可从 Azure Keyvault 读取 secret ?

python - PySpark:将 PythonRDD 附加/合并到 PySpark 数据框