【问题标题】:PDF Creation using Diagnostics.Process and Wkhtmltopdf slow on server在服务器上使用 Diagnostics.Process 和 Wkhtmltopdf 创建 PDF 速度慢
【发布时间】: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


    【解决方案1】:

    好吧,终于明白了,与代码完全无关。事实证明,我尝试转换的 HTML 包含指向实时网站上图像的链接。虽然可以从我的本地计算机访问该网站,但无法从服务器访问该网站。因此,由于尝试访问无法访问的图像超时而导致时间延迟。

    哇!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 2014-01-06
      • 2018-05-12
      • 2013-12-25
      • 2016-07-08
      相关资源
      最近更新 更多