Convertir HTML en PDF in.NET

je veux générer un PDF en passant des contenus HTML à une fonction. J'ai fait usage de iTextSharp pour cela, mais il ne fonctionne pas bien quand il rencontre des tables et la mise en page devient juste brouillon.

y a-t-il un meilleur moyen?

361
demandé sur Amedee Van Gasse 2009-02-19 13:21:22

30 réponses

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

pour .NET, vous pouvez utiliser ce petite bibliothèque pour invoquer facilement l'utilitaire de ligne de commande wkhtmtopdf.

170
répondu Marko 2015-03-25 08:53:35

EDIT: Nouvelle Suggestion HTML Convertisseur PDF en utilisant PdfSharp

(après avoir essayé le wkhtmltopdf et avoir suggéré de l'éviter)

HtmlRenderer.PdfSharp est un 100% entièrement C code géré , facile à utiliser, thread safe et surtout gratuit ( nouvelle licence BSD ) solution.

Utilisation

  1. Télécharger HtmlRenderer.PdfSharp nuget package.
  2. Utiliser L'Exemple De Méthode.

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

une très bonne alternative est une version libre de iTextSharp 151960920"

Jusqu'à la version 4.1.6 iTextSharp a été autorisé sous licence LGPL et les versions jusqu'à 4.16 (ou il peut y avoir aussi des fourches) sont disponibles sous forme de paquets et peuvent être librement utilisées. Bien sûr, quelqu'un peut utiliser la suite 5+ version payée .

j'ai essayé d'intégrer wkhtmltopdf "151930920 des solutions" sur mon projet et avait un tas d'obstacles.

j'éviterais personnellement d'utiliser des solutions basées sur wkhtmltopdf sur hébergé D'applications d'entreprise pour les raisons suivantes.

  1. tout D'abord wkhtmltopdf est C++ implémenté et non C#, et vous l'expérience de divers problèmes l'intégration dans votre code C# , surtout en passant entre 32bit et 64bit construit de votre projet. Dû essayer plusieurs solutions, y compris conditionnel construction de projets, etc. etc. juste pour éviter " les exceptions de format invalides" sur des machines différentes.
  2. Si vous gérez votre propre la machine virtuelle est ok. Mais si votre projet est en cours d'exécution dans un environnement contraint comme ( Azur (En fait est impossible avec l'Azur comme mentionné par le TuesPenchin auteur) , Elastic Beanstalk etc) c'est un cauchemar de configurer cet environnement uniquement pour que wkhtmltopdf fonctionne.
  3. wkhtmltopdf crée des fichiers dans votre serveur donc vous devez Gérer les permissions de l'utilisateur et accorder " écrire" accès à l'endroit où wkhtmltopdf est en cours d'exécution.
  4. Wkhtmltopdf fonctionne comme une application autonome, de sorte que son Non géré par votre groupe d'applications IIS . Donc, vous devez soit l'héberger comme un service sur une autre machine ou vous aurez l'expérience énorme traiter les pointes et la consommation de mémoire avec votre production serveur.
  5. il utilise des fichiers temp pour générer le pdf, et dans les cas comme AWS EC2 qui a lenteur du disque i/o, c'est une grosse performance problème.
  6. le plus détesté" incapable de charger DLL " wkhtmltox.dll " erreur signalée par de nombreux utilisateurs.

--- AVANT de Modifier l'Article ---

pour quiconque veut générer des pdf à partir de html dans des applications / environnements plus simples, je laisse mon ancien poste comme suggestion.

TuesPechkin

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

