Convertir HTML en PDF dans .NET


425

Je veux générer un PDF en passant du contenu HTML à une fonction. J'ai utilisé iTextSharp pour cela, mais il ne fonctionne pas bien lorsqu'il rencontre des tables et que la mise en page devient tout simplement désordonnée.

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


Vous pouvez utiliser GemBox.Document pour cela. Ici aussi , vous pouvez trouver un exemple de code pour convertir un fichier HTML en un fichier PDF.
Mario Z

Quelle version d'iTextSharp utilisez-vous et pourriez-vous partager votre html?
Amedee Van Gasse

Toujours pas de réponse à ma demande d'informations complémentaires. Veuillez également ajouter si vous utilisez HTMLWorker ou XMLWorker.
Amedee Van Gasse

Qu'en est-il du noyau .net?
Piero Alberto

SEPT 2019: j'ai ajouté une nouvelle réponse, certaines des options répertoriées sont gratuites, d'autres payantes et quelques-unes sont disponibles sous la forme .net core stackoverflow.com/questions/564650/…
Mauricio Gracia Gutierrez

Réponses:


198

EDIT: nouvelle suggestion HTML Renderer pour PDF en utilisant PdfSharp

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

HtmlRenderer.PdfSharp est un code 100% entièrement géré en C # , facile à utiliser, sûr pour les threads et surtout GRATUIT ( nouvelle licence BSD ) .

Usage

  1. Téléchargez le package de nuget HtmlRenderer.PdfSharp.
  2. Utilisez un 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 gratuite d' iTextSharp

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

J'ai essayé d'intégrer des solutions wkhtmltopdf sur mon projet et j'ai eu un tas d'obstacles.

Personnellement, j'éviterais d' utiliser des solutions basées sur wkhtmltopdf sur les applications Hosted Enterprise 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'intégrer dans votre code C #, en particulier lors du basculement entre les versions 32 bits et 64 bits de votre projet. J'ai dû essayer plusieurs solutions de contournement, y compris la construction de projet conditionnelle, etc., etc., juste pour éviter les "exceptions de format invalides" sur différentes machines.
  2. Si vous gérez votre propre machine virtuelle, c'est ok. Mais si votre projet s'exécute dans un environnement contraint comme ( Azure (en fait, c'est impossible avec azure comme mentionné par l'auteur du mardi ), Elastic Beanstalk, etc.), c'est un cauchemar de configurer cet environnement uniquement pour que wkhtmltopdf fonctionne.
  3. wkhtmltopdf crée des fichiers sur votre serveur, vous devez donc gérer les autorisations des utilisateurs et accorder un accès en "écriture" à l'endroit où wkhtmltopdf s'exécute.
  4. Wkhtmltopdf s'exécute en tant qu'application autonome, il n'est donc pas géré par votre pool d'applications IIS . Vous devez donc soit l'héberger en tant que service sur une autre machine, soit subir des pics de traitement et une consommation de mémoire au sein de votre serveur de production.
  5. Il utilise des fichiers temporaires pour générer le pdf, et dans des cas comme AWS EC2 qui a des E / S de disque vraiment lentes, c'est un gros problème de performances.
  6. L'erreur "Impossible de charger la DLL 'wkhtmltox.dll'" la plus détestée a été signalée par de nombreux utilisateurs.

--- Section PRE Edit ---

Pour tous ceux qui veulent générer du 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 binaire wkhtmtopdf pour convertir le html en pdf. Qui utilise le moteur webkit pour le rendu des pages afin qu'il puisse également analyser 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 Razor .

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


2
Merci d'avoir mis à jour votre message. Je vais essayer PdfSharp. Tu m'as sauvé beaucoup de temps.
John Henckel

1
PdfSharp est bon en termes de performances, mais il n'a pas rendu les flotteurs correctement pour moi. Heureusement, je pourrais changer le balisage pour utiliser de bonnes vieilles tables, PdfSharp les gère bien.
Gebb

