使用soffice.exe 5.4.6中的LibreOffice将Word文档转换为PDF有问题--通过IIS在Windows 2012 R2上运行。
在将目录转换为PHP (chdir)中的相关LibreOffice程序目录后,我在PHP中调用的命令是:
$cmd = "soffice.exe --headless -convert-to pdf -outdir ".sys_get_temp_dir()." ".$workingdoc;
exec($cmd);其中$workingdoc是.docx Word文件的完整路径。
我的系统上的sys_get_temp_dir()转换为C:\Windows\Temp
如果我将$cmd变量回显到浏览器,然后将输出复制粘贴到服务器上的cmd.exe命令提示符中,就会生成PDF,而不会出现问题。
例如,我复制粘贴到cmd.exe提示符中的回显cmd.exe可能是:
soffice.exe --headless -convert-to pdf -outdir C:\Windows\TEMP C:\Windows\Temp\pdD125.docx但是,通过exec()从PHP中运行这个$cmd变量的用户上下文与我通过挂起的交互启动cmd.exe的内容相同。我可以在任务管理器中看到soffice.exe,内存使用量在10-20MB之间徘徊。此外,在我的C:\Windows\Temp文件夹中,在soffice.exe保持运行时,我每秒钟都会连续创建多个空文件夹,这些文件夹的名称都是lu*.tmp格式的。
例如,生成的许多文件夹之一是lu1124fq1pud.tmp
PDF不被创建,允许PHP脚本完成并停止创建lu文件夹(除了PHP之外)的唯一方法是在task中强制结束soffice.exe任务。
那么,为什么soffice.exe命令在从cmd.exe调用时工作,而不是通过cmd.exe调用,即使这两种方法都是在同一个用户上下文中启动的?
发布于 2018-10-15 03:12:32
事实证明,这是一个众所周知的问题,被称为在此报道。简而言之,这似乎是一个用户权限问题。
我解决了我的问题,首先在系统的临时目录中创建了一个临时的LibreOffice用户配置文件文件夹(不要创建目录,允许soffice.exe初始化它):
$tempLibreOfficeProfile = sys_get_temp_dir()."\\LibreOfficeProfile".rand(100000, 999999);然后向soffice.exe命令中添加env参数:
$cmd = 'soffice "-env:UserInstallation=file:///'.str_replace("\\", "/", $tempLibreOfficeProfile).'" --headless --convert-to pdf -outdir "'.sys_get_temp_dir().'" '.$workingDoc;
exec($cmd);在临时配置文件文件夹完成后一定要清除,以避免阻塞您的临时文件夹,例如:
exec('rmdir /S /Q "'.$tempLibreOfficeProfile.'"');https://stackoverflow.com/questions/50250739
复制相似问题