Cette page peut contenir du texte traduit automatiquement.

Convertir du HTML en PDF en C# et VB.NET

Si vous avez déjà investi beaucoup de temps et d'argent dans la création de contenu HTML, vous souhaiterez peut-être le convertir en PDF. Cette approche est idéale pour éviter les tâches redondantes.

Cet article est un guide détaillé pour convertir du HTML en PDF sous .NET à l'aide de Docotic.Pdf et de son extension gratuite HtmlToPdf.

Pour en savoir plus sur les avantages de Docotic.Pdf, l'installation de l'extension et le fonctionnement interne de la conversion, consultez la page Présentation de l'API HTML vers PDF.

Conversion HTML vers PDF

Conversion simple de HTML en PDF en C#

Commencez par installer l'extension.

Install-Package BitMiracle.Docotic.Pdf.HtmlToPdf

En utilisant l'API HTML vers PDF, le code de conversion C# peut ressembler à ceci :

static async Task ConvertUrlToPdfAsync(string urlString, string pdfFileName)
{
    using var converter = await HtmlConverter.CreateAsync();
    using var pdf = await converter.CreatePdfAsync(new Uri(urlString));
    pdf.Save(pdfFileName);
}

C'est assez simple. Deux appels suffisent pour générer un document PDF.

Le code crée une instance du convertisseur et l'utilise pour générer un PDF à partir de HTML. Vous pouvez modifier le document PDF ou le signer avec une signature numérique. Par souci de simplicité, l'exemple de code enregistre le document tel quel.

Comme vous pouvez le constater, l'API est asynchrone et ne propose aucune méthode synchrone.

Utilisation de l'API asynchrone dans du code synchrone

Il arrive que vous ayez besoin d'appeler l'API depuis du code synchrone. Par exemple, si votre application console utilise une ancienne version de C# et que vous n'avez pas de fonction Main asynchrone. Rassurez-vous, vous pouvez toujours utiliser l'extension dans votre application.

Le code suivant montre comment convertir une URL en PDF à l'aide d'une méthode synchrone classique :

Task.Run(async () =>
{
    using var converter = await HtmlConverter.CreateAsync();
    var uri = new Uri("https://bitmiracle.com/pdf-library/html-pdf/");
    using var pdf = await converter.CreatePdfAsync(uri);
    pdf.Save("output.pdf");
}).GetAwaiter().GetResult();

Les applications VB.NET utilisent un code similaire. Voici un extrait de code montrant comment convertir du HTML en PDF en VB.NET de manière synchrone.

Task.Run(
    Async Function()
        Using converter = Await HtmlConverter.CreateAsync()
            Dim uri = New Uri("https://bitmiracle.com/pdf-library/html-pdf/")
            Using pdf = Await converter.CreatePdfAsync(uri)
                pdf.Save("output.pdf")
            End Using
        End Using
    End Function
).GetAwaiter().GetResult()

Veuillez noter qu'en général, il n'est pas recommandé d'appeler des méthodes asynchrones de manière synchrone ; n'utilisez donc le wrapper que lorsque vous n'avez pas d'autre choix.

Exemple de code

Nous fournissons des exemples de code pour les applications console, Windows Forms et WPF. Téléchargez des projets de test complets depuis notre dépôt GitHub :

Il existe également un groupe d'exemples HTML vers PDF. Chaque exemple est disponible en versions C# et VB.NET.

Créer un PDF à partir d'une chaîne ou d'un fichier HTML en C# et VB.NET

Il est facile de convertir une chaîne HTML en PDF grâce à l'API. Cette chaîne peut contenir un document HTML complet ou seulement un extrait. Le convertisseur générera automatiquement un PDF à partir du code HTML.

using var converter = await HtmlConverter.CreateAsync();

var html = "<body><br><br><br><h1>Hello, World</h1></body>";
using var pdf = await converter.CreatePdfFromStringAsync(html);
pdf.Save("output.pdf");

Le HTML peut contenir des références relatives à des images, des scripts et des fichiers CSS. Pour convertir correctement ce code, vous devez spécifier une URL de base pour tous les liens relatifs dans le HTML. Voici comment spécifier une URL de base à l'aide des options de conversion :

using var converter = await HtmlConverter.CreateAsync();

var incompleteHtml = "<img src=\"/images/team.svg\"></img>";

var options = new HtmlConversionOptions();
options.Load.BaseUri = new Uri("https://bitmiracle.com/");

using var pdf = await converter.CreatePdfFromStringAsync(incompleteHtml, options);
pdf.Save("output.pdf");

Notre dépôt GitHub contient le projet de test complet.

La conversion d'un fichier HTML est quasiment identique à celle d'une URL. Il suffit d'utiliser la surcharge CreatePdfAsync qui accepte un chemin d'accès au lieu d'une URL. L'URL de base et les autres options sont également prises en charge lors de la conversion d'un fichier HTML en PDF en C# ou VB.NET.

