wkhtmltopdf «Доступ запрещен» в System.Diagnostics.Process.StartWithCreateProcess (ProcessStartInfo startInfo) - PullRequest
0 голосов
/ 31 января 2020

Использовал wkhtmltopdf для генерации pdf, он работает нормально, но иногда выдает «Отказано в доступе» в System.Diagnostics.Process.StartWithCreateProcess (ProcessStartInfo startInfo). Например: в одном go он генерирует 20 файлов, из которых для одного pdf-файла он выбрасывает «Отказано в доступе» и remianing 19 генерируются нормально. И в большинстве случаев все PDF генерируются нормально. Что делать в этом случае.

 public byte[] WKHtmlToPdf(string url)
    {
        var fileName = string.Format("{0}.pdf", Guid.NewGuid());
        //var wkhtmlDir = "C:\\Program Files\\wkhtmltopdf\\";
        //var wkhtml = "C:\\Program Files\\wkhtmltopdf\\wkhtmltopdf.exe";
        var wkhtmlDir = HttpContext.Server.MapPath(@"~/wkhtmltopdf");
        var wkhtml = HttpContext.Server.MapPath(@"~/wkhtmltopdf/wkhtmltopdf.exe");
        var p = new Process();

        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.FileName = wkhtml;
         p.StartInfo.WorkingDirectory = wkhtmlDir;

        string switches = "";
        switches += "--print-media-type ";
        switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm ";
        switches += "--page-size Letter ";
        p.StartInfo.Arguments = switches + " " + url + " " + fileName;
        p.Start();

       // wait or exit
        p.WaitForExit(60000);

        // read the exit code, close process
        int returnCode = p.ExitCode;
        p.Close();
        var outputFile = string.Format("{0}\\{1}", p.StartInfo.WorkingDirectory, fileName);
        byte[] bytes = System.IO.File.ReadAllBytes(outputFile);

        return returnCode == 0 ? bytes: null;
    }
...