Convertir HTML en PDF dans .NET

Je veux générer un PDF en transmettant le contenu HTML à une fonction. J’ai utilisé iTextSharp pour cela, mais il ne fonctionne pas bien quand il rencontre des tables et que la mise en page est désordonnée.

Y a-t-il une meilleure façon?

Essayez wkhtmtopdf . C’est le meilleur outil que j’ai trouvé jusqu’à présent.

Pour .NET, vous pouvez utiliser cette petite bibliothèque pour appeler facilement l’utilitaire de ligne de commande wkhtmtopdf.

EDIT: Nouveau moteur de rendu HTML pour PDF à l’aide de PdfSharp

(Après avoir essayé wkhtmltopdf et suggéré de l’éviter)

HtmlRenderer.PdfSharp est une solution 100% entièrement gérée en code C , facile à utiliser, sécurisée pour les threads et surtout GRATUITE ( nouvelle licence BSD ) .

Usage

  1. Téléchargez le package nuget HtmlRenderer.PdfSharp.
  2. Utilisez la méthode exemple.

    public static Byte[] PdfSharpConvert(Ssortingng 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; } 

Un très bon substitut est une version gratuite de iTextSharp

Jusqu’à la version 4.1.6, iTextSharp était sous licence LGPL et les versions jusqu’à la version 4.16 (ou il peut y avoir aussi des forks) sont disponibles sous forme de paquet et peuvent être librement utilisées. Bien sûr, quelqu’un peut utiliser la version payante continue 5+.

J’ai essayé d’intégrer les solutions wkhtmltopdf sur mon projet et j’ai eu beaucoup d’obstacles.

Personnellement, j’éviterais d’ utiliser les solutions basées sur wkhtmltopdf sur les applications hébergées pour les raisons suivantes.

  1. Tout d’abord, wkhtmltopdf est implémenté en C ++ et non en C #, et vous rencontrerez divers problèmes pour l’incorporer dans votre code C #, en particulier lorsque vous basculez entre les versions 32 bits et 64 bits de votre projet. J’ai dû essayer plusieurs solutions de contournement, y compris la construction de projets conditionnels, etc., simplement pour éviter les “exceptions de format invalides” sur différentes machines.
  2. Si vous gérez votre propre machine virtuelle, c’est bien. Mais si votre projet s’exécute dans un environnement contraint comme ( Azure (en fait, c’est impossible avec Azur comme mentionné par l’auteur de mardi), Elastic Beanstalk, etc.), il est cauchemardesque de configurer cet environnement uniquement pour que wkhtmltopdf fonctionne.
  3. wkhtmltopdf crée des fichiers sur votre serveur. Vous devez donc gérer les permissions des utilisateurs et accorder un access “en écriture” à l’emplacement d’exécution de wkhtmltopdf.
  4. Wkhtmltopdf s’exécute en tant qu’application autonome, elle n’est donc pas gérée par votre pool d’applications IIS . Ainsi, vous devez soit l’héberger en tant que service sur une autre machine, soit subir des pics de traitement et une consommation de mémoire considérables avec votre serveur de production.
  5. Il utilise des fichiers temporaires pour générer le fichier pdf, et dans certains cas, comme AWS EC2 qui a un disque dur très lent, les problèmes de performances sont importants.
  6. L’erreur la plus détestée “Impossible de charger la DLL ‘wkhtmltox.dll'” signalée par de nombreux utilisateurs.

— Section PRE Edit —

Pour tous ceux qui souhaitent générer des fichiers pdf à partir de HTML dans des applications / environnements plus simples, je laisse mon ancien message comme suggestion.

MardiPechkin

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

ou spécialement pour les applications Web MVC (mais je pense que vous pouvez l’utiliser dans n’importe quelle application .net)

Rotativa

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

Ils utilisent tous les deux le fichier binary wkhtmtopdf pour convertir le HTML en pdf. Qui utilise le moteur webkit pour rendre les pages afin qu’il puisse également parsingr les feuilles de style CSS .

Ils offrent une intégration transparente facile à utiliser avec C #.

Rotativa peut également générer directement des PDF à partir de n’importe quelle vue de razor .

De plus, pour les applications Web réelles, ils gèrent également la sécurité des threads, etc.

La plupart des convertisseurs HTML-PDF reposent sur IE pour effectuer l’parsing et le rendu HTML. Cela peut casser lorsque l’utilisateur met à jour son IE. En voici un qui ne repose pas sur IE.

