php - LibreOffice同时从DOCX生成PDF文件

时间:2017-12-07 07:21:13

标签: php libreoffice

我有一个问题,当我使用LibreOffice(soffice.exe)同时转换2个docx文件时,LibreOffice会挂起。同时转换xslx(Excel)文件时不会发生这种情况。

我的代码:

exec("C:/LibreOfficePortable/App/libreoffice/program/soffice.exe -headless -convert-to pdf:writer_pdf_Export -outdir C:\convertTest\ C:\convertTest\l06.docx");

exec("C:/LibreOfficePortable/App/libreoffice/program/soffice.exe -headless -convert-to pdf:writer_pdf_Export -outdir C:\convertTest\ C:\convertTest\l07.docx");

我已经做了一些挖掘,我认为这可能是因为LibreOffice生成的临时文件在同时转换2个docx文件时具有相同的名称,因此它会失控。这只是一个假设。

我需要修复或替代LibreOffice。

感谢。

1 个答案:

答案 0 :(得分:0)

不要同时转换两个文件。

我过去所做的是让PHP脚本将文件放在轮询目录中。编写一个daemon(可能是一个简单的shell脚本或更复杂的东西,如Java),它会轮询该目录以查找传入的作业,当它看到作业时,它会一次一个地将它们提供给LibreOffice,并将结果发送到输出目录。

同时,PHP脚本在输出目录中等待结果。

另一种选择是将文件用作lock。 PHP脚本将在运行作业之前创建一个0字节的文件。如果该文件已存在,请在使用LibreOffice进行转换之前等待它消失,因为另一个作业可能正在运行。转换后,删除该文件,以便下一个作业可以运行。

根据链接:

  

PHP提供了基于文件的锁定以及pthreads扩展中的Mutex类。

根据我的经验,使用锁定文件是一个脆弱的设置,因为如果一个作业出错,一切都会被卡住。但是,Java守护程序可以使用线程编程,这样如果出现问题,它仍然可以继续运行。

LibreOffice主要用于用户交互。我相信有一些基于命令行的工具可用于进行此类转换,但我没有任何经验。