Comment utiliser wkhtmltopdf.exe in ASP.net [duplicata]

cette question a déjà une réponse ici:

après 10 heures et essayer 4 Autres Outils HTML à PDF je suis sur le point d'exploser.

wkhtmltopdf sonne comme un excellente solution...le problème est que je ne peux pas exécuter un processus avec suffisamment d'autorisations de asp.net ...

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

commence mais ne fait rien.

Est-il un moyen facile de:

- a) allow asp.net pour lancer des processus (qui peuvent réellement faire quelque chose) ou

- B) compiler/wrap/whatever wkhtmltopdf.exe dans quelque chose que je peux utiliser à partir de C # comme ceci: WkHtmlToPdf.Save("http://www.google.com", "google.pdf");

36
demandé sur David Murdoch 2010-05-08 02:12:33

5 réponses

vous pouvez également utiliser Pechkin

.net Wrapper for WkHtmlToPdf DLL, bibliothèque qui utilise le moteur Webkit pour convertir les pages HTML en PDF.

Nuget packages:

Pechkin.Synchrone

Pechkin

20
répondu Răzvan Flavius Panda 2013-04-16 09:47:26

je viens de commencer un nouveau projet pour fournir un C# P/Invoke wrapper autour de wkhtmltopdf.

vous pouvez vérifier mon code à: https://github.com/pruiz/WkHtmlToXSharp

salutations.

23
répondu Pablo Ruiz García 2011-01-29 19:14:49

merci à Paul , j'ai trouvé le bon wrapper écrit par Codaxy, qui peut également être facilement téléchargé via NuGet .

après quelques essais, j'ai géré cette action MVC, qui crée et renvoie instantanément le fichier PDF en flux:

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

ici, les classes Pdf* ont été implémentées dans le wrapper, avec un code propre et agréable, malheureusement manquant documentation.

dans le convertisseur, L'URL sera convertie en PDF, stockée dans un fichier temporaire, copiée dans le flux que nous avons donné comme paramètre, et ensuite le fichier PDF sera supprimé.

enfin, nous devons pousser le flux comme FileStreamResult.

n'oubliez pas de définir la Position du flux de sortie à zéro, sinon vous verrez les fichiers PDF téléchargés en tant que zéro bytes de taille.

12
répondu Bolt Thunder 2017-05-23 11:54:15

Voici le code que j'ai utilisé. N'hésitez pas à le modifier pour se débarrasser de certaines des odeurs et d'autres terribleness...Je sais que ce n'est pas si grande.

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 /q/how-do-i-copy-the-contents-of-one-stream-to-another-37840/"";
        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;
    }
}
4
répondu David Murdoch 2010-05-18 19:35:16

Je ne peux pas commenter donc je poste ceci comme une 'réponse' aux commentaires de la réponse ci-dessus comment utiliser wkhtmltopdf.exe in ASP.net

si --redirect-delay ne fonctionne pas, essayez --javascript-delay Voir ici pour toutes les options: https://github.com/antialize/wkhtmltopdf/blob/master/README_WKHTMLTOPDF

ou faire wkhtmltopdf -H pour l'aide prolongée (afaik même sortie que le lien ci-dessus).

0
répondu alwin 2017-05-23 12:09:52