var sampleHtmlPath = @"C:\path\to\sample.html";
using var pdf = await converter.CreatePdfAsync(sampleHtmlPath);
pdf.Save("output.pdf");

Vous pouvez également convertir des images SVG en PDF en utilisant l'API.

Utilisez un format de page, des marges et une échelle personnalisés

Lorsque vous travaillez avec des pages web à la mise en page large, vous pouvez soit augmenter la taille du PDF généré, soit réduire la taille du contenu pour l'adapter à la page. Pour un meilleur positionnement du contenu redimensionné, vous pouvez également définir des marges.

Un PDF correctement dimensionné offre une meilleure expérience de lecture, car le lecteur n'aura pas besoin de zoomer pour visualiser correctement le contenu. Si le document HTML est difficile à lire en raison d'une petite taille de police, vous pouvez agrandir le contenu.

Par défaut, l'API génère des PDF au format A4. Il n'y a ni marges ni agrandissement. Vous pouvez modifier ces paramètres via les options de conversion.

Consultez la documentation pour savoir comment configurer le facteur d'échelle et les marges lors de la génération d'un PDF à partir de HTML.

using var converter = await HtmlConverter.CreateAsync();

var html = "<html><head><style>body { background-color: coral; margin-top: 100px;}</style></head>" +
"<body><h1>Did you notice the margins and the scale?</h1></body></html>";

var options = new HtmlConversionOptions();
options.Page.MarginLeft = 10;
options.Page.MarginTop = 20;
options.Page.MarginRight = 30;
options.Page.MarginBottom = 40;
options.Page.Scale = 1.5;

using var pdf = await converter.CreatePdfFromStringAsync(html, options);
pdf.Save("output.pdf");

Le dépôt d'exemples Docotic.Pdf contient le projet complet.

L'API HTML vers PDF permet d'ajouter des blocs d'en-tête et de pied de page répétables sur les pages générées. Le convertisseur crée ces blocs à partir des modèles HTML spécifiés dans les options de page. Nous recommandons l'utilisation de styles en ligne et d'URI de données pour les images dans les modèles.

Le convertisseur place les en-têtes et pieds de page dans les marges de la page. Les marges par défaut étant réduites, le contenu de l'en-tête et du pied de page risque de ne pas être visible. Nous recommandons de spécifier explicitement les marges supérieure et inférieure. Leur taille doit correspondre à celle de l'en-tête et du pied de page, respectivement.

Consultez la procédure de conversion HTML vers PDF et d'ajout d'en-tête et de pied de page

using var converter = await HtmlConverter.CreateAsync();

var options = new HtmlConversionOptions();
options.Page.HeaderTemplate = File.ReadAllText("header-template.html");
options.Page.MarginTop = 50;

options.Page.FooterTemplate = File.ReadAllText("footer-template.html");
options.Page.MarginBottom = 50;

var url = new Uri("https://www.iana.org/numbers");
using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

Les modèles utilisent du code HTML standard prenant en charge quelques variables : date, title, url, pageNumber et totalPages. Les modèles d’en-tête et de pied de page prennent en charge les mêmes variables.

Le projet de test complet et le code du modèle se trouvent dans le dépôt d'exemples Docotic.Pdf. L'exemple de code illustre l'utilisation des variables et des URI de données dans les modèles.

Conversion HTML vers PDF protégée par mot de passe en C#

Certaines pages web nécessitent une authentification pour y accéder. Lorsque vous accédez à une URL sécurisée exigeant une authentification HTTP, votre navigateur vous demande un nom d'utilisateur et un mot de passe.

Grâce aux options de conversion, vous pouvez configurer l'API pour qu'elle fournisse les identifiants nécessaires pour les pages web nécessitant une connexion.

Ce code C# illustre la conversion de contenu HTML protégé par mot de passe en PDF

using var converter = await HtmlConverter.CreateAsync();
var url = new Uri("http://httpbin.org/basic-auth/foo/bar");

var options = new HtmlConversionOptions();
options.Authentication.SetCredentials("foo", "bar");

using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

Trouvez l'exemple de travail complet dans le dépôt d'exemples.

C'est tout aussi simple si la page nécessite certains cookies pour fonctionner correctement. Il suffit de les ajouter aux options. Voici comment procéder :

var options = new HtmlConversionOptions();
options.Cookies.Add(new Cookie("sessionID", "my-session-ID"));

using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

Démarrage de la conversion différée

Par défaut, la conversion démarre immédiatement après le chargement. Retarder la conversion HTML vers PDF peut s'avérer utile si la page continue de se mettre à jour pendant un certain temps après son chargement. C'est souvent le cas avec du contenu dynamique généré par JavaScript ou des appels AJAX.

Le test Acid 3 est un parfait exemple de page qui bénéficierait d'un délai avant la conversion. Ce test effectue plusieurs vérifications pour évaluer la capacité d'un navigateur à afficher correctement des pages web complexes. Ces vérifications prennent du temps. Essayez de modifier le délai d'attente dans le code suivant pour observer son impact sur les résultats de la conversion.

