Jak stosować wkhtmltopdf.exe w ASP.net [duplikat]

To pytanie ma już odpowiedź tutaj:

Po 10 godzinach i próbie 4 innych narzędzi HTML do PDF jestem gotowy do wybuchu.

Wkhtmltopdf brzmi jak doskonałe rozwiązanie...problem polega na tym, że nie mogę wykonać procesu z wystarczającą ilością uprawnień z asp.net więc...

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

Zaczyna się, ale nic nie robi.

Czy jest łatwy sposób na:

-A) pozwalają asp.net aby rozpocząć procesy (które rzeczywiście mogą coś zrobić) lub
- b) compile/wrap/whatever wkhtmltopdf.exe do somthing mogę używać z C# jak to: WkHtmlToPdf.Save("http://www.google.com", "google.pdf");

Author: David Murdoch, 2010-05-08

5 answers

Możesz też użyć Pechkin

. Net Wrapper dla WkHtmlToPdf DLL, biblioteki wykorzystującej silnik Webkit do Konwertuj strony HTML na PDF.

Pakiety Nuget:

Pechkin.Synchronized

Pechkin

 20
Author: Răzvan Flavius Panda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-16 09:47:26

Właśnie zacząłem nowy projekt, aby zapewnić C # P/Invoke wrapper wokół wkhtmltopdf.

Możesz sprawdzić mój kod pod adresem: https://github.com/pruiz/WkHtmlToXSharp

Pozdrawiam.

 23
Author: Pablo Ruiz García,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-29 19:14:49

Dzięki Paulowi Znalazłem dobry wrappernapisany przez Codaxy, który można również łatwo pobrać poprzez NuGet.

Po kilku próbach udało mi się wykonać tę akcję MVC, która natychmiast tworzy i zwraca plik PDF jako strumień:

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

Tutaj, klasy Pdf* zostały zaimplementowane w opakowaniu, z ładnym, czystym kodem, niestety pozbawionym dokumentacji.

W konwerterze adres URL zostanie przekonwertowany na plik PDF, przechowywany w plik tymczasowy, skopiowany do strumienia, który podaliśmy jako parametr, a następnie plik PDF jest usuwany.

Na koniec musimy wypchnąć strumień jako FileStreamResult.

Nie zapomnij ustawić pozycji strumienia wyjściowego na zero, w przeciwnym razie zobaczysz pliki PDF pobierane jako zero bajtów rozmiaru.

 12
Author: Bolt Thunder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:15

Oto prawdziwy kod, którego użyłem. Możesz to edytować, aby pozbyć się niektórych zapachów i innych okropności...Wiem, że to nie Takie wspaniałe.

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;
    }
}
 4
Author: David Murdoch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-18 19:35:16

Nie mogę komentować, więc zamieszczam to jako "odpowiedź" na komentarze powyższej odpowiedzi Jak korzystać z wkhtmltopdf.exe w ASP.net

Jeśli --redirect-delay nie działa, spróbuj --javascript-delay Zobacz tutaj wszystkie opcje: https://github.com/antialize/wkhtmltopdf/blob/master/README_WKHTMLTOPDF

Lub zrobić wkhtmltopdf -H dla rozszerzonej pomocy (afaik to samo wyjście jak wyżej link).

 0
Author: alwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:52