3
Nous avons essayé HtmlRenderer. C'était vraiment rapide quand on ne chargeait aucun CSS. Mais lorsque nous avons essayé d'appliquer CSS (Bootstrap plus certains sur mesure), l'analyse CSS a pris un certain temps (que nous pourrions probablement atténuer), et le rendu était complètement différent de la page Web.
OutstandingBill

1
@ user2347528 - en regardant la source de HtmlRenderer.PdfSharp, il n'y a aucun moyen de résoudre ce problème - cela prend juste la hauteur totale de la page et des clips dans chaque page PDF, ce qui est vraiment regrettable - cela signifie que les fichiers PDF de plusieurs pages avec cette bibliothèque peuvent vraiment '' t être fait.
M. Bungle

3
BS. Cela crée une image du HTML et ajoute l'image dans le fichier pdf. Ce n'est pas du tout un vrai PDF. En outre, le PDF est un format de graphiques vectoriels - vous pouvez faire défiler presque infiniment - bien sûr, sauf si le PDF se compose d'un graphique raster, ce que cette bibliothèque produit.
Stefan Steiger

191

Mise à jour: je recommanderais maintenant PupeteerSharp sur wkhtmltopdf.

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.


17
prend en charge .NET ??
Kiquenet

6
c'est un exécutable autonome. Vous pouvez le lancer en tant que processus, en passant une URL du document HTML comme argument.
Marek

46
@bamccaig Je l'ai déjà =) github.com/gmanny/Pechkin Il expose toutes les fonctions utilisables de la bibliothèque et a également un wrapper pour une utilisation dans plusieurs threads. Et c'est sur NuGet.
Gman


7
@ AdamMoszczyński: De Wikipédia : La LGPL permet aux développeurs et aux entreprises d'utiliser et d'intégrer le logiciel LGPL dans leur propre logiciel (même propriétaire) sans être obligé (par les termes d'un copyleft fort) de libérer le code source de leurs propres composants logiciels.
Oliver

34

J'ai récemment effectué un PoC concernant la conversion HTML en PDF et je voulais 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 dans mon exemple qui répétait correctement les en-têtes de tableau lorsqu'un tableau s'étalait sur plusieurs pages)
  • API Fluent
  • Gratuit et OpenSource ( licence Creative Commons Attribution 3.0 )
  • Disponible via NuGet

Autres outils testés:


+1 pour cela, j'ai testé HtmlRenderer pour PdfSharp mais j'ai rencontré trop de problèmes avec les sauts de page. Je peux vivre avec la dépendance à wkHtmlToPdf dans ce projet, donc cette solution était géniale - elle rend le HTML magnifiquement.
jmdon

Semblait magnifique, mais wow cela a pris beaucoup de temps. 30 secondes, avec un thème bootstrap et ainsi de suite, une page assez simple, mais néanmoins.
Nicholas Petersen

Stephanie d'IronPDF ici. Voici un exemple de code sur la façon d'utiliser IronPDF pour convertir du HTML en PDF en C #. Vous trouverez plus d'informations dans notre tutoriel html en pdf sur notre site Web. 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

J'ai utilisé iText pdfHtml mais il ne prend pas en charge background-color. OpenHtmlToPdf fonctionne parfaitement gratuitement.
Hp93

Je suis d'accord avec la supériorité d'OpenHtmlToPdf. En outre, il prend en charge la fusion de .exe et .dll avec ILMerge.
saygley

30

Dernière mise à jour: mars 2020

Voici la liste des options de conversion HTML en PDF dans .NET que j'ai rassemblées (certaines gratuites, d'autres payantes)

Si aucune des options ci-dessus ne vous aide, vous pouvez toujours rechercher les packages NuGet https://www.nuget.org/packages?q=html+pdf


1
en avez-vous testé la performance? nous cherchons à améliorer les temps de conversion actuels et explorons d'autres bibliothèques pour ces avantages de performance
frno