ou spécialement pour MVC Applications Web (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 wkhtmtopdf binaire pour convertir html en pdf. Qui utilise le moteur webkit pour rendre les pages afin qu'il puisse également analyser feuilles de style css .

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

Rotativa peut également générer directement des fichiers PDF à partir de n'importe quelle vue Razor .

en outre, pour les applications web du monde réel, ils gèrent également la sécurité des threads, etc...

146
répondu Anestis Kivranoglou 2016-10-24 10:34:55

la plupart des convertisseurs HTML vers PDF s'appuient sur IE pour effectuer l'analyse et le rendu HTML. Cela peut se casser lorsque l'utilisateur met à jour son IE. Ici est celui qui ne s'appuie pas sur IE.

le code est quelque chose comme ceci:

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

comme beaucoup d'autres convertisseurs, vous pouvez passer le texte, le nom de fichier, ou L'Url. Le résultat peut être sauvegardé dans un fichier ou un flux de données.

30
répondu Jason 2013-09-29 07:21:40

je recommande fortement NReco , sérieusement. Il a la version gratuite et payante, et en vaut vraiment la peine. Il utilise wkhtmtopdf en arrière-plan, mais vous avez juste besoin d'un montage. Fantastique.

exemple d'utilisation:

Install via NuGet .

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

Avertissement: je ne suis pas le développeur, juste un fan de ce projet :)

20
répondu Kim Tranjan 2015-04-23 19:53:38

j'ai récemment effectué un PoC concernant la conversion HTML en PDF et je voulais partager mes résultats.

mon préféré de loin est OpenHtmlToPdf

avantages de cet outil:

  • très bonne compatibilité HTML (par exemple, c'était le seul outil dans mon exemple qui répétait correctement les en-têtes de table quand une table couvrait plusieurs pages)
  • Fluent API
  • Free and OpenSource ( Creative Commons Attribution 3.0 license )
  • disponible via NuGet

autres outils testés:

19
répondu Markus 2016-08-18 11:13:10

Winnovative offre une bibliothèque PDF.net qui prend en charge l'entrée HTML. Ils offrent un "illimité 151930920" d'essai gratuit . Selon la façon dont vous souhaitez déployer votre projet, cela peut être suffisant.

13
répondu Stewart 2009-02-19 11:46:55

I used ExpertPDF Html To Pdf Converter . Un emploi décent. Malheureusement, ce n'est pas gratuit.

7
répondu charpdevel0p3r 2010-10-18 12:30:00

il y a aussi une nouvelle application web de génération de documents - DocRaptor.com . Semble facile à utiliser, et il ya une option gratuite.

7
répondu Paul 2010-10-28 06:35:09

si vous n'avez pas vraiment besoin d'une véritable bibliothèque.Net PDF, il existe de nombreux HTML gratuit à outils PDF , dont beaucoup peuvent s'exécuter à partir d'une ligne de commande.

une solution serait de choisir l'une de celles-ci et ensuite d'écrire un emballage mince autour de cela en C#. Par exemple, comme fait dans ce tutoriel .

6
répondu Stewart 2009-02-19 11:55:41

mise à jour de 2018, et utilisons L'équation HTML+CSS=PDF standard!

il y a de bonnes nouvelles pour les demandes HTML à PDF. Comme cette réponse a montré , la norme W3C css-break-3 résoudra le problème ... Il s'agit d'une recommandation Candidate avec le plan de se transformer en Recommandation définitive en 2017 ou 2018, après des tests.

comme pas-so-standard il y a des solutions, avec des plugins pour C#, comme le montre print-css.roches .

5
répondu Peter Krauss 2018-03-16 10:18:38

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

Nous utilisons et recommandons.

très bon composant, il non seulement convertir une page Web en PDF comme une image, mais vraiment convertir le texte, l'image, le formatage, etc...

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

4
répondu Christophe Trevisani Chavey 2011-12-28 23:00:39

Essentiel PDF peut être utilisé pour convertir HTML en PDF: C# exemple . L'échantillon relié ici est ASP.NET basé, mais la bibliothèque peut être utilisé à partir de formulaires Windows, WPF, ASP.NET les formulaires Web, 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 (meilleure sortie).

l'ensemble des commandes est disponible gratuitement (applications commerciales aussi) par le biais du programme licence communautaire si vous êtes admissible. La licence communautaire est le produit complet sans limitations ni filigranes.

Note: je travaille pour Syncfusion.

4
répondu Davis Jebaraj 2015-11-17 20:22:33

ci-dessous est un exemple de conversion 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();
}
4
répondu Sergey Malyutin 2016-06-23 08:29:14