Le code est quelque chose comme ça:

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

Comme beaucoup d’autres convertisseurs, vous pouvez transmettre du texte, un nom de fichier ou une URL. Le résultat peut être enregistré dans un fichier ou un stream.

Je recommande fortement NReco , sérieusement. Il a la version gratuite et payante et vaut vraiment la peine. Il utilise wkhtmtopdf en arrière-plan, mais vous n’avez besoin que d’un seul assemblage. Fantastique.

Exemple d’utilisation:

Installer via NuGet .

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

Disclaimer: Je ne suis pas le développeur, juste un fan du projet 🙂

J’ai récemment effectué un PoC concernant la conversion HTML vers PDF et souhaitais partager mes résultats.

Mon préféré est de loin OpenHtmlToPdf

Avantages de cet outil:

  • Très bonne compatibilité HTML (par exemple, c’était le seul outil de mon exemple qui répétait correctement les en-têtes de tableau lorsqu’une table s’étendait sur plusieurs pages)
  • API Fluent
  • Gratuit et OpenSource ( licence Creative Commons Atsortingbution 3.0 )
  • Disponible via NuGet

Autres outils testés:

Winnovative propose une bibliothèque PDF .Net qui prend en charge l’entrée HTML. Ils offrent un essai gratuit illimité. Selon la manière dont vous souhaitez déployer votre projet, cela peut être suffisant.

J’ai utilisé ExpertPDF Html To Pdf Converter . Fait un travail décent Malheureusement, ce n’est pas gratuit.

Il existe également une nouvelle application de génération de documents basée sur le Web – DocRaptor.com . Semble facile à utiliser, et il y a une option gratuite.

Si vous n’avez pas vraiment besoin d’une véritable bibliothèque PDF .Net, il existe de nombreux outils HTML vers PDF gratuits , dont beaucoup peuvent être exécutés à partir d’une ligne de commande.

Une solution consisterait à choisir l’un d’entre eux et à écrire ensuite un enveloppement fin en C #. Par exemple, comme dans ce tutoriel .

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

Nous utilisons et recommandons

Très bon composant, il convertit non seulement une page Web au format PDF comme une image, mais convertit vraiment le texte, l’image, le formatage, etc.

Ce n’est pas gratuit mais c’est pas cher.

Essential PDF peut être utilisé pour convertir HTML en PDF: exemple C # . L’exemple lié ici est basé sur ASP.NET, mais la bibliothèque peut être utilisée à partir de Windows Forms, WPF, Webforms ASP.NET et ASP.NET MVC. La bibliothèque offre la possibilité d’utiliser différents moteurs de rendu HTML: Internet Explorer (par défaut) et WebKit (meilleur résultat).

L’ensemble des contrôles est disponible gratuitement (applications commerciales également) via le programme de licence communautaire si vous êtes admissible. La licence de communauté est le produit complet sans limitations ni filigranes.

Remarque: je travaille pour Syncfusion.

Voici un exemple de conversion de HTML + CSS en PDF en utilisant 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(); } 

Cela dépend des autres exigences que vous avez.

Une solution vraiment simple mais difficilement déployable consiste à utiliser un contrôle WebBrowser pour charger le fichier HTML, puis à utiliser la méthode d’impression pour imprimer sur une imprimante PDF installée localement. Plusieurs imprimantes PDF gratuites sont disponibles et le contrôle WebBrowser fait partie du framework .Net.

EDIT: Si vous utilisez HTML, vous pouvez utiliser PDFizer pour faire le travail.

PDF Vision est bon. Cependant, vous devez avoir Full Trust pour l’utiliser. J’ai déjà envoyé un courriel et demandé pourquoi mon code HTML n’était pas converti sur le serveur, mais cela fonctionnait très bien sur localhost.

J’ai trouvé la bibliothèque suivante plus efficace pour convertir le HTML en pdf.
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/

La mise à jour de 2018, et utilisons l’équation standard HTML + CSS = PDF!

Il y a de bonnes nouvelles pour les demandes HTML à PDF. Comme cette réponse l’a montré , le standard css-break-3 du W3C résoudra le problème … Il s’agit d’une recommandation candidate avec un plan pour devenir une recommandation définitive en 2017 ou 2018, après les tests.

Comme pas si standard il existe des solutions, avec des plugins pour C #, comme le montre print-css.rocks .

