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í:
- Llamar a wkhtmltopdf para generar PDF a partir de HTML 10 respuestas
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.
No puedo comentar, así que publico esto como una ''respuesta'' a los comentarios de la respuesta anterior Cómo usar wkhtmltopdf.exe en ASP.net
Si --redirect-delay
no funciona, intente --javascript-delay
Consulte aquí para ver todas las opciones: https://github.com/antialize/wkhtmltopdf/blob/master/README_WKHTMLTOPDF
O haga wkhtmltopdf -H
para obtener ayuda ampliada (afaik misma salida que el enlace anterior).
.NET Wrapper para WkHtmlToPdf DLL, biblioteca que usa el motor Webkit para convertir páginas HTML a PDF.
Paquetes Nuget: