我正在使用LibreOffice作为将docx转换为pdf的命令行。我正在使用以下代码段。
using (Process pdfprocess = new Process())
{
pdfprocess.StartInfo.UseShellExecute = true;
pdfprocess.StartInfo.LoadUserProfile = true;
pdfprocess.StartInfo.FileName = "soffice.exe";
pdfprocess.StartInfo.Arguments = "-norestore -nofirststartwizard -headless -convert-to pdf C:\\test.docx";
pdfprocess.StartInfo.WorkingDirectory = @"C:\Program Files\LibreOffice\program\";
pdfprocess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
pdfprocess.Start();
if (!pdfprocess.WaitForExit(1000 * 60 * 1)) {
pdfprocess.Kill();
}
pdfprocess.Close();
}
一切都可以在IISExpress或控制台应用程序下正常运行。当我尝试在IIS服务器下运行时,它不起作用。
我正在DefaultAppPool
下运行,并且我已授予DefaultAppPool
访问LibreOffice目录的权限,但是我无法获得结果。
出于安全考虑,我不想将身份更改为LocalSystem
。
如何在默认soffice.exe
下使用Process.Start()运行ApplicationPoolIndentity
?
答案 0 :(得分:1)
我遇到了同样的问题,我只是found个对我有用的解决方案。当我在CMD控制台上执行转换时,一切工作正常。但是在iis应用程序下执行的soffice.exe无法正常工作。
尽管,应用程序池具有它自己的用户配置文件目录,看起来libreoffice无法在此处创建其文件。我所做的是在iis www目录下创建了temp文件夹,并为其分配了apppool权限。然后,我使用其他参数传递了该位置,例如:“ -env:UserInstallation = file:/// C:/ www / temp / libreoffice”
答案 1 :(得分:0)
有同样的问题。问题在于该过程已启动,但没有退出,也没有给出结果,没有任何StandardError输出。绝对是权限问题。所以我开始了procmon,它向我展示了它需要访问以下路径:
C:\Windows\SysWOW64\config\systemprofile\AppData\Roaming\LibreOffice
在这里看起来类似问题: Why does systemprofile need Desktop folder to open excel file
因此从安全性的角度来看不确定下一步该怎么做,但是解决方案是为ApplicationPoolUser提供对该文件夹的访问权限。
已更新:
看起来它不适用于所有文档,即使在我从Procmon中消除了其他docx文件的所有“访问拒绝”问题之后,“办公室”仍然卡住,并且我无法从任务管理器中终止进程,但仍显示“访问被拒绝”对话框。看起来它取决于某些字体,它打开了某些东西,并且由于保留了它,因此无法关闭进程,并且没有其他文件可以继续。