Je cherchais aussi ça il y a quelque temps. Je suis tombé sur HTMLDOC http://www.easysw.com/htmldoc/ qui est une application de ligne de commande open source gratuite qui prend un fichier HTML comme argument et en extrait un PDF. Cela a fonctionné pour moi plutôt bien pour mon projet parallèle, mais tout dépend de ce dont vous avez réellement besoin.

L’entreprise qui la fabrique vend les fichiers binarys compilés, mais vous êtes libre de télécharger et de comstackr à partir des sources et de l’utiliser gratuitement. J’ai réussi à comstackr une révision assez récente (pour la version 1.9) et j’ai l’intention de publier un programme d’installation binary dans quelques jours. Si cela vous intéresse, je peux vous fournir un lien dès que je le posterai.

Edit (25/02/2014): On dirait que les documents et le site ont été déplacés vers http://www.msweet.org/projects.php?Z1

Vous devez utiliser une bibliothèque commerciale si vous avez besoin d’un rendu HTML parfait en pdf.

ExpertPdf Html To Pdf Converter est très facile à utiliser et prend en charge le dernier html5 / css3. Vous pouvez soit convertir une URL entière en pdf:

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

ou une chaîne html:

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

Vous avez également la possibilité de sauvegarder directement le document pdf généré dans un stream de fichiers sur le disque.

Je suis l’auteur du package Rotativa. Il permet de créer des fichiers PDF directement à partir de vues de razor:

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

Trivial à utiliser et vous avez un contrôle total sur la mise en page car vous pouvez utiliser des vues de razor avec les données de votre conteneur Model et ViewBag.

J’ai développé une version SaaS sur Azure. Il est encore plus facile de l’utiliser à partir de WebApi ou de toute autre application .Net, service, site Web Azure, webjob Azure, quelle que soit l’exécution de .Net.

http://www.rotativahq.com/

Comptes gratuits disponibles.

Voici un wrapper pour wkhtmltopdf.dll par pruiz

Et un wrapper pour wkhtmltopdf.exe par Codaxy
– aussi sur nuget .

Le meilleur outil que j’ai trouvé et utilisé pour générer des PDF de JavaScript et des styles rendus des vues ou des pages HTML est phantomJS .

Téléchargez le fichier .exe avec la fonction rasterize.js trouvée dans la racine de exe du dossier d’exemple et mettez la solution à l’intérieur.

Il vous permet même de télécharger le fichier dans n’importe quel code sans ouvrir ce fichier. Il permet également de télécharger le fichier lorsque les styles et spécialement jquery sont appliqués.

