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?
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?
Antworten:
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
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 .
--- PRE Edit Section ---
Für alle, die in einfacheren Anwendungen / Umgebungen PDF aus HTML generieren möchten, lasse ich meinen alten Beitrag als Vorschlag.
https://www.nuget.org/packages/TuesPechkin/
oder speziell für MVC- Webanwendungen (aber ich denke, Sie können es in jeder .net-Anwendung verwenden)
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.
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.
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:
Andere getestete Tools:
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");
background-color
. OpenHtmlToPdf funktioniert perfekt kostenlos.
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).
GemBox.Document
PDF Metamorphosis .Net
HtmlRenderer.PdfSharp
PuppenspielerSharp
EO.Pdf
WnvHtmlToPdf_x64
IronPdf
Spire.PDF
Free Spire.PDF für .NET (Community-Version)
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
Zetpdf
PDFtron
WkHtmlToXSharp
SelectPDF
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
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.
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 :)
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.
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.
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 .
Ich habe ExpertPDF Html To Pdf Converter verwendet . Macht einen anständigen Job. Leider ist es nicht kostenlos.
Es gibt auch eine neue webbasierte App zur Dokumentenerstellung - DocRaptor.com . Scheint einfach zu bedienen und es gibt eine kostenlose Option.
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 .
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();
}
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.
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();
}
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.
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.
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.
Kostenlose Konten verfügbar.
Ich fand die folgende Bibliothek effektiver bei der Konvertierung von HTML in PDF.
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/
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
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.
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
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.
Hier ist ein Wrapper für wkhtmltopdf.dll von pruiz
Und ein Wrapper für wkhtmltopdf.exe von Codaxy
- auch auf Nuget .
No tests are run because no tests are loaded or the selected tests are disabled
googeln hilft auch nicht
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;
}
Sie können auch Spire aktivieren , um HTML to PDF
mit 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 #
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 .
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
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
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.
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