cela dépend de toutes les autres exigences que vous avez.

une solution vraiment simple mais pas facilement déployable est d'utiliser un contrôle WebBrowser pour charger le Html et ensuite en utilisant la méthode D'impression à une imprimante PDF installée localement. Plusieurs imprimantes PDF sont disponibles gratuitement et le contrôle WebBrowser fait partie du framework .Net.

EDIT: Si vous Html est XHtml vous pouvez utiliser PDFizer pour faire le travail.

3
répondu Rune Grimstad 2009-02-19 10:31:54

PDF Vision is good. Cependant, vous devez avoir une pleine confiance pour l'utiliser. J'ai déjà envoyé un e-mail et j'ai demandé Pourquoi mon HTML n'était pas converti sur le serveur mais il fonctionnait très bien sur localhost.

3
répondu Mike 2011-10-28 09:24:14

j'ai trouvé la bibliothèque suivante plus efficace dans la conversion html en pdf.

nuget : https://www.nuget.org/packages/Select.HtmlToPdf /

3
répondu Praveen Kumar Thalluri 2016-12-03 12:18:25

je cherchais aussi ça il y a un moment. Je suis tombé sur HTMLDOC http://www.easysw.com/htmldoc / qui est une application libre en ligne de commande open source qui prend un fichier HTML comme argument et en crache un PDF. Ça a plutôt bien marché pour moi pour mon projet secondaire, mais ça dépend de ce dont tu as besoin.

La société qui le rend vend les binaires compilés, mais vous êtes libre de télécharger et compiler à partir des sources et de l'utiliser pour gratuit. J'ai réussi à compiler une récente révision (pour la version 1.9) et j'ai l'intention de libérer un installateur binaire pour dans quelques jours, donc si vous êtes intéressés, je peux fournir un lien dès que je l'ai poster.

Modifier (2/25/2014): il Semble que la documentation et le site a déménagé à http://www.msweet.org/projects.php?Z1

2
répondu enriquein 2014-02-25 21:34:07

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 il soutient la dernière html5/css3. Vous pouvez 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().GetPdfBytesFromHtmlString(html, baseUrl);

vous avez également l'alternative pour enregistrer directement le document pdf généré à un flux de fichier sur le disque.

2
répondu charpdevel0p3r 2014-11-14 14:08:50

je suis l'auteur du paquet Rotativa. Il permet de créer des fichiers PDF directement à partir de vues de rasoir:

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

Trivial à utiliser et vous avez le plein contrôle sur la mise en page puisque vous pouvez utiliser des vues de rasoir avec des données de votre modèle et conteneur de sac de visualisation.

j'ai développé une version SaaS sur L'Azur. Il est encore plus facile de l'utiliser à partir de WebApi ou de n'importe quelle application., service, Site Azure, Azure webjob, tout ce qui court .Net.

http://www.rotativahq.com /

comptes gratuits disponibles.

2
répondu Giorgio Bozio 2016-06-10 15:06:13

Voici une enveloppe pour wkhtmltopdf.dll par pruiz

Et "151950920 un" wrapper pour wkhtmltopdf.exe par Codaxy
151980920" - aussi sur nuget .

1
répondu Garfield 2012-01-11 00:47:00

Meilleur Outil que j'ai trouvé et utilisé pour la génération de PDF de javascript et de styles de rendu des vues ou des pages html est phantomJS .

Téléchargez le .fichier exe avec le rastérize.fonction js trouvée à la racine de exe du dossier d'exemple et mis à l'intérieur de la solution.

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 appliquer.

