【发布时间】:2018-11-29 09:44:13
【问题描述】:
人,
我正在使用 System.Diagnostics.Process 中的 wkhtmltopdf 在 .NET 应用程序中生成 PDF 文件
虽然这个过程大约需要。一旦部署到服务器并使用相同的数据,大约需要 1 秒才能在我的本地计算机(Win 10 Pro 16gb 内存)上运行。服务器上 40 秒(win server 2012 8gb mem)。两种情况下生成的 PDF 文件只有大约 34kb。
在每个代码行上运行了一些诊断时间,我发现正是这一行花费了所有时间。
if (!process.WaitForExit(120000))
我已尝试更改输出文件夹的权限并更改输出文件夹。我还更改了 IIS 应用程序池上的标识。 由于性能差异如此之大,我不相信这是代码问题只是配置。任何人都可以对此有所了解。 下面略缩略的代码 我还应该提到,我已经在服务器上运行了 procmon,而在最初加载程序后运行 at 似乎做得很少。
var temp = HttpContext.Current.Server.MapPath("~//temppdf//")
var outputPdfFilePath = Path.Combine(temp,
String.Format("{0}.pdf", Guid.NewGuid()));
document.Url = "-";
ProcessStartInfo si;
StringBuilder paramsBuilder = new StringBuilder();
paramsBuilder.Append("--page-size A4 ");
paramsBuilder.Append("--zoom 1.000 ");
paramsBuilder.Append("--disable-smart-shrinking ");
paramsBuilder.AppendFormat("\"{0}\" \"{1}\"", document.Url, outputPdfFilePath);
si = new ProcessStartInfo();
si.CreateNoWindow = false;
si.FileName = environment.WkHtmlToPdfPath; //path to exe in programs file(x86)
si.Arguments = paramsBuilder.ToString();
si.UseShellExecute = false;
si.RedirectStandardError = false;
si.RedirectStandardInput = true;
try
{
using (var process = new Process())
{
process.StartInfo = si;
process.Start();
if (document.Html != null)
using (var stream = process.StandardInput)
{
byte[] buffer = Encoding.UTF8.GetBytes(document.Html);
stream.BaseStream.Write(buffer, 0, buffer.Length);
stream.WriteLine();
}
if (!process.WaitForExit(120000))
throw new PdfConvertTimeoutException();
// THis above command takes 1 sec locally and 42 secs on server
}
}
finally
{
if (delete && File.Exists(outputPdfFilePath))File.Delete(outputPdfFilePath);
}
【问题讨论】:
标签: pdf wkhtmltopdf system.diagnostics