Je n'ai pas fait de comparaison de performances, en particulier parce que la liste est si longue - peut-être que quelqu'un a déjà fait une "revue des performances des bibliothèques .net de génération PDF" ou similaire
Mauricio Gracia Gutierrez

28

La plupart des convertisseurs HTML en PDF s'appuient sur IE pour effectuer l'analyse et le rendu HTML. Cela peut se casser lorsque l'utilisateur met à jour son IE. En voici un qui ne repose pas sur IE.

Le code est quelque chose comme ceci:

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

Comme de nombreux 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 flux.


35
ce n'est pas utile car vous devez acheter la bibliothèque
d1jhoni1b

47
d1jhoni1b, en quoi cela ne le rend-il pas utile? S'il s'agit d'un outil payant, il pourrait être considéré comme coûteux, mais pas inutile sur ce seul critère.
Don Rolling

3
C'est vrai que EO.Pdf n'utilise pas IE. Mais il semble engendrer des instances 32 bits d'un navigateur webkit en arrière-plan. Vérifiez votre liste de processus et vous les verrez comme des instances rundll32.exe pointant vers la DLL EO.PDF. Donc, c'est toujours un peu hacky à mon avis.
Matt

1
Il ne prend pas en charge media = "print", ce qui est vraiment douloureux.
Marat Faskhiev

15
Licence de développeur unique pour 650 $. C'est cher.
Abhijeet Nagre

25

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

Exemple d'utilisation:

Installez 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, je suis juste un fan du projet :)


3
Semble en effet assez utile. A noter qu'aujourd'hui (05/10/15), c'est le wrapper .Net le plus téléchargé pour wkhtmtopdf (en tant que package Nuget).
ken2k

3
J'ai essayé, malheureusement je n'ai pas pu le faire fonctionner sur les pages Web d'azur.
gabriel14

Cette bibliothèque fonctionne correctement lorsque je l'exécute localement sur ma machine, mais sur le serveur d'hébergement, je vois l'erreur suivante au hasard. Le PDF est parfois généré mais parfois il génère l'erreur suivante. "Erreur. Une erreur s'est produite lors du traitement de votre demande. Impossible de générer le PDF: (code de sortie: 1)"
user2347528

wkhtmtopdf dépend de GDI + ou de x-server si vous utilisez Mono / Linux. Ce n'est donc pas utile pour les environnements de serveurs ...
nuzzolilo

Son bon et fonctionne comme prévu mais problème de qualité peu je vois dans mon pdf, pouvons-nous améliorer cela?
Bharat

13

Winnovative propose une bibliothèque PDF .Net qui prend en charge la saisie HTML. Ils offrent un essai gratuit illimité . Selon la façon dont vous souhaitez déployer votre projet, cela peut être suffisant.


4
Gardez à l'esprit que lors de notre dernière vérification, winnovative était incompatible avec IE9 (car ils utilisaient le moteur de rendu IE GDI qui a été supprimé dans IE9). Donc, si vous avez installé IE9 sur la machine que vous utilisez, la conversion ne fonctionnera pas. Ils ont peut-être corrigé cela au moment où vous lisez ceci, mais de nombreux composants commerciaux utilisaient le moteur de rendu IE et étaient décollés avec IE9, il vaut donc la peine de vérifier.
fubaar

Winnovative était le plus facile à installer et il a juste fonctionné hors de la boîte. Mais: 1. cela NE FONCTIONNE PAS sur les sites Web Azure, seulement CloudApp. 2. il est lent, il faut 8 bonnes secondes pour générer un simple PDF sur une machine virtuelle Azure D1
jsgoupil

Confirmer. C'est vraiment lent. J'ai comparé avec wkhtmltopdf.
Marat Faskhiev

La bibliothèque Winnovative est très coûteuse. Quelque 650 $ pour la licence développeur et 1200 $ pour les autres licences.
Abhijeet Nagre

