Frage

Diese Frage bereits eine Antwort hier:

Nach 10 Stunden und versuchen 4 andere HTML zu PDF-Tools Ich bin über bereit zu explodieren.

wkhtmltopdf klingt wie eine ausgezeichnete Lösung ... das Problem ist, dass ich nicht kann ein Verfahren mit genügend Berechtigungen von asp.net auszuführen, so ...

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

startet, aber nichts tun.

Gibt es eine einfache Möglichkeit, entweder:

-a) erlauben asp.net Prozesse zu starten (das kann tatsächlich etwas tun) oder in -b) Kompilierung / wrap / was auch immer wkhtmltopdf.exe in somthing ich von C # wie diese verwenden: WkHtmlToPdf.Save("http://www.google.com", "google.pdf");

War es hilfreich?

Lösung

Sie können auch verwenden Pechkin

.NET Wrapper für wkhtmltopdf DLL-Bibliothek, die Webkit-Engine verwendet, um convert HTML-Seiten in PDF.

Nuget Pakete:

Pechkin.Synchronized

Pechkin

Andere Tipps

ich ein neues Projekt gerade begonnen, einen C # P / Invoke-Wrapper um wkhtmltopdf zur Verfügung zu stellen.

https://github.com/pruiz/WkHtmlToXSharp Sie können meinen Code an der Kasse p>

Greets.

Dank Paul , habe ich das gut gefunden Wrapper von Codaxy geschrieben, die auch bequem über NuGet .

Nach einigen Versuchen, habe ich dieses MVC Aktion geschafft, dass sofort erstellt und kehrt die PDF-Datei als Stream:

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

Hier haben die PDF * Klassen in der Wrapper implementiert, mit einem schönen, sauberen Code, leider Dokumentation fehlt.

Im Konverter wird die URL in eine PDF konvertiert werden, in einer temporären Datei gespeichert, in den Stream kopiert, dass wir als Parameter angegeben haben, und danach die PDF-Datei gelöscht wird.

Schließlich müssen wir den Stream als Filestreamresult drücken.

Vergessen Sie nicht den Ausgangsstrom der Position auf Null zu setzen, sonst werden Sie PDF-Dateien sehen als null Byte Größe heruntergeladen werden.

Hier ist der eigentliche Code I verwendet. Bitte fühlen Sie sich frei zu bearbeiten einiger loswerden der Gerüche und andere terribleness ... Ich weiß, es ist nicht so groß.

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

ich nicht Kommentar kann so poste ich dies als eine ‚Antwort‘ auf die Kommentare von oben Antwort So verwenden wkhtmltopdf.exe in ASP.net

Wenn --redirect-delay nicht funktioniert, versuchen --javascript-delay Sehen Sie hier für alle Optionen: https://github.com/antialize/wkhtmltopdf/blob / Master / README_WKHTMLTOPDF

Oder wkhtmltopdf -H für erweiterte Hilfe (afaik gleiche Ausgabe wie Link oben).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top