code suivant générer le fichier PDF:

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;
}
1
répondu Shan Khan 2015-03-18 10:12:39

Try this PDF Duo .Net converting component for converting HTML to PDF from ASP.NET application sans utiliser de dlls supplémentaires.

vous pouvez passer la chaîne HTML ou le fichier, ou le flux pour générer le PDF. Utilisez le code ci-dessous (exemple 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";   
}   

Info + C#/VB exemples que vous pouvez trouver à: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx

0
répondu Constantine 2010-10-01 09:41:57

Ok, en utilisant cette technologie....

Le src peut être téléchargé à partir de ici besoins nant

0
répondu jjchiw 2014-01-09 19:32:59

avec Winnovative HTML to PDF convertisseur vous pouvez convertir une chaîne HTML dans une ligne simple

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

L'URL de base est utilisée pour résoudre les images référencées par des URLs relatives dans la chaîne HTML. Vous pouvez également utiliser les URLs complètes en HTML ou intégrer des images en utilisant src="data:image/png" pour le tag d'image.

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

0
répondu Winnovative 2014-09-15 11:45:01

si vous voulez que l'utilisateur télécharge le pdf de la page rendue dans le navigateur alors la solution la plus facile au problème est

window.print(); 

côté client, il invite l'utilisateur à enregistrer pdf de la page courante. Vous pouvez également personnaliser l'apparence de pdf en liant le style

<link rel="stylesheet" type="text/css" href="print.css" media="print">

impression.css est appliqué au html lors de l'impression.

Limitation

vous ne pouvez pas stocker le fichier côté serveur. L'invite d'utilisateur pour imprimer la page qu'il a dû enregistrer la page manuellement. La Page doit être rendue dans un onglet.

0
répondu Ravi Kumar Mistry 2015-03-18 09:28:42

PDFmyURL a récemment publié un composant .NET pour la conversion de page Web / HTML en PDF ainsi. 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: PDFmyURL .net component documentation

avertissement: je travaille pour la société qui possède PDFmyURL

0
répondu user1914292 2015-09-08 11:33:28

déjà si vous utilisez itextsharp dll, pas besoin d'ajouter dll de tiers(plugin), je pense que vous utilisez htmlworker au lieu de lui utiliser xmlworker vous pouvez facilement convertir votre html en pdf.



Certains css ne fonctionneront pas ils sont CSS pris en charge

explication complète avec Exemple de référence Cliquez ici



        MemoryStream memStream = new MemoryStream();
        TextReader xmlString = new StringReader(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();
0
répondu Merbin Joe 2016-02-24 07:57:13

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

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

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

0
répondu Satinder singh 2016-05-05 11:52:03

au lieu de parser HTML directement en PDF, vous pouvez créer un Bitmap de votre page HTML et ensuite insérer le Bitmap dans votre PDF, en utilisant par exemple iTextSharp .

voici un code pour obtenir un Bitmap D'une URL. Je l'ai trouvé quelque part ici, donc si je trouve la source, je vais le relier.

public System.Drawing.Bitmap HTMLToImage(String 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;
}
-1
répondu Jimmy Mattsson 2014-06-11 09:22:38

en tant que représentant de HiQPdf Software je crois que la meilleure solution est HiQPdf HTML to PDF converter pour .NET . Il contient les plus avancés HTML5, CSS3, SVG et JavaScript moteur de rendu sur le marché. Il y a aussi une version gratuite de la bibliothèque HTML à PDF que vous pouvez utiliser pour produire gratuitement jusqu'à 3 pages PDF. Le code C # minimal pour produire un PDF comme byte [] à partir d'une page HTML est:

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

vous pouvez trouver des exemples plus détaillés à la fois pour ASP.NET et MVC dans HiQPdf HTML to Pdf Converter examples repository .

-1
répondu HiQPdf 2016-12-02 11:48:59