Winnovative HTML to PDF Converter fonctionne dans les sites Web Azure et ne dépend pas d'IE, comme cela a été suggéré dans un commentaire. Veuillez vérifier la solution Winnovative HTML to PDF pour Azure sur le site Web: winnovative-software.com/html-to-pdf-converter-azure.aspx . Pour améliorer le temps de conversion, définissez HtmlToPdf.ConversionDelay = 0. Le convertisseur utilise un délai par défaut pour traiter les pages HTML qui mettent à jour leur contenu après le chargement de la page.
EvoPdf

9

Le PDF essentiel 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, ASP.NET Webforms 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).

Toute la suite de contrôles est disponible gratuitement (applications commerciales également) via le programme de licence communautaire si vous êtes admissible. La licence communautaire est le produit complet sans limitation ni filigrane.

Remarque: je travaille pour Syncfusion.


8

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 s'exécuter à partir d'une ligne de commande.

Une solution serait de choisir l'un d'entre eux, puis d'écrire un wrapper fin autour de cela en C #. Par exemple, comme cela est fait dans ce tutoriel .


Le tutoriel utilise un composant d'un site Web qui n'existe plus.
Tom Winter

7

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


ExpertPDf a-t-il une option pour marquer l'eau des documents?
user1799214

@ user1799214 - Oui, ExpertPDF prend en charge les filigranes. Voir ici pour un exemple de code. Je l'ai utilisé avec succès avec des filigranes sur l'un de mes sites Web.
Theophilus

Cela fonctionne assez bien, mais ils ne répondent pas aux questions d'assistance.
Michael Freidgeim

7

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.


7

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 l'a montré , la norme css-break-3 du W3C résoudra le problème ... Il s'agit d'une Recommandation Candidate avec un projet de transformation en Recommandation définitive en 2017 ou 2018, après tests.

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


1
Les solutions liées par print-css.rocks coûtent 2 950,00 $ pour PDFreactor, 3800 $ pour Prince et 5 000,00 $ pour Antenna House Formatter V7. Et Weasyprint semble être pour Python.
MDave

6

Vous pouvez utiliser la fonction d'impression au format PDF de Google Chrome à partir de son mode sans tête. J'ai trouvé que c'était la méthode la plus simple mais la plus robuste.

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

Hé, c'est vraiment cool pour le serveur et les vps possédés. Merci d'avoir partagé.
mjb

Afin de permettre à ASP.NET dans IIS d'exécuter un programme externe avec une autorisation d'accès en écriture, le pool d'applications> paramètres avancés> identité> défini sur "LocalSystem"
mjb

4

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

Nous utilisons et recommandons.

Très bon composant, il convertit non seulement une page Web en PDF comme une image mais convertit vraiment du texte, une image, un formatage, etc ...

Ce n'est pas gratuit mais c'est bon marché.


10
Nous l'utilisons depuis quelques années et nous l'avons trouvé assez pénible à utiliser. Prise en charge médiocre, très capricieux en raison de son enveloppe autour du moteur de rendu IE, de la qualité et de la compression d'image médiocres, de la capacité limitée à personnaliser la demande faite pour gérer certains scénarios d'utilisation plus avancés (comme fournir des cookies et des en-têtes de demande). Je suppose que son fonctionnement dépend de ce dont vous avez besoin.
moribvndvs

3
+1 pour ABCPdf. Le commentateur précédent ne doit pas avoir parlé aux mêmes personnes de soutien que moi - ils m'ont toujours écrit tout de suite et ont toujours eu une solution à tous les problèmes que nous avions. Ils prennent désormais en charge l'utilisation de Gecko comme moteur de rendu au lieu d'IE. Vous pouvez choisir celui que vous souhaitez au moment de l'exécution. ABC vous permet de faire littéralement tout ce que le PDF vous permet de faire.
Steve

12
support trop cher et médiocre. Je ne recommande pas du tout abcPDF.
Vivek

Je l'utilise aussi depuis 6 ans, et pour être honnête, ça nous a bien servi.
toepoke.co.uk

