pechkin org latest example downloads descargar amd64 c# asp.net wkhtmltopdf

c# - org - ¿Cómo pasar html como una cadena usando wkhtmltopdf?



wkhtmltopdf latest version (3)

La redirección de STDIN es probablemente la forma más fácil de lograr lo que estás tratando de hacer.

Un método para redireccionar STDIN con wkhtmltopdf (en ASP.Net) es el siguiente:

private void WritePDF(string HTML) { string inFileName, outFileName, tempPath; Process p; System.IO.StreamWriter stdin; ProcessStartInfo psi = new ProcessStartInfo(); tempPath = Request.PhysicalApplicationPath + "temp//"; inFileName = Session.SessionID + ".htm"; outFileName = Session.SessionID + ".pdf"; // run the conversion utility psi.UseShellExecute = false; psi.FileName = "c://Program Files (x86)//wkhtmltopdf//wkhtmltopdf.exe"; psi.CreateNoWindow = true; psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; // note that we tell wkhtmltopdf to be quiet and not run scripts // NOTE: I couldn''t figure out a way to get both stdin and stdout redirected so we have to write to a file and then clean up afterwards psi.Arguments = "-q -n - " + tempPath + outFileName; p = Process.Start(psi); try { stdin = p.StandardInput; stdin.AutoFlush = true; stdin.Write(HTML); stdin.Close(); if (p.WaitForExit(15000)) { // NOTE: the application hangs when we use WriteFile (due to the Delete below?); this works Response.BinaryWrite(System.IO.File.ReadAllBytes(tempPath + outFileName)); //Response.WriteFile(tempPath + outFileName); } } finally { p.Close(); p.Dispose(); } // delete the pdf System.IO.File.Delete(tempPath + outFileName); }

Tenga en cuenta que el código anterior asume que hay un directorio temporal disponible en el directorio de su aplicación. Además, debe habilitar explícitamente el acceso de escritura a ese directorio para la cuenta de usuario utilizada al ejecutar el proceso de IIS.

¿Cómo pasar html como una cadena en lugar de url en wkhtmltopdf usando asp.net, c #?


Sé que esta es una publicación anterior, pero quiero que los futuros desarrolladores tengan esta opción. Tenía la misma necesidad, y la idea de tener que iniciar un proceso en segundo plano para obtener un PDF dentro de una aplicación web es terrible.

Aquí hay otra opción: https://github.com/TimothyKhouri/WkHtmlToXDotNet

Es un envoltorio nativo de .NET alrededor de wkhtmltopdf.

Código de muestra aquí:

var pdfData = HtmlToXConverter.ConvertToPdf("<h1>COOOL!</h1>");

Tenga en cuenta que no es seguro para subprocesos en este momento; estoy trabajando en eso. Entonces solo usa un monitor o algo o un candado.


STDIn y STDOut se han redirigido en este ejemplo, por lo que no debería necesitar ningún archivo.

public static class Printer { public const string HtmlToPdfExePath = "wkhtmltopdf.exe"; public static bool GeneratePdf(string commandLocation, StreamReader html, Stream pdf, Size pageSize) { Process p; StreamWriter stdin; ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = Path.Combine(commandLocation, HtmlToPdfExePath); psi.WorkingDirectory = Path.GetDirectoryName(psi.FileName); // run the conversion utility psi.UseShellExecute = false; psi.CreateNoWindow = true; psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; // note: that we tell wkhtmltopdf to be quiet and not run scripts psi.Arguments = "-q -n --disable-smart-shrinking " + (pageSize.IsEmpty? "" : "--page-width " + pageSize.Width + "mm --page-height " + pageSize.Height + "mm") + " - -"; p = Process.Start(psi); try { stdin = p.StandardInput; stdin.AutoFlush = true; stdin.Write(html.ReadToEnd()); stdin.Dispose(); CopyStream(p.StandardOutput.BaseStream, pdf); p.StandardOutput.Close(); pdf.Position = 0; p.WaitForExit(10000); return true; } catch { return false; } finally { p.Dispose(); } } public static void CopyStream(Stream input, Stream output) { byte[] buffer = new byte[32768]; int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { output.Write(buffer, 0, read); } } }