var options = new HtmlConversionOptions();
options.Start.SetStartAfterDelay(10 * 1000);

using var converter = await HtmlConverter.CreateAsync();
var url = new Uri("http://acid3.acidtests.org/");
using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

Le code ci-dessus montre comment convertir du HTML en PDF avec un délai. Bien que ce délai supplémentaire permette d'obtenir de meilleurs résultats, veuillez noter qu'il peut affecter les performances. Un délai insuffisant peut nuire à la qualité de la conversion. Une autre solution consiste à utiliser un script qui s'exécutera jusqu'à ce que la page soit prête.

Vous pouvez obtenir le projet de test complet dans le dépôt d'exemples Docotic.Pdf.

Exécuter JavaScript avant la conversion

L'API d'extension permet d'exécuter du code JavaScript avant la conversion. Ce code peut générer ou modifier dynamiquement le contenu HTML. Par exemple, il peut activer/désactiver des éléments ou déclencher le chargement dynamique de contenu.

Le code suivant montre comment retarder la conversion HTML vers PDF jusqu'à la fin de l'exécution de JavaScript.

using var converter = await HtmlConverter.CreateAsync();

var options = new HtmlConversionOptions();
var js = @"document.body.style.backgroundColor = 'green';";
options.Start.SetStartAfterScriptRun(js);

var url = new Uri("https://google.com");
using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("output.pdf");

L'extrait de code ci-dessus est très simple et sert uniquement à illustrer la méthode. Pour un exemple plus concret, consultez l'application correspondante dans notre dépôt GitHub. Cette application montre comment gérer une page dont le contenu se charge dynamiquement. Le code JavaScript de l'application fait défiler la page jusqu'à ce qu'il n'y ait plus de nouveau contenu. Ensuite, la conversion au format PDF est effectuée.

Convertir du HTML en PDF en .NET en ignorant les erreurs SSL

Lors de l'envoi de requêtes sécurisées pour charger du HTML, l'extension vérifie la validité et la fiabilité du certificat SSL qui authentifie l'identité du site web et permet une connexion chiffrée.

Par défaut, l'extension génère une exception si le convertisseur HTML vers PDF ne fait pas confiance au certificat, quelle qu'en soit la raison. Cela se produit généralement en cas de certificat auto-signé, révoqué ou expiré.

Si vous comprenez le risque lié à l'acceptation d'un certificat non fiable, vous pouvez configurer l'extension pour qu'elle ignore ces vérifications via les options du moteur.

var engineOptions = new HtmlEngineOptions
{
    IgnoreSslErrors = true
};
using var converter = await HtmlConverter.CreateAsync(engineOptions);

var url = new Uri("https://self-signed.badssl.com/");
using var pdf = await converter.CreatePdfAsync(url);
pdf.Save("output.pdf");

Pour le code complet, rendez-vous sur le dépôt d'exemples Docotic.Pdf.

Superposer du code HTML sur un PDF existant

Il arrive que vous souhaitiez utiliser un PDF existant comme arrière-plan pour le résultat de la conversion. Par exemple, si vous avez une image d'un formulaire et que vous voulez superposer du contenu sur les zones vides, le résultat ressemblera à un formulaire rempli. Ceci est possible avec Docotic.Pdf et son extension.

Ce processus consiste à créer un nouveau PDF à partir du code HTML (le contenu superposé) puis à le fusionner avec le PDF existant. Le document final inclura à la fois le contenu original et le nouveau contenu superposé. Voici le code illustrant ce processus.

using var converter = await HtmlConverter.CreateAsync();

var options = new HtmlConversionOptions();
options.Page.SetSizeInches(4.13, 5.83);

string htmlCode =
    "<div style=\"position: absolute; top: 270px; right: 100px;\">" +
    "I would like to put this here</div>";
using var htmlPdf = await converter.CreatePdfFromStringAsync(htmlCode, options);

using var pdf = new PdfDocument("pdf-to-merge-with.pdf");
var xObj = pdf.CreateXObject(htmlPdf.Pages[0]);

pdf.Pages[0].Canvas.DrawXObject(xObj, 0, 0);
pdf.Save("output.pdf");

Il est important de spécifier le format de la page pour la superposition. Généralement, ce format doit correspondre à celui de la page à superposer. Vous devrez ensuite générer un nouveau PDF avec le contenu de la superposition. Veuillez noter que le fond est transparent par défaut. Vous pouvez le modifier en exécutant un script avant la conversion, si nécessaire.

Le code ci-dessus :

  • crée un document PDF avec une page transparente à partir du code HTML
  • ouvre un PDF existant
  • crée un objet XObject à partir de la première page du document converti dans le document existant
  • dessine l’objet XObject par-dessus la première page du PDF du document existant

Le projet de test complet avec un exemple de source PDF se trouve dans le dépôt d'exemples Docotic.Pdf.