Cette réponse n'est-elle pas une autre répétition de stackoverflow.com/a/2182212/471213 ? Je veux dire, l'autre gars qui est affilié au programme a au moins fourni quelques lignes d'exemple de code
usr-local-ΕΨΗΕΛΩΝ

4

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

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

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

J'ai développé une version SaaS sur Azure. Il facilite encore plus son utilisation à partir de WebApi ou de n'importe quelle application, service, site Web Azure, travail Web Azure, quel que soit l'exécution de .Net.

http://www.rotativahq.com/

Comptes gratuits disponibles.


Est-ce que cela repose sur Itextsharp et vous devez donc avoir une licence pour itextsharp pour l'utiliser?
Micah Armantrout

2
@MicahArmantrout Non, ce n'est pas le cas. Il utilise wkhtmltopdf.exe pour créer le fichier PDF. Aucune licence requise.
Giorgio Bozio

@MicahArmantrout, n'est-ce pas que iTextSharp est aussi GNU GPL? gnu.org/licenses/agpl.html
Pranav Singh

Nous déconseillons l'utilisation de versions antérieures à iText (Sharp) 5 pour des raisons à la fois techniques et juridiques. stackoverflow.com/questions/8517776/itexsharp-license
Micah Armantrout

4

Voici un exemple de conversion de html + css en PDF à l'aide d'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();
}

Notez que iTextSharp fonctionne avec XHtml et est assez sensible à la qualité de votre html. Il se briserait, contrairement à SelectPdf et HiqPdf.
Savage

3

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

Une solution vraiment simple mais pas facilement déployable consiste à utiliser un contrôle WebBrowser pour charger le code 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 votre Html est XHtml, vous pouvez utiliser PDFizer pour faire le travail.


3

PDF Vision est bon. Cependant, vous devez avoir la confiance totale 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 bien sur localhost.



2

Je le cherchais aussi il y a quelque temps. J'ai rencontré 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 crache un PDF. Cela a assez bien fonctionné pour moi pour mon projet parallèle, mais tout dépend de ce dont vous avez réellement besoin.

L'entreprise qui le fabrique vend les binaires compilés, mais vous êtes libre de télécharger et de compiler à partir de la source et de l'utiliser gratuitement. J'ai réussi à compiler une révision assez récente (pour la version 1.9) et j'ai l'intention de publier un programme d'installation binaire pour elle dans quelques jours, donc si vous êtes intéressé, je peux fournir un lien vers elle dès que je la 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


salut, pouvez-vous fournir un lien et également un guide sur la façon de l'utiliser avec c # asp.net merci
user287745

static.persistedoughtts.com/htmldoc_1.9.1586-setup.exe Soyez conscient qu'il s'agit d'un programme en ligne de commande. Vous devez l'exécuter à partir de votre application pour la faire fonctionner. Vous pouvez trouver la documentation de ses arguments et mises en garde à partir du chapitre 4 sur: easysw.com/htmldoc/documentation.php
enriquein

Je ne sais pas à quel point cela serait utile de nos jours, mais si cela vous aide: dropbox.com/s/9kfn3ttoxs0fiar/htmldoc_1.9.1586-setup.exe
enriquein

Le site Web n'est plus opérationnel.
Tom Winter

2

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 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().GetPdfBytesFromHtmlString(html, baseUrl);

Vous avez également la possibilité d'enregistrer directement le document PDF généré dans un flux de fichiers sur le disque.


Vous n'avez pas besoin d'utiliser une bibliothèque commerciale si vous avez besoin d'un rendu html parfait en pdf
obayhan

Je commence à y croire. J'ai essayé 5 des cadeaux et ils ont tous une chose qui me ruine. De l'étouffement à une page qui va au-delà d'un simple bonjour, à un look affreux - je pense que je vais devoir cracher de l'argent pour un vrai convertisseur. Les échantillons de chacun des produits commerciaux fonctionnent comme vous vous attendez à ce que le PDF sorte.
Herb Meehan

