在 mvc c# 环境中将文档转换为 pdf
Converting a doc to a pdf in a mvc c# environment
您好,我在特定用户(app.pool 用户)下有一个 c# MVC 应用程序 运行ning。
我需要将 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\Temp6295920370843147.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 中的 'run' 框中时,该过程运行良好,并且制作了 pdf。
我检查过 app.pool 用户可以访问 libreoffice 以及包含文件的文件夹。
我有 运行 作为 app.pool 用户,在 c# 中它只是停在 process.WaitForExit();
线。直到我杀掉进程。
有什么想法吗?
我还尝试了许多 种不同的方式来执行办公室转换。直接来自 c# - libreoffice 4,5。
我看到有些人使用 libreoffice 作为服务,这是一个选项吗?如果是这样怎么办?
理查德
编辑
啊,刚刚将应用程序池用户更改为我自己,现在它可以工作了,所以标准应用程序池用户有一个权限问题。如何找出什么....
我把用户加到电脑的administrators组,重启机器,就可以了。
这可能不是最好的解决方案,但经过 2 天的尝试,我不会争论。
理查德
您好,我在特定用户(app.pool 用户)下有一个 c# MVC 应用程序 运行ning。 我需要将 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\Temp6295920370843147.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 中的 'run' 框中时,该过程运行良好,并且制作了 pdf。
我检查过 app.pool 用户可以访问 libreoffice 以及包含文件的文件夹。
我有 运行 作为 app.pool 用户,在 c# 中它只是停在 process.WaitForExit();
线。直到我杀掉进程。
有什么想法吗?
我还尝试了许多 种不同的方式来执行办公室转换。直接来自 c# - libreoffice 4,5。
我看到有些人使用 libreoffice 作为服务,这是一个选项吗?如果是这样怎么办? 理查德
编辑 啊,刚刚将应用程序池用户更改为我自己,现在它可以工作了,所以标准应用程序池用户有一个权限问题。如何找出什么....
我把用户加到电脑的administrators组,重启机器,就可以了。
这可能不是最好的解决方案,但经过 2 天的尝试,我不会争论。
理查德