Konvertieren Sie HTML in PDF in .NET

425

Ich möchte ein PDF generieren, indem ich HTML-Inhalte an eine Funktion übergebe. Ich habe iTextSharp dafür verwendet, aber es funktioniert nicht gut, wenn es auf Tabellen stößt und das Layout nur chaotisch wird.

Gibt es einen besseren Weg?

Amedee Van Gasse
quelle
Sie können hierfür GemBox.Document verwenden . Auch hier finden Sie einen Beispielcode zum Konvertieren einer HTML-Datei in eine PDF-Datei.
Mario Z
Welche Version von iTextSharp verwenden Sie und können Sie Ihr HTML teilen?
Amedee Van Gasse
Immer noch keine Antwort auf meine Anfrage nach zusätzlichen Informationen. Bitte fügen Sie auch hinzu, wenn Sie HTMLWorker oder XMLWorker verwenden.
Amedee Van Gasse
Was ist mit .net Core?
Piero Alberto
SEPT 2019: Ich habe eine neue Antwort hinzugefügt. Einige der aufgeführten Optionen sind kostenlos, andere kostenpflichtig und einige sind als .net core stackoverflow.com/questions/564650/… verfügbar.
Mauricio Gracia Gutierrez

Antworten:

198

BEARBEITEN: Neuer Vorschlag HTML Renderer für PDF mit PdfSharp

(Nachdem Sie wkhtmltopdf ausprobiert und vorgeschlagen haben, es zu vermeiden)

HtmlRenderer.PdfSharp ist ein 100% vollständig C # -verwalteter Code , einfach zu verwenden, threadsicher und vor allem KOSTENLOS ( neue BSD-Lizenz ) .

Verwendungszweck

  1. Laden Sie das Nuget-Paket HtmlRenderer.PdfSharp herunter.
  2. Verwenden Sie die Beispielmethode.

    public static Byte[] PdfSharpConvert(String html)
    {
        Byte[] res = null;
        using (MemoryStream ms = new MemoryStream())
        {
            var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4);
            pdf.Save(ms);
            res = ms.ToArray();
        }
        return res;
    }

Eine sehr gute Alternative ist eine kostenlose Version von iTextSharp

Bis Version 4.1.6 wurde iTextSharp unter der LGPL-Lizenz lizenziert und Versionen bis 4.16 (oder möglicherweise auch Gabeln) sind als Pakete verfügbar und können frei verwendet werden. Natürlich kann jemand die fortgesetzte 5+ kostenpflichtige Version verwenden .

Ich habe versucht, wkhtmltopdf- Lösungen in mein Projekt zu integrieren, und hatte einige Hürden.

Ich persönlich würde die Verwendung von wkhtmltopdf-basierten Lösungen für Hosted Enterprise-Anwendungen aus folgenden Gründen vermeiden .

  1. Zuallererst ist wkhtmltopdf C ++ implementiert, nicht C #, und Sie werden verschiedene Probleme haben, es in Ihren C # -Code einzubetten, insbesondere beim Umschalten zwischen 32-Bit- und 64-Bit-Builds Ihres Projekts. Musste mehrere Problemumgehungen ausprobieren, einschließlich bedingter Projekterstellung usw. usw., um "ungültige Formatausnahmen" auf verschiedenen Computern zu vermeiden.
  2. Wenn Sie Ihre eigene virtuelle Maschine verwalten, ist dies in Ordnung. Wenn Ihr Projekt jedoch in einer eingeschränkten Umgebung wie ( Azure (mit Azure, wie vom TuesdayPenchin-Autor erwähnt ) unmöglich ist , Elastic Beanstalk usw.) ausgeführt wird, ist es ein Albtraum, diese Umgebung nur so zu konfigurieren, dass wkhtmltopdf funktioniert.
  3. wkhtmltopdf erstellt Dateien auf Ihrem Server, sodass Sie Benutzerberechtigungen verwalten und Schreibzugriff auf den Ort gewähren müssen, an dem wkhtmltopdf ausgeführt wird.
  4. Wkhtmltopdf wird als eigenständige Anwendung ausgeführt und wird daher nicht von Ihrem IIS-Anwendungspool verwaltet . Sie müssen es also entweder als Dienst auf einem anderen Computer hosten, oder es treten Verarbeitungsspitzen und Speicherverbrauch auf Ihrem Produktionsserver auf.
  5. Es verwendet temporäre Dateien, um das PDF zu generieren, und in Fällen wie AWS EC2 mit sehr langsamen Festplatten-E / A ist dies ein großes Leistungsproblem.
  6. Der am meisten gehasste Fehler "DLL 'wkhtmltox.dll' kann nicht geladen werden", der von vielen Benutzern gemeldet wurde.

--- PRE Edit Section ---

Für alle, die in einfacheren Anwendungen / Umgebungen PDF aus HTML generieren möchten, lasse ich meinen alten Beitrag als Vorschlag.

DiPechkin

https://www.nuget.org/packages/TuesPechkin/

oder speziell für MVC- Webanwendungen (aber ich denke, Sie können es in jeder .net-Anwendung verwenden)

Rotativa

https://www.nuget.org/packages/Rotativa/

Beide verwenden die Binärdatei wkhtmtopdf, um HTML in PDF zu konvertieren. Was nutzt die WebKit - Engine zum Rendern der Seiten so kann es auch Parse - CSS - Stylesheets .

Sie bieten eine benutzerfreundliche nahtlose Integration in C #.

Rotativa kann auch direkt PDFs aus jeder Razor View generieren .

Zusätzlich verwalten sie für echte Webanwendungen auch die Thread-Sicherheit usw.

Anestis Kivranoglou
quelle
2
Vielen Dank für die Aktualisierung Ihres Beitrags. Ich werde PdfSharp ausprobieren. Du hast mir viel Zeit gespart.
John Henckel
1
PdfSharp ist in Bezug auf die Leistung gut, aber es hat Floats für mich nicht richtig gerendert. Zum Glück konnte ich das Markup ändern, um gute alte Tabellen zu verwenden. PdfSharp handhabt sie gut.
Gebb
3
Wir haben HtmlRenderer ausprobiert. Es war sehr schnell, wenn kein CSS geladen wurde. Als wir jedoch versuchten, CSS anzuwenden (Bootstrap plus einige maßgeschneiderte), dauerte das CSS-Parsing eine Weile (was wir wahrscheinlich abmildern konnten), und das Rendern war völlig anders als auf der Webseite.
OutstandingBill
1
@ user2347528 - Wenn Sie sich die Quelle für HtmlRenderer.PdfSharp ansehen, gibt es keine Möglichkeit, dies zu beheben. Es werden nur die Gesamtseitenhöhe und die Clips in jede PDF-Seite übernommen, was sehr bedauerlich ist. Dies bedeutet, dass mehrseitige PDFs mit dieser Bibliothek wirklich funktionieren. ' nicht getan werden.
Mr. Bungle
3
BS. Dadurch wird ein Bild des HTML-Codes erstellt und das Bild in die PDF-Datei eingefügt. Dies ist überhaupt kein echtes PDF. Außerdem ist PDF ein Vektorgrafikformat - Sie können nahezu unendlich scrollen -, es sei denn, das PDF besteht aus einer Rastergrafik, die von dieser Bibliothek erstellt wird.
Stefan Steiger
191

Update: Ich würde jetzt PupeteerSharp über wkhtmltopdf empfehlen .

Versuchen Sie es mit wkhtmtopdf . Es ist das beste Werkzeug, das ich bisher gefunden habe.

Für .NET können Sie diese kleine Bibliothek verwenden , um das Befehlszeilenprogramm wkhtmtopdf einfach aufzurufen.

Marko
quelle
17
unterstützt .NET ??
Kiquenet
6
Es ist eine eigenständige ausführbare Datei. Sie können es als Prozess starten und eine URL des HTML-Dokuments als Argument übergeben.
Marek
46
@bamccaig Ich habe es bereits =) github.com/gmanny/Pechkin Es macht jede verwendbare Funktion der Bibliothek verfügbar und hat auch einen Wrapper zur Verwendung in mehreren Threads. Und es ist auf NuGet.
Gman
7
@ AdamMoszczyński: Aus Wikipedia : Mit der LGPL können Entwickler und Unternehmen LGPL-Software verwenden und in ihre eigene (sogar proprietäre) Software integrieren, ohne dass (im Sinne eines starken Copylefts) der Quellcode ihrer eigenen Softwareteile veröffentlicht werden muss.
Oliver
34

Ich habe kürzlich einen PoC zur Konvertierung von HTML in PDF durchgeführt und wollte meine Ergebnisse teilen.

Mein Favorit bei weitem ist OpenHtmlToPdf

Vorteile dieses Tools:

  • Sehr gute HTML-Kompatibilität (z. B. war es das einzige Tool in meinem Beispiel, das Tabellenüberschriften korrekt wiederholte, wenn eine Tabelle mehrere Seiten umfasste).
  • Fließende API
  • Free und OpenSource ( Creative Commons Attribution 3.0-Lizenz )
  • Erhältlich über NuGet

Andere getestete Tools:

Markus
quelle
+1 dafür habe ich HtmlRenderer für PdfSharp getestet, bin aber auf zu viele Probleme mit Seitenumbrüchen gestoßen. Ich kann mit der Abhängigkeit von wkHtmlToPdf in diesem Projekt leben, daher war diese Lösung großartig - sie rendert den HTML-Code wunderschön.
jmdon
Sah wunderschön aus, aber wow, es hat lange gedauert. 30 Sekunden, mit einem Bootstrap-Thema und so weiter, ziemlich einfache Seite, aber trotzdem.
Nicholas Petersen
Stephanie von IronPDF hier. Hier ist ein Codebeispiel zur Verwendung von IronPDF zum Konvertieren von HTML in PDF in C #. Weitere Informationen finden Sie in unserem HTML-PDF-Tutorial auf unserer Website. using IronPdf; IronPdf.HtmlToPdf Renderer = new IronPdf.HtmlToPdf(); // Render an HTML document or snippet as a string Renderer.RenderHtmlAsPdf("<h1>Hello World</h1>").SaveAs("html-string.pdf");
Stephanie
Ich habe iText pdfHtml verwendet, aber es wird nicht unterstützt background-color. OpenHtmlToPdf funktioniert perfekt kostenlos.
HP93
Ich stimme der Überlegenheit von OpenHtmlToPdf zu. Außerdem werden die Zusammenführung von .exe und .dll mit ILMerge unterstützt.
Saygley
30

Letzte Aktualisierung: März 2020

Dies ist die Liste der Optionen für die Konvertierung von HTML in PDF in .NET, die ich zusammengestellt habe (einige kostenlos, andere kostenpflichtig).

Wenn Ihnen keine der oben genannten Optionen hilft, können Sie jederzeit in den NuGet-Paketen https://www.nuget.org/packages?q=html+pdf suchen