@obayhan - J'aimerais vous croire. Peut-être pourriez-vous partager avec nous un lien vers les outils que vous trouvez si bons.
Peter Wone

@PeterWone en haut, il existe de nombreuses alternatives open source comme vous pouvez le voir facilement. Demander à quelqu'un de partager les mêmes choses ne fait que voler du temps. Mais si vous les avez tous essayés et insatisfaits, j'espère que vous partagerez vos commentaires sur ce qui ne vous satisfait pas et peut-être que cela aiderait à développer les connaissances.
obayhan

@obayhan - Pourquoi répéter ce que d'autres ont déjà fait? Ils se répartissent en trois catégories: pas vraiment libres, les dépendances inacceptables comme wkhtmltopdf ou IE9, et le moteur de rendu HTML pour PDFSharp. HR for PDF # est le seul en C # pur et il fait un travail horrible de pagination - il rend une longue page et la coupe, coupant souvent les lignes de texte. Si je peux trouver le temps de réécrire complètement le moteur de rendu, HR for PDF # gagnerait haut la main: c'est rapide, gratuit et sans dépendances. Mais ce serait un tout nouveau moteur de rendu, je le crains.
Peter Wone

2

Ceci est une bibliothèque gratuite et fonctionne très facilement: 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


2

Il semble que jusqu'à présent, la meilleure solution gratuite .NET soit la bibliothèque TuesdayPechkin qui est un wrapper autour de la bibliothèque native wkhtmltopdf .

J'ai maintenant utilisé la version à un seul thread pour convertir quelques milliers de chaînes HTML en fichiers PDF et cela semble très bien fonctionner. Il est censé fonctionner également dans des environnements multithreads (IIS, par exemple) mais je ne l'ai pas testé.

De plus, comme je voulais utiliser la dernière version de wkhtmltopdf (0.12.5 au moment de la rédaction), j'ai téléchargé la DLL depuis le site officiel, l'ai copiée dans la racine de mon projet, défini la copie sur sortie sur true et initialisé la bibliothèque comme donc:

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

Le code ci-dessus cherchera exactement "wkhtmltox.dll", donc ne renommez pas le fichier. J'ai utilisé la version 64 bits de la DLL.

Assurez-vous de lire les instructions pour les environnements multi-threads, car vous devrez l'initialiser une seule fois par cycle de vie de l'application, vous devrez donc le mettre dans un singleton ou quelque chose.


1

Voici un wrapper pour wkhtmltopdf.dll par pruiz

Et un wrapper pour wkhtmltopdf.exe par Codaxy
- également sur nuget .


Des documents ou des tutoriels comment les utiliser? il n'y a que du code source sans aucune documentation
Burjua

1
Téléchargez le code et jetez un œil aux tests unitaires. Cela devrait vous donner de bons exemples d'utilisation.
Garfield

N'aide pas vraiment, en fait je ne peux même pas faire des tests de la solution pruiz pour travailler, ça dit que No tests are run because no tests are loaded or the selected tests are disabledgoogler n'aide pas non plus
Burjua

@Burjua, cela est généralement lié à la version du testeur que vous utilisez. Cependant, essayez d'ouvrir un problème sur le site du projet de mon github et je vais essayer de vous aider ..
Pablo Ruiz García

Salut, cet emballage fonctionne bien, mais n'affiche pas mes graphiques à secteurs Google. Donc, jusqu'à ce que je puisse résoudre ce problème, je devrais trouver une autre solution.
Andre Lombaard

1

Le meilleur outil que j'ai trouvé et utilisé pour générer des PDF de javascript et de styles rendus ou des pages html est phantomJS .

Téléchargez le fichier .exe avec la fonction rasterize.js trouvée à la racine de l'exe du dossier d'exemples et placez-la dans 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 appliqués.

Le code suivant génère un 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;
}

Pouvez-vous partager votre code source complet? Je suis nouveau sur C #, donc je suis coincé même sur les importations.
Sibi John

