【发布时间】:2017-05-09 14:28:22
【问题描述】:
您好,我有一个在特定用户(app.pool 用户)下运行的 c# MVC 应用程序。 我需要将 doc 或 docx 文件转换为 pdf。
我认为一个不错的选择是使用 libreoffice 来启动一个进程来启动它。
为了让我自己的生活更轻松(如果 libreoffice 不应该工作)我使用了一个批处理文件。
echo on
SET var1=%2
IF "%var1:~-1%"=="\" SET var1=%var1:~0,-1%
cd %var1%
echo %1
echo %var1%
start /wait "" "C:\Program Files (x86)\LibreOffice 4\program\soffice" -headless -convert-to pdf %1 -outdir %var1%
我的启动代码如下。
var ba = @"C:\inetpub\wwwroot\apps\xxxxxxxxx\Services\convert.bat";
fullPath = @"C:\inetpub\wwwroot\apps\xxxxxxxxx\Files\Temp\636295920370843147.doc";
var tempPath = @"C:\inetpub\wwwroot\apps\xxxxxxxxx\Files\Temp";
string command = ba;
//Process.Start(command, fullPath + " " + tempPath);
var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command + " "+ fullPath+ " "+ tempPath);
processInfo.CreateNoWindow = false;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
var process = Process.Start(processInfo);
process.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
Trace.WriteLine("output>>" + e.Data);
process.BeginOutputReadLine();
process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
Trace.WriteLine("error>>" + e.Data);
process.BeginErrorReadLine();
process.WaitForExit();
Trace.WriteLine("ExitCode: {0}", process.ExitCode.ToString());
process.Close();
这似乎确实可以手动工作,但是当我运行代码时,我可以看到整个事情只是在转换过程中停滞不前。查看线程,它似乎加载了 gdiplus.dll,我认为这是一个看起来不正确的图形模块。
当我将其复制并粘贴到 Windows 中的“运行”框中时,该过程可以正常工作并且制作了 pdf。
我检查了 app.pool 用户是否可以访问 libreoffice 以及包含文件的文件夹。
我以 app.pool 用户身份运行它,在 c# 中它只是停在process.WaitForExit();
线。直到我终止进程。
有什么想法吗?
我也尝试了许多不同的方式来执行 soffice 转换。直接来自 c# - libreoffice 4,5。
我看到有人将 libreoffice 用作服务,这是一种选择吗?如果有怎么办? 理查德
编辑 啊,刚刚将应用程序池用户更改为我自己,现在它可以工作了,所以标准应用程序池用户存在权限问题。如何找出什么....
【问题讨论】:
标签: pdf libreoffice iis