source pechkin open library google c# asp.net pdf-generation wkhtmltopdf

c# - pechkin - Cómo usar wkhtmltopdf.exe en ASP.net



wkhtmltopdf pdf (5)

Acabo de comenzar un nuevo proyecto para proporcionar un contenedor C # P / Invoke alrededor de wkhtmltopdf.

Puede verificar mi código en: https://github.com/pruiz/WkHtmlToXSharp

Saludos

Esta pregunta ya tiene una respuesta aquí:

Después de 10 horas y probando otras 4 herramientas de HTML a PDF, estoy a punto de explotar.

wkhtmltopdf suena como una excelente solución ... el problema es que no puedo ejecutar un proceso con suficientes permisos de asp.net así que ...

Process.Start("wkhtmltopdf.exe","http://www.google.com google.pdf");

comienza pero no hace nada.

¿Hay alguna manera fácil de hacerlo?

-a) permitir a asp.net iniciar procesos (que en realidad pueden hacer algo) o
-b) compilar / envolver / lo que sea wkhtmltopdf.exe en algo que pueda usar de C # como este: WkHtmlToPdf.Save("http://www.google.com", "google.pdf");


Aquí está el código real que utilicé. Por favor, siéntanse libres de editar esto para deshacerse de algunos de los olores y otros terribles ... Sé que no es tan bueno.

using System; using System.Diagnostics; using System.IO; using System.Web; using System.Web.UI; public partial class utilities_getPDF : Page { protected void Page_Load(Object sender, EventArgs e) { string fileName = WKHtmlToPdf(myURL); if (!string.IsNullOrEmpty(fileName)) { string file = Server.MapPath("~//utilities//GeneratedPDFs//" + fileName); if (File.Exists(file)) { var openFile = File.OpenRead(file); // copy the stream (thanks to http://.com/questions/230128/best-way-to-copy-between-two-stream-instances-c) byte[] buffer = new byte[32768]; while (true) { int read = openFile.Read(buffer, 0, buffer.Length); if (read <= 0) { break; } Response.OutputStream.Write(buffer, 0, read); } openFile.Close(); openFile.Dispose(); File.Delete(file); } } } public string WKHtmlToPdf(string Url) { var p = new Process(); string switches = ""; switches += "--print-media-type "; switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm "; switches += "--page-size Letter "; // waits for a javascript redirect it there is one switches += "--redirect-delay 100"; // Utils.GenerateGloballyUniuqueFileName takes the extension from // basically returns a filename and prepends a GUID to it (and checks for some other stuff too) string fileName = Utils.GenerateGloballyUniqueFileName("pdf.pdf"); var startInfo = new ProcessStartInfo { FileName = Server.MapPath("~//utilities//PDF//wkhtmltopdf.exe"), Arguments = switches + " " + Url + " /"" + "../GeneratedPDFs/" + fileName + "/"", UseShellExecute = false, // needs to be false in order to redirect output RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, // redirect all 3, as it should be all 3 or none WorkingDirectory = Server.MapPath("~//utilities//PDF") }; p.StartInfo = startInfo; p.Start(); // doesn''t work correctly... // read the output here... // string output = p.StandardOutput.ReadToEnd(); // wait n milliseconds for exit (as after exit, it can''t read the output) p.WaitForExit(60000); // read the exit code, close process int returnCode = p.ExitCode; p.Close(); // if 0, it worked return (returnCode == 0) ? fileName : null; } }


Gracias a Paul , he encontrado la buena wrapper escrita por Codaxy, que también se puede descargar fácilmente a través de NuGet .

Después de algunas pruebas, he gestionado esta acción MVC, que instantáneamente crea y devuelve el archivo PDF como una secuencia:

public ActionResult Pdf(string url, string filename) { MemoryStream memory = new MemoryStream(); PdfDocument document = new PdfDocument() { Url = url }; PdfOutput output = new PdfOutput() { OutputStream = memory }; PdfConvert.ConvertHtmlToPdf(document, output); memory.Position = 0; return File(memory, "application/pdf", Server.UrlEncode(filename)); }

Aquí, las clases Pdf * se han implementado en el contenedor, con un código limpio y agradable, que lamentablemente carece de documentación.

Dentro del convertidor, la URL se convertirá a PDF, se almacenará en un archivo temporal, se copiará a la transmisión que hemos proporcionado como parámetro y luego se eliminará el archivo PDF.

Finalmente, tenemos que impulsar la transmisión como FileStreamResult.

No se olvide de establecer la posición del flujo de salida en cero, de lo contrario verá archivos PDF que se descargarán como cero bytes de tamaño.