Mauricio Gracia Gutierrez
quelle
1
Haben Sie irgendwelche auf Leistung getestet? Wir
möchten
Ich habe keinen Leistungsvergleich durchgeführt, insbesondere weil es sich um eine so lange Liste handelt - vielleicht hat da draußen bereits jemand eine Leistungsüberprüfung der .net-Bibliotheken der PDF-Generation oder ähnliches durchgeführt
Mauricio Gracia Gutierrez,
28

Die meisten HTML-zu-PDF-Konverter verwenden den IE zum Parsen und Rendern von HTML. Dies kann unterbrochen werden, wenn Benutzer ihren IE aktualisieren. Hier ist eine, die nicht auf IE basiert.

Der Code ist ungefähr so:

EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);

Wie bei vielen anderen Konvertern können Sie Text, Dateinamen oder URL übergeben. Das Ergebnis kann in einer Datei oder einem Stream gespeichert werden.

Jason
quelle
35
es ist nicht nützlich, weil Sie die Bibliothek
kaufen
47
d1jhoni1b, wie macht es das nicht nützlich? Wenn es sich um ein Pay-for-Tool handelt, kann man sagen, dass es teuer ist, aber allein nach diesen Kriterien nicht nutzlos.
Don Rolling
3
Es ist wahr, EO.Pdf verwendet keinen IE. Es scheint jedoch 32-Bit-Instanzen eines Webkit-Browsers im Hintergrund zu erzeugen. Überprüfen Sie Ihre Prozessliste und Sie werden sie als rundll32.exe-Instanzen sehen, die auf die EO.PDF-DLL verweisen. Also ist es meiner Meinung nach immer noch ein bisschen hackig.
Matt
1
Media = "print" wird nicht unterstützt, was sehr schmerzhaft ist.
Marat Faskhiev
15
Einzelentwicklerlizenz für 650 US-Dollar. Das ist teuer.
Abhijeet Nagre
25

Ich kann NReco nur wärmstens empfehlen . Es hat die kostenlose und kostenpflichtige Version und ist es wirklich wert. Es verwendet wkhtmtopdf im Hintergrund, aber Sie benötigen nur eine Assembly. Fantastisch.

Anwendungsbeispiel:

Installation über NuGet .

var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);

Haftungsausschluss: Ich bin nicht der Entwickler, nur ein Fan des Projekts :)

Kim Tranjan
quelle
3
Sieht in der Tat ziemlich nützlich aus. Erwähnenswert ist, dass es ab heute (10.05.15) der am häufigsten heruntergeladene .Net-Wrapper für wkhtmtopdf ist (als Nuget-Paket).
Ken2k
3
Ich habe es versucht, leider konnte ich es nicht auf den Webseiten von Azure zum Laufen bringen.
gabriel14
Diese Bibliothek funktioniert einwandfrei, wenn ich sie lokal auf meinem Computer ausführe. Auf dem Hosting-Server wird jedoch zufällig der folgende Fehler angezeigt. Pdf wird manchmal generiert, aber manchmal wird der folgende Fehler ausgegeben. "Fehler. Bei der Verarbeitung Ihrer Anfrage ist ein Fehler aufgetreten. PDF kann nicht generiert werden: (Exit-Code: 1)"
user2347528
wkhtmtopdf hängt von GDI + oder x-server ab, wenn Sie unter Mono / Linux arbeiten. Dies ist also nicht nützlich für Serverumgebungen ...
Nuzzolilo
Es ist gut und funktioniert wie erwartet, aber ein bisschen Qualitätsproblem, das ich in meinem PDF sehe. Können wir das verbessern?
Bharat
13

Winnovative bietet eine .Net PDF-Bibliothek, die HTML-Eingaben unterstützt. Sie bieten eine unbegrenzte kostenlose Testversion . Je nachdem, wie Sie Ihr Projekt bereitstellen möchten, kann dies ausreichend sein.

Stewart
quelle
4
Denken Sie daran, dass Winnovative bei der letzten Überprüfung nicht mit IE9 kompatibel war (da die in IE9 entfernte IE GDI-Rendering-Engine verwendet wurde). Wenn Sie also IE9 auf dem Computer installiert haben, den Sie verwenden, funktioniert die Konvertierung nicht. Möglicherweise haben sie das behoben, als Sie dies gelesen haben, aber viele der kommerziellen Komponenten verwendeten die IE-Rendering-Engine und blieben mit IE9 hängen, sodass es sich lohnt, dies zu überprüfen.
Fubaar
Winnovative war am einfachsten einzurichten und es funktionierte sofort. Aber: 1. Es funktioniert NICHT auf Azure-Websites, sondern nur auf CloudApp. 2. Es ist langsam, es dauert gut 8 Sekunden, um ein einfaches PDF auf einer Azure D1 VM zu generieren
jsgoupil
Bestätigen. Es ist sehr langsam. Ich habe mit wkhtmltopdf verglichen.
Marat Faskhiev
Winnovative Library ist sehr teuer. Etwa 650 US-Dollar für Entwicklerlizenzen und 1200 US-Dollar für andere Lizenzen.
Abhijeet Nagre
Winnovative HTML to PDF Converter funktioniert auf Azure-Websites und hängt nicht vom IE ab, wie in einem Kommentar vorgeschlagen. Überprüfen Sie die Winnovative HTML to PDF für Azure-Lösung auf der Website: winnovative-software.com/html-to-pdf-converter-azure.aspx . Um die Konvertierungszeit zu verbessern, setzen Sie HtmlToPdf.ConversionDelay = 0. Der Konverter verwendet eine Standardverzögerung für HTML-Seiten, die ihren Inhalt nach dem Laden der Seite aktualisieren.
EvoPdf
9