Le code suivant génère un fichier PDF:

 public ActionResult DownloadHighChartHtml() { ssortingng serverPath = Server.MapPath("~/phantomjs/"); ssortingng filename = DateTime.Now.ToSsortingng("ddMMyyyy_hhmmss") + ".pdf"; ssortingng Url = "http://wwwabc.com"; new Thread(new ParameterizedThreadStart(x => { ExecuteCommand(ssortingng.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(ssortingng 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(ssortingng 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; } 

Essayez ce composant de conversion PDF Duo .Net pour convertir HTML en PDF à partir d’une application ASP.NET sans utiliser de DLL supplémentaires.

Vous pouvez transmettre la chaîne ou le fichier HTML ou le stream pour générer le fichier PDF. Utilisez le code ci-dessous (exemple C #):

 ssortingng file_html = @"K:\hdoc.html"; ssortingng 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"; } 

Vous trouverez des exemples d’informations + C # / VB sur: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx

Ok, en utilisant ces technologies ….

  • Projet FlyingSaucer
  • IKVM
  • Bout
  • Huer

Le src peut être téléchargé ici, il a besoin de nant

Avec Winnovative HTML to PDF Converter, vous pouvez convertir une chaîne HTML en une seule ligne

 byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlSsortingng, baseUrl); 

L’URL de base est utilisée pour résoudre les images référencées par les URL relatives dans la chaîne HTML. Vous pouvez également utiliser des URL complètes en HTML ou incorporer des images en utilisant src = “data: image / png” pour la balise image.

En réponse au commentaire de l’utilisateur «fubaar» sur le convertisseur Winnovative, une correction est nécessaire. Le convertisseur n’utilise pas IE comme moteur de rendu. Il ne dépend en fait d’aucun logiciel installé et le rendu est compatible avec le moteur WebKit.

Si vous souhaitez que l’utilisateur télécharge le pdf de la page rendue dans le navigateur, la solution la plus simple est de

 window.print(); 

côté client, il incitera l’utilisateur à sauvegarder le pdf de la page en cours. Vous pouvez également personnaliser l’apparence de pdf en liant le style

  

print.css est appliqué au HTML lors de l’impression.

Limitation

Vous ne pouvez pas stocker le fichier côté serveur. Invite utilisateur à imprimer la page qu’il devait enregistrer manuellement la page. La page doit être rendue dans un onglet.

PDFmyURL a récemment publié un composant .NET pour la conversion de page Web / HTML à PDF. Cela a une interface très conviviale, par exemple:

 PDFmyURL pdf = new PDFmyURL("yourlicensekey"); pdf.ConvertURL("http://www.example.com", Application.StartupPath + @"\example.pdf"); 

Documentation: Documentation du composant PDFmyURL .NET

Disclaimer: Je travaille pour l’entreprise propriétaire de PDFmyURL

Déjà si vous utilisez itextsharp dll, pas besoin d’append des dll tiers (plugin), je pense que vous utilisez htmlworker au lieu d’utiliser xmlworker, vous pouvez facilement convertir votre HTML en pdf.

Certains CSS ne fonctionneront pas, ils sont supportés CSS
Complet Expliquer avec exemple Référence Cliquez ici

  MemoryStream memStream = new MemoryStream(); TextReader xmlSsortingng = new SsortingngReader(outXml); using (Document document = new Document()) { PdfWriter writer = PdfWriter.GetInstance(document, memStream); //document.SetPageSize(iTextSharp.text.PageSize.A4); document.Open(); byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(outXml); MemoryStream ms = new MemoryStream(byteArray); XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, ms, System.Text.Encoding.UTF8); document.Close(); } Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf"); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.BinaryWrite(memStream.ToArray()); Response.End(); Response.Flush(); 

Vous pouvez également vérifier Spire , il vous permet de créer du HTML to PDF avec ce simple morceau de code

  ssortingng htmlCode = "

This is ap tag

"; //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");

Article détaillé: Comment convertir HTML en PDF en asp.net C #

Au lieu d’parsingr le HTML directement au format PDF, vous pouvez créer une bitmap de votre page HTML, puis insérer la bitmap dans votre PDF, en utilisant par exemple iTextSharp .

Voici un code pour obtenir une bitmap d’une URL. Je l’ai trouvé quelque part ici sur SO, si je trouve la source, je vais la relier.

 public System.Drawing.Bitmap HTMLToImage(Ssortingng strHTML) { System.Drawing.Bitmap myBitmap = null; System.Threading.Thread myThread = new System.Threading.Thread(delegate() { // create a hidden web browser, which will navigate to the page System.Windows.Forms.WebBrowser myWebBrowser = new System.Windows.Forms.WebBrowser(); // we don't want scrollbars on our image myWebBrowser.ScrollBarsEnabled = false; // don't let any errors shine through myWebBrowser.ScriptErrorsSuppressed = true; // let's load up that page! myWebBrowser.Navigate("about:blank"); // wait until the page is fully loaded while (myWebBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete) System.Windows.Forms.Application.DoEvents(); myWebBrowser.Document.Body.InnerHtml = strHTML; // set the size of our web browser to be the same size as the page int intScrollPadding = 20; int intDocumentWidth = myWebBrowser.Document.Body.ScrollRectangle.Width + intScrollPadding; int intDocumentHeight = myWebBrowser.Document.Body.ScrollRectangle.Height + intScrollPadding; myWebBrowser.Width = intDocumentWidth; myWebBrowser.Height = intDocumentHeight; // a bitmap that we will draw to myBitmap = new System.Drawing.Bitmap(intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding); // draw the web browser to the bitmap myWebBrowser.DrawToBitmap(myBitmap, new System.Drawing.Rectangle(0, 0, intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding)); }); myThread.SetApartmentState(System.Threading.ApartmentState.STA); myThread.Start(); myThread.Join(); return myBitmap; } 

As a representative of HiQPdf Software I believe the best solution is HiQPdf HTML to PDF converter for .NET . It contains the most advanced HTML5, CSS3, SVG and JavaScript rendering engine on market. There is also a free version of the HTML to PDF library which you can use to produce for free up to 3 PDF pages. The minimal C# code to produce a PDF as a byte[] from a HTML page is:

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

You can find more detailed examples both for ASP.NET and MVC in HiQPdf HTML to PDF Converter examples repository .