Pregunta

Esta pregunta ya tiene una respuesta aquí:

Después de 10 horas y tratando otros 4 HTML para herramientas PDF estoy a punto de explotar.

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

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

arranca pero no hace nada.

¿Hay una manera fácil ya sea:

-a) permitirá asp.net para iniciar procesos (que en realidad puede hacer algo) o
-b) de compilación / envoltura / lo que sea wkhtmltopdf.exe en Somthing puedo usar desde C # como esto: WkHtmlToPdf.Save("http://www.google.com", "google.pdf");

¿Fue útil?

Solución

También podría usar Pechkin

.NET Envoltura para wkhtmltopdf DLL, biblioteca que utiliza el motor Webkit para páginas convertir HTML a PDF.

paquetes Nuget:

Pechkin.Synchronized

Pechkin

Otros consejos

acabo de empezar un nuevo proyecto para proporcionar una envoltura C # P / Invoke alrededor wkhtmltopdf.

Puedes retirar mi código en: https://github.com/pruiz/WkHtmlToXSharp

saluda.

Gracias a Paul , he encontrado la buena envoltura escrito por Codaxy, que también puede ser descargado fácilmente a través de NuGet .

Después de algunos ensayos, he conseguido esta acción MVC, que crea y devuelve inmediatamente el archivo PDF como una corriente:

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));
}

A continuación, los PDF * clases se han implementado en la envoltura, con un bonito, un código limpio, por desgracia carece de documentación.

Dentro del convertidor, la URL será convertida a un PDF, se almacena en un archivo temporal, con copia a la corriente que hemos dado como parámetro, y después se elimina el archivo PDF.

Por último, tenemos que empujar la corriente como FileStreamResult.

No se olvide de fijar la posición de la secuencia de salida a cero, de lo contrario se verá archivos PDF se descargan como cero bytes de tamaño.

Este es el código real que he usado. no dude en esta edición para deshacerse de algunos de los olores y otra espanto ... Yo no es que saben muy bien.

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://stackoverflow.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;
    }
}

No puedo comentario así que publicar esto como una 'respuesta' a los comentarios de respuesta anterior ¿Cómo utilizar wkhtmltopdf.exe en ASP.net

Si --redirect-delay no funciona, --javascript-delay intento Vea aquí para todas las opciones: https://github.com/antialize/wkhtmltopdf/blob / master / README_WKHTMLTOPDF

O hacer wkhtmltopdf -H ayuda extendida (que yo sepa misma salida que enlace anterior).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top