1

Vous pouvez également vérifier Spire , il vous permet de créer HTML to PDFavec 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 dans asp.net C #


Spire génère un fichier PDF qui n'est qu'une image. Certains des CSS ne sont même pas corrects, comme ignorer les polices en gras.
Savage

Voir la réponse à ma question concernant la génération des fichiers PDF en tant qu'image: e-iceblue.com/forum/nuget-pdf-as-non-image-t6710.html
Savage

Spire est le 4ème que j'ai essayé sur cette page et je pense que c'est le meilleur, merci.
MDave le

1

En tant que représentant du logiciel HiQPdf, je pense que la meilleure solution est le convertisseur HiQPdf HTML vers PDF pour .NET . Il contient le moteur de rendu HTML5, CSS3, SVG et JavaScript le plus avancé du marché. Il existe également une version gratuite de la bibliothèque HTML vers PDF que vous pouvez utiliser pour produire gratuitement jusqu'à 3 pages PDF. Le code C # minimal pour produire un PDF sous forme d'octet [] à 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 pour ASP.NET et MVC dans le référentiel d'exemples HiQPdf HTML to PDF Converter .


1
Produit des résultats décents, mais comme SelectPdf, il peut avoir un impact important sur votre temps de génération et déployer la taille du package. Cela doublait presque mon temps de génération Visual Studio. J'ai également eu du mal à le faire remplir ma page - le html était trop petit au milieu - à cet égard, SelectPdf a fait un meilleur travail.
Savage

1
le remplissage de page avec du contenu HTML dépend de la propriété HtmlToPdf.BrowserWidth. Il est de 1200 pixels par défaut mais vous pouvez le régler sur 800 pixels et le HTML devrait très bien remplir toute la page PDF. Vous pouvez trouver une démo en direct et un exemple de code pour cela sur hiqpdf.com/demo/HtmlFittingAndScalingOptions.aspx
HiQPdf

1
Pas de prise en charge de .NET Core non plus.
Taylor Buchanan

1

Il est probable que la plupart des projets encapsuleront un moteur C / C ++ plutôt que d'implémenter une solution C # à partir de zéro. Essayez le projet Gotenberg .

Pour le tester

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

Exemple de boucle

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

Compiler

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

0

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

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


1
BitDefender rapporte: "Malware détecté! L'accès à cette page a été bloqué.". Je n'ai aucune opinion sur le caractère authentique ou faux positif de ce rapport.
GeoffM

0

Pour convertir HTML en PDF en C #, utilisez ABCpdf .

ABCpdf peut utiliser les moteurs de rendu Gecko ou Trident, de sorte que votre tableau HTML sera identique à celui qui apparaît dans FireFox et Internet Explorer.

Il y a une démo en ligne d'ABCpdf sur www.abcpdfeditor.com. Vous pouvez l'utiliser pour vérifier le rendu de vos tableaux en premier, sans avoir à télécharger et installer de logiciel.

Pour afficher des pages Web entières, vous aurez besoin des fonctions AddImageUrl ou AddImageHtml. Mais si tout ce que vous voulez faire est simplement d'ajouter du texte de style HTML, vous pouvez essayer la fonction AddHtml, comme ci-dessous:

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

ABCpdf est un logiciel commercial, mais l'édition standard peut souvent être obtenue gratuitement dans le cadre d'une offre spéciale.


91
Vous devriez vraiment écrire dans toutes vos réponses que vous travaillez pour websupergoo. De la 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. Toutes vos réponses concernaient ABCpdf
jgauffin

12
Aie! J'ai suggéré ABCpdf parce que c'est un composant que je connais. Si un grand pourcentage de mes publications concerne des PDF, c'est uniquement parce que je m'abstiens de contribuer à des sujets en dehors de mes domaines d'intérêt. Mes excuses.
AffineMesh

Dans la défense des affiches, le site Web fait que le produit est plutôt bon.
Tom Winter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.