Essential PDF kann verwendet werden, um HTML in PDF zu konvertieren : C # -Beispiel . Das hier verlinkte Beispiel basiert auf ASP.NET, die Bibliothek kann jedoch in Windows Forms, WPF, ASP.NET Webforms und ASP.NET MVC verwendet werden. Die Bibliothek bietet die Möglichkeit, verschiedene HTML-Rendering-Engines zu verwenden: Internet Explorer (Standard) und WebKit (beste Ausgabe).

Die gesamte Steuerungssuite ist kostenlos (auch kommerzielle Anwendungen) über das Community-Lizenzprogramm verfügbar , wenn Sie sich qualifizieren. Die Community-Lizenz ist das vollständige Produkt ohne Einschränkungen oder Wasserzeichen.

Hinweis: Ich arbeite für Syncfusion.

Davis Jebaraj
quelle
8

Wenn Sie keine echte .Net PDF-Bibliothek benötigen, gibt es zahlreiche kostenlose HTML-zu-PDF-Tools , von denen viele über eine Befehlszeile ausgeführt werden können.

Eine Lösung wäre, eine davon auszuwählen und dann in C # einen dünnen Wrapper darum zu schreiben. ZB wie in diesem Tutorial gemacht .

Stewart
quelle
Das Tutorial verwendet eine Komponente von einer Website, die nicht mehr existiert.
Tom Winter
7

Ich habe ExpertPDF Html To Pdf Converter verwendet . Macht einen anständigen Job. Leider ist es nicht kostenlos.

charpdevel0p3r
quelle
Hat ExpertPDf eine Option zum Wasserzeichen der Dokumente?
user1799214
@ user1799214 - Ja, ExpertPDF unterstützt Wasserzeichen. Beispielcode finden Sie hier . Ich habe es erfolgreich mit Wasserzeichen auf einer meiner Websites verwendet.
Theophilus
Es funktioniert ganz gut, aber sie beantworten keine Support-Fragen.
Michael Freidgeim
7

Es gibt auch eine neue webbasierte App zur Dokumentenerstellung - DocRaptor.com . Scheint einfach zu bedienen und es gibt eine kostenlose Option.

Paul
quelle
7

Update 2018, und verwenden wir die Standard-HTML + CSS = PDF-Gleichung!

Es gibt gute Nachrichten für HTML-zu-PDF-Anforderungen. Wie diese Antwort gezeigt hat , wird der W3C-Standard css-break-3 das Problem lösen ... Es handelt sich um eine Kandidatenempfehlung, die nach Tests 2017 oder 2018 in eine endgültige Empfehlung umgewandelt werden soll.

Als nicht so Standard gibt es Lösungen mit Plugins für C #, wie print-css.rocks zeigt .

Peter Krauss
quelle
1
Die durch print-css.rocks verknüpften Lösungen kosten 2.950,00 USD für PDFreactor, 3800 USD für Prince und 5.000,00 USD für Antenna House Formatter V7. Und Weasyprint scheint für Python zu sein.
MDave
6

Sie können die Print-to-PDF-Funktion von Google Chrome im Headless-Modus verwenden. Ich fand, dass dies die einfachste und zugleich robusteste Methode ist.

var url = "/programming/564650/convert-html-to-pdf-in-net";
var chromePath = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe";
var output = Path.Combine(Environment.CurrentDirectory, "printout.pdf");
using (var p = new Process())
    {
        p.StartInfo.FileName = chromePath;
        p.StartInfo.Arguments = $"--headless --disable-gpu --print-to-pdf={output} {url}";
        p.Start();
        p.WaitForExit();
    }
Leonard AB
quelle
Hey, das ist wirklich cool für eigene Server und VPS. Danke für das Teilen.
mjb
Damit ASP.NET in IIS ein externes Programm mit Schreibzugriffsberechtigung ausführen kann, wird der Anwendungspool> Erweiterte Einstellungen> Identität> auf "LocalSystem" gesetzt
mjb
4

ABCpdf.NET (http://www.websupergoo.com/abcpdf-5.htm)

Wir verwenden und empfehlen.

Sehr gute Komponente, es konvertiert nicht nur eine Webseite wie ein Bild in PDF, sondern konvertiert wirklich Text, Bild, Formatierung usw.

Es ist nicht kostenlos, aber billig.

Christophe Trevisani Chavey
quelle
10
Wir haben dies für ein paar Jahre verwendet und fanden es ziemlich schmerzhaft, es zu verwenden. Schlechte Unterstützung, sehr heikel aufgrund des Wrappers um die IE-Rendering-Engine, schlechte Bildqualität und Komprimierung, eingeschränkte Möglichkeit, die Anforderung anzupassen, die für einige fortgeschrittenere Verwendungsszenarien (wie das Bereitstellen von Cookies und Anforderungsheadern) gestellt wurde. Ich nehme an, wie gut es funktioniert, hängt davon ab, wofür Sie es benötigen.
moribvndvs
3
+1 für ABCPdf. Der vorherige Kommentator darf nicht mit den gleichen Support-Leuten gesprochen haben, die ich gemacht habe - sie haben mir immer gleich zurückgeschrieben und hatten immer eine Lösung für alle Probleme, die wir hatten. Sie unterstützen jetzt die Verwendung von Gecko als Rendering-Engine anstelle von IE. Sie können zur Laufzeit die gewünschte auswählen. Mit ABC können Sie buchstäblich alles tun, was PDF Ihnen ermöglicht.
Steve
12
zu teuer und schlechte Unterstützung. Ich empfehle abcPDF überhaupt nicht.
Vivek
Ich habe es auch in den letzten 6 Jahren benutzt und um fair zu sein, es hat uns gute Dienste geleistet.
toepoke.co.uk
Ist diese Antwort nicht noch eine Wiederholung von stackoverflow.com/a/2182212/471213 ? Ich meine, der andere Typ, der mit dem Programm verbunden ist, hat zumindest ein paar Zeilen Beispielcode
bereitgestellt
4

Unten finden Sie ein Beispiel für die Konvertierung von HTML + CSS in PDF mit iTextSharp (iTextSharp + itextsharp.xmlworker).

using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;


byte[] pdf; // result will be here

var cssText = File.ReadAllText(MapPath("~/css/test.css"));
var html = File.ReadAllText(MapPath("~/css/test.html"));

using (var memoryStream = new MemoryStream())
{
        var document = new Document(PageSize.A4, 50, 50, 60, 60);
        var writer = PdfWriter.GetInstance(document, memoryStream);
        document.Open();

        using (var cssMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssText)))
        {
            using (var htmlMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)))
            {
                XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, htmlMemoryStream, cssMemoryStream);
            }
        }

        document.Close();

        pdf = memoryStream.ToArray();
}
Sergey Malyutin
quelle
Beachten Sie, dass iTextSharp mit XHtml funktioniert und sehr empfindlich auf die Qualität Ihres HTML reagiert. Es würde brechen, wo SelectPdf und HiqPdf nicht würden.
Savage
3

Dies hängt von allen anderen Anforderungen ab, die Sie haben.

Eine wirklich einfache, aber nicht einfach zu implementierende Lösung besteht darin, ein WebBrowser-Steuerelement zum Laden des HTML-Codes zu verwenden und dann mit der Druckmethode auf einem lokal installierten PDF-Drucker zu drucken. Es stehen mehrere kostenlose PDF-Drucker zur Verfügung, und das WebBrowser-Steuerelement ist Teil des .Net-Frameworks.

BEARBEITEN: Wenn Ihr HTML XHtml ist, können Sie PDFizer verwenden , um die Arbeit zu erledigen.

Rune Grimstad
quelle
3

PDF Vision ist gut. Sie müssen jedoch über Full Trust verfügen, um es verwenden zu können. Ich habe bereits eine E-Mail gesendet und gefragt, warum mein HTML-Code nicht auf dem Server konvertiert wurde, aber auf localhost hat es einwandfrei funktioniert.

Mike
quelle
3

Ich bin der Autor des Rotativa-Pakets. Es ermöglicht das Erstellen von PDF-Dateien direkt aus Rasiermesseransichten:

https://www.nuget.org/packages/Rotativa/

Die Verwendung ist einfach und Sie haben die volle Kontrolle über das Layout, da Sie Rasiermesseransichten mit Daten aus Ihrem Model- und ViewBag-Container verwenden können.

Ich habe eine SaaS-Version unter Azure entwickelt. Es macht es noch einfacher, es über WebApi oder eine beliebige .NET-App, einen Dienst, eine Azure-Website oder einen Azure-Webjob zu verwenden, unabhängig davon, was .NET ausgeführt wird.

http://www.rotativahq.com/

Kostenlose Konten verfügbar.

Giorgio Bozio
quelle
Ist dies auf Itextsharp angewiesen und Sie benötigen daher eine Lizenz, damit itextsharp es verwenden kann?
Micah Armantrout
2
@MicahArmantrout Nein, tut es nicht. Es verwendet wkhtmltopdf.exe, um die PDF-Datei zu erstellen. Keine Lizenz erforderlich.
Giorgio Bozio
@MicahArmantrout, ist iTextSharp nicht auch GNU GPL? gnu.org/licenses/agpl.html
Pranav Singh
Wir empfehlen nicht, Versionen vor iText (Sharp) 5 sowohl aus technischen als auch aus rechtlichen Gründen zu verwenden. stackoverflow.com/questions/8517776/itexsharp-license
Micah Armantrout
2

Ich habe auch vor einiger Zeit danach gesucht. Ich bin auf HTMLDOC gestoßen http://www.easysw.com/htmldoc/ , eine kostenlose Open-Source-Befehlszeilen-App, die eine HTML-Datei als Argument verwendet und daraus eine PDF-Datei ausspuckt. Es hat für mich ziemlich gut für mein Nebenprojekt funktioniert, aber es hängt alles davon ab, was Sie tatsächlich brauchen.

Das Unternehmen, das es herstellt, verkauft die kompilierten Binärdateien. Sie können sie jedoch kostenlos herunterladen, aus dem Quellcode kompilieren und kostenlos verwenden. Ich habe es geschafft, eine ziemlich aktuelle Version (für Version 1.9) zu kompilieren, und ich beabsichtige, in ein paar Tagen ein Binärinstallationsprogramm dafür zu veröffentlichen. Wenn Sie also interessiert sind, kann ich einen Link dazu bereitstellen, sobald ich es poste.

Bearbeiten (25.02.2014): Die Dokumente und die Website wurden anscheinend auf http://www.msweet.org/projects.php?Z1 verschoben

Enriquein
quelle
Hallo, können Sie einen Link und auch eine Anleitung zur Verwendung mit c # asp.net bereitstellen danke
user287745
static.persisted Thoughts.com/htmldoc_1.9.1586-setup.exe Beachten Sie, dass dies ein Befehlszeilenprogramm ist. Sie müssen es in Ihrer Anwendung ausführen, damit es funktioniert. Die Dokumentation zu den Argumenten und Vorbehalten finden Sie in Kapitel 4 unter: easysw.com/htmldoc/documentation.php
enriquein
Ich bin mir nicht sicher, wie nützlich dies heutzutage sein würde, aber wenn es Ihnen hilft: dropbox.com/s/9kfn3ttoxs0fiar/htmldoc_1.9.1586-setup.exe
enriquein
Die Website ist nicht mehr in Betrieb.
Tom Winter
2

Sie müssen eine kommerzielle Bibliothek verwenden, wenn Sie ein perfektes HTML-Rendering im PDF-Format benötigen.

ExpertPdf Html To Pdf Converter ist sehr einfach zu bedienen und unterstützt das neueste HTML5 / CSS3. Sie können entweder eine ganze URL in PDF konvertieren:

using ExpertPdf.HtmlToPdf; 
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);

oder eine HTML-Zeichenfolge:

using ExpertPdf.HtmlToPdf; 
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);

Sie haben auch die Möglichkeit, das generierte PDF-Dokument direkt in einem Dateistream auf der Festplatte zu speichern.

charpdevel0p3r
quelle
Sie müssen keine kommerzielle Bibliothek verwenden, wenn Sie ein perfektes HTML-Rendering im PDF-
Format
Ich fange an, das zu glauben. Ich habe 5 der Werbegeschenke ausprobiert und alle haben eine Sache, die es für mich ruiniert. Vom Ersticken über eine Seite, die jenseits einer einfachen Hallo-Welt liegt, bis hin zum schrecklichen Aussehen - ich denke, ich muss etwas Geld für einen echten Konverter aufbringen. Die Beispiele für jedes der kommerziellen Produkte funktionieren tatsächlich so, wie Sie es von der PDF-Datei erwarten würden.
Herb Meehan
@obayhan - Ich würde dir gerne glauben. Vielleicht können Sie uns einen Link zu den Tools geben, die Sie so gut finden.
Peter Wone
@ PeterWone oben gibt es viele Open Source-Alternativen, wie Sie leicht sehen können. Jemanden zu bitten, die gleichen Dinge zu teilen, ist nur Zeit zu stehlen. Aber wenn Sie alle ausprobiert haben und unzufrieden sind, hoffe ich, dass Sie Ihre Kommentare unter ihnen darüber teilen, was Sie nicht zufrieden stellt, und vielleicht würde es dann helfen, das Wissen zu erweitern.
Obayhan
@obayhan - Warum wiederholen, was andere bereits getan haben? Sie lassen sich in drei Kategorien einteilen: nicht wirklich kostenlose, inakzeptable Abhängigkeiten wie wkhtmltopdf oder IE9 und den HTML-Renderer für PDFSharp. HR für PDF # ist das einzige in reinem C # und es macht einen schrecklichen Job beim Paginieren - es rendert eine lange Seite und schneidet sie auf, wobei es häufig durch Textzeilen schneidet. Wenn ich die Zeit finde, den Renderer komplett neu zu schreiben, würde HR for PDF # zweifellos gewinnen: Es ist schnell, kostenlos und hat keine Abhängigkeiten. Aber das wäre ein ganz neuer Renderer, fürchte ich.
Peter Wone
2

Dies ist eine kostenlose Bibliothek und funktioniert sehr einfach: OpenHtmlToPdf

string timeStampForPdfName = DateTime.Now.ToString("yyMMddHHmmssff");

string serverPath = System.Web.Hosting.HostingEnvironment.MapPath("~/FolderName");
string pdfSavePath = Path.Combine(@serverPath, "FileName" + timeStampForPdfName + ".FileExtension");


//OpenHtmlToPdf Library used for Performing PDF Conversion
var pdf = Pdf.From(HTML_String).Content();

//FOr writing to file from a ByteArray
 File.WriteAllBytes(pdfSavePath, pdf.ToArray()); // Requires System.Linq
Abhishek Sengupta
quelle
2

Bisher scheint die beste kostenlose .NET-Lösung die TuesdayPechkin- Bibliothek zu sein, die die native wkhtmltopdf- Bibliothek umgibt .

Ich habe jetzt die Single-Threaded-Version verwendet, um ein paar tausend HTML-Zeichenfolgen in PDF-Dateien zu konvertieren, und es scheint großartig zu funktionieren. Es soll auch in Multithread-Umgebungen (z. B. IIS) funktionieren, aber das habe ich nicht getestet.

Da ich die neueste Version von wkhtmltopdf (0.12.5 zum Zeitpunkt des Schreibens) verwenden wollte, lud ich die DLL von der offiziellen Website herunter, kopierte sie in mein Projektstammverzeichnis, setzte die Ausgabe auf true und initialisierte die Bibliothek wie folgt damit:

var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));

Der obige Code sucht genau nach "wkhtmltox.dll". Benennen Sie die Datei also nicht um. Ich habe die 64-Bit-Version der DLL verwendet.

Stellen Sie sicher, dass Sie die Anweisungen für Multithread-Umgebungen lesen, da Sie sie nur einmal pro App-Lebenszyklus initialisieren müssen, damit Sie sie in einen Singleton oder etwas anderes einfügen müssen.

Shahin Dohan
quelle
1

Hier ist ein Wrapper für wkhtmltopdf.dll von pruiz

Und ein Wrapper für wkhtmltopdf.exe von Codaxy
- auch auf Nuget .

Garfield
quelle
Irgendwelche Dokumente oder Tutorials, wie man sie benutzt? Es gibt dort nur Quellcode ohne jegliche Dokumentation
Burjua
1
Laden Sie den Code herunter und sehen Sie sich die Unit-Tests an. Das sollte Ihnen einige gute Anwendungsbeispiele geben.
Garfield
Hilft nicht wirklich, tatsächlich kann ich nicht einmal Tests der pruiz-Lösung durchführen, um zu funktionieren. Es heißt, No tests are run because no tests are loaded or the selected tests are disabledgoogeln hilft auch nicht
Burjua
@ Burjua Dies hängt normalerweise mit der Version des Testläufers zusammen, den Sie verwenden. Versuchen Sie jedoch, ein Problem auf der Projektseite meines Githubs zu eröffnen, und ich werde versuchen, Ihnen zu helfen.
Pablo Ruiz García
Hallo, dieser Wrapper funktioniert in Ordnung, zeigt aber meine Google-Tortendiagramme nicht an. Bis ich dies lösen kann, müsste ich eine andere Lösung finden.
Andre Lombaard
1

Das beste Tool, das ich gefunden und zum Generieren von PDFs von Javascript und Stilen für gerenderte Ansichten oder HTML-Seiten verwendet habe, ist phantomJS .

Laden Sie die EXE-Datei mit der Funktion rasterize.js herunter, die sich im Stammverzeichnis der exe des Beispielordners befindet, und fügen Sie sie in die Lösung ein.

Es ermöglicht Ihnen sogar, die Datei in einem beliebigen Code herunterzuladen, ohne diese Datei zu öffnen. Außerdem können Sie die Datei herunterladen, wenn die Stile und speziell die Abfrage angewendet werden.

Der folgende Code generiert eine PDF-Datei:

public ActionResult DownloadHighChartHtml()
{
    string serverPath = Server.MapPath("~/phantomjs/");
    string filename = DateTime.Now.ToString("ddMMyyyy_hhmmss") + ".pdf";
    string Url = "http://wwwabc.com";

    new Thread(new ParameterizedThreadStart(x =>
    {
        ExecuteCommand(string.Format("cd {0} & E: & phantomjs rasterize.js {1} {2} \"A4\"", serverPath, Url, filename));
                           //E: is the drive for server.mappath
    })).Start();

    var filePath = Path.Combine(Server.MapPath("~/phantomjs/"), filename);

    var stream = new MemoryStream();
    byte[] bytes = DoWhile(filePath);

    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=Image.pdf");
    Response.OutputStream.Write(bytes, 0, bytes.Length);
    Response.End();
    return RedirectToAction("HighChart");
}



private void ExecuteCommand(string Command)
{
    try
    {
        ProcessStartInfo ProcessInfo;
        Process Process;

        ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + Command);

        ProcessInfo.CreateNoWindow = true;
        ProcessInfo.UseShellExecute = false;

        Process = Process.Start(ProcessInfo);
    }
    catch { }
}


private byte[] DoWhile(string filePath)
{
    byte[] bytes = new byte[0];
    bool fail = true;

    while (fail)
    {
        try
        {
            using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                bytes = new byte[file.Length];
                file.Read(bytes, 0, (int)file.Length);
            }

            fail = false;
        }
        catch
        {
            Thread.Sleep(1000);
        }
    }

    System.IO.File.Delete(filePath);
    return bytes;
}
Shan Khan
quelle
Können Sie Ihren vollständigen Quellcode teilen? Ich bin neu in C #, also stecke ich selbst bei den Importen fest.
Sibi John
1

Sie können auch Spire aktivieren , um HTML to PDFmit diesem einfachen Code zu erstellen

 string htmlCode = "<p>This is a p tag</p>";

//use single thread to generate the pdf from above html code
Thread thread = new Thread(() =>
{ pdf.LoadFromHTML(htmlCode, false, setting, htmlLayoutFormat); });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();

// Save the file to PDF and preview it.
pdf.SaveToFile("output.pdf");
System.Diagnostics.Process.Start("output.pdf");

Ausführlicher Artikel: So konvertieren Sie HTML in PDF in asp.net C #

Satinder singh
quelle
Spire generiert eine PDF-Datei, die nur ein Bild ist. Einige der CSS sind nicht einmal korrekt, z. B. das Ignorieren von fett gedruckten Schriftarten.
Savage
Siehe die Antwort auf meine Frage zum Generieren der PDFs als Bild: e-iceblue.com/forum/nuget-pdf-as-non-image-t6710.html
Savage
Spire ist der vierte, den ich auf dieser Seite ausprobiert habe, und ich denke, es ist der beste, danke.
MDave
1

Als Vertreter der HiQPdf-Software glaube ich, dass die beste Lösung der HiQPdf-HTML-PDF-Konverter für .NET ist . Es enthält die fortschrittlichste HTML5-, CSS3-, SVG- und JavaScript-Rendering-Engine auf dem Markt. Es gibt auch eine kostenlose Version der HTML-zu-PDF-Bibliothek, mit der Sie bis zu 3 PDF-Seiten kostenlos erstellen können. Der minimale C # -Code zum Erstellen einer PDF-Datei als Byte [] aus einer HTML-Seite lautet:

HtmlToPdf htmlToPdfConverter = new HtmlToPdf();

// set PDF page size, orientation and margins
htmlToPdfConverter.Document.PageSize = PdfPageSize.A4;
htmlToPdfConverter.Document.PageOrientation = PdfPageOrientation.Portrait;
htmlToPdfConverter.Document.Margins = new PdfMargins(0);

// convert HTML to PDF 
byte[] pdfBuffer = htmlToPdfConverter.ConvertUrlToMemory(url);

Detailliertere Beispiele für ASP.NET und MVC finden Sie im HiQPdf HTML to PDF Converter-Beispielrepository .

HiQPdf
quelle
1
Erzeugt anständige Ergebnisse, kann jedoch wie SelectPdf einen großen Einfluss auf Ihre Erstellungszeit und die Bereitstellungspaketgröße haben. Es hat meine Visual Studio-Erstellungszeit fast verdoppelt. Es fiel mir auch schwer, meine Seite zu füllen - das HTML war in der Mitte zu klein - in dieser Hinsicht hat SelectPdf einen besseren Job gemacht.
Savage
1
Das Füllen von Seiten mit HTML-Inhalten hängt von der Eigenschaft HtmlToPdf.BrowserWidth ab. Standardmäßig sind es 1200 Pixel, aber Sie können es auf 800 Pixel einstellen, und der HTML-Code sollte die gesamte PDF-Seite sehr gut ausfüllen. Eine Live-Demo und einen Beispielcode dafür finden Sie unter hiqpdf.com/demo/HtmlFittingAndScalingOptions.aspx
HiQPdf
1
Auch keine .NET Core-Unterstützung.
Taylor Buchanan
1

Sehr wahrscheinlich werden die meisten Projekte eine C / C ++ - Engine umschließen, anstatt eine C # -Lösung von Grund auf neu zu implementieren. Probieren Sie Project Gotenberg aus .

Um es zu testen

docker run --rm -p 3000:3000 thecodingmachine/gotenberg:6

Curl Beispiel

curl --request POST \
    --url http://localhost:3000/convert/url \
    --header 'Content-Type: multipart/form-data' \
    --form remoteURL=https://brave.com \
    --form marginTop=0 \
    --form marginBottom=0 \
    --form marginLeft=0 \
    --form marginRight=0 \
    -o result.pdf

C # sample.cs

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
using static System.Console;

namespace HelloWorld
{
    class Program
    {
        public static async Task Main(string[] args)
        {
            try
            {
                var client = new HttpClient();            
                var formContent = new MultipartFormDataContent
                    {
                        {new StringContent("https://duckduckgo.com/"), "remoteURL"},
                        {new StringContent("0"), "marginTop" }
                    };
                var result = await client.PostAsync(new Uri("http://localhost:3000/convert/url"), formContent);
                await File.WriteAllBytesAsync("duckduck.com.pdf", await result.Content.ReadAsByteArrayAsync());
            }
            catch (Exception ex)
            {
                WriteLine(ex);
            }
        }
    }
}

Kompilieren

csc sample.cs -langversion:latest -reference:System.Net.Http.dll && mono ./sample.exe
Alex Nolasco
quelle
0

Probieren Sie diese PDF Duo .Net- Konvertierungskomponente zum Konvertieren von HTML in PDF aus einer ASP.NET- Anwendung aus, ohne zusätzliche DLLs zu verwenden.

Sie können die HTML-Zeichenfolge oder -Datei übergeben oder streamen, um die PDF-Datei zu generieren. Verwenden Sie den folgenden Code (Beispiel C #):

string file_html = @"K:\hdoc.html";   
string file_pdf = @"K:\new.pdf";   
try   
{   
    DuoDimension.HtmlToPdf conv = new DuoDimension.HtmlToPdf();   
    conv.OpenHTML(file_html);   
    conv.SavePDF(file_pdf);   
    textBox4.Text = "C# Example: Converting succeeded";   
}   

Beispiele für Info + C # / VB finden Sie unter: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx

Konstantin
quelle
1
BitDefender meldet: "Malware erkannt! Der Zugriff auf diese Seite wurde blockiert." Ich habe keine Meinung darüber, ob dieser Bericht echt oder falsch positiv ist.
GeoffM
0

Verwenden Sie ABCpdf, um HTML in PDF in C # zu konvertieren .

ABCpdf kann die Rendering-Engines von Gecko oder Trident verwenden, sodass Ihre HTML-Tabelle genauso aussieht wie in FireFox und Internet Explorer.

Es gibt eine Online-Demo von ABCpdf unter www.abcpdfeditor.com. Auf diese Weise können Sie überprüfen, wie Ihre Tabellen zuerst gerendert werden, ohne dass Sie Software herunterladen und installieren müssen.

Zum Rendern ganzer Webseiten benötigen Sie die Funktionen AddImageUrl oder AddImageHtml. Wenn Sie jedoch nur Text im HTML-Stil hinzufügen möchten, können Sie die AddHtml-Funktion wie folgt ausprobieren:

Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();

ABCpdf ist ein kommerzieller Softwaretitel, die Standard Edition ist jedoch häufig kostenlos im Rahmen eines Sonderangebots erhältlich.

AffineMesh
quelle
91
Sie sollten wirklich alle Ihre Antworten schreiben, die Sie für websupergoo arbeiten. Aus der FAQ: However, you must disclose your affiliation with the product in your answers. Also, if a huge percentage of your posts include a mention of your product, you're clearly here for the wrong reasons. Alle Ihre Antworten waren über ABCpdf
jgauffin
12
Autsch! Ich habe ABCpdf vorgeschlagen, weil es eine Komponente ist, mit der ich vertraut bin. Wenn sich ein großer Prozentsatz meiner Beiträge auf PDFs bezieht, liegt dies nur daran, dass ich nicht zu Themen außerhalb meiner Interessengebiete beitrage. Entschuldigung.
AffineMesh
In der Plakatverteidigung macht die Website das Produkt ziemlich gut.
Tom Winter