Cette page peut contenir du texte traduit automatiquement.

Convertir HTML en PDF en C# et VB.NET

Si vous consacrez déjà une grande partie de votre temps et de votre argent à la création de contenu sous forme HTML, vous souhaiterez peut-être créer des PDF à partir de ce code HTML. Une telle approche est une direction naturelle pour tous ceux qui souhaitent éviter les doubles emplois.

Pour une réutilisation réussie des investissements, la conversion doit être effectuée par programme et le PDF résultant doit être aussi proche visuellement que possible du HTML source.

Conversion HTML en PDF

API pour la conversion HTML en PDF dans les applications .NET

Le module complémentaire HTML vers PDF gratuit pour la bibliothèque Docotic.Pdf fournit une API pour de telles conversions. Le module complémentaire et la bibliothèque peuvent être utilisés à partir d'applications Web et de bureau conçues pour les frameworks .NET et .NET Core.

Bibliothèque Docotic.Pdf 9.3.17036-dev Module complémentaire HTML vers PDF 9.3.17036-dev
Tests de régression 14,665 réussis Téléchargements totaux de NuGet 4,191,515

Le module complémentaire est une bibliothèque HTML vers PDF .NET qui utilise Chromium lors de la conversion. Avant chaque conversion, le module complémentaire vérifie automatiquement si le Chromium pris en charge le plus récent est déjà téléchargé. Toute version éligible déjà téléchargée sera réutilisée. Si aucune version éligible n'est trouvée, le module complémentaire en télécharge une avant la conversion. Il devrait être conforme aux mêmes normes Web que Google Chrome (R).

Le module complémentaire peut générer des PDF à partir de HTML dans les environnements Windows, macOS et Linux. Découvrez comment configurer le module complémentaire sous Linux dans l'article à propos de la conversion HTML en PDF dans Azure.

Le module complémentaire est disponible sur NuGet, et il est également inclus dans le zip avec binaires de la bibliothèque. Pour essayer la bibliothèque sans restrictions du mode d'évaluation, vous pouvez obtenir la clé de licence gratuite à durée limitée ici.

Conversion simple de HTML en PDF C#

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 plutôt simple. Seuls deux appels sont nécessaires pour produire un document PDF. Comme vous pouvez le constater, l'API est asynchrone et ne fournit aucune méthode synchrone.

Dans les cas où vous souhaitez appeler l'API à partir d'un code synchrone, vous pouvez utiliser le wrapper suivant :

Task.Run(async () =>
{
    await convertUrlToPdfAsync("https://bitmiracle.com/", "output.pdf");
}).GetAwaiter().GetResult();

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

Nous fournissons un exemple de code qui montre comment utiliser l'API à partir d'applications console synchrones et asynchrones. Il existe également des exemples de codes pour les applications Windows Forms et WPF.

Il existe également le groupe d'exemples HTML to PDF. Chaque exemple est disponible en version C# et VB.NET.

Créez un PDF avec une chaîne ou un fichier HTML en C# et VB.NET

Il est facile de convertir une chaîne HTML en PDF avec l'API. La chaîne peut contenir un document HTML complet ou juste un fragment. Le convertisseur créera pour vous un PDF à partir du code HTML.

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

Vous pouvez spécifier une URL de base pour tous les liens relatifs dans le code HTML que vous allez convertir. Voici un extrait de code expliquant comment convertir du HTML en PDF avec une URL de base en C#.

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

La conversion d'un fichier HTML est presque la même chose que la conversion d'une URL. Utilisez simplement la surcharge CreatePdfAsync qui accepte un chemin au lieu d'une URL. L'URL de base et d'autres options sont également prises en charge lors de la conversion d'un fichier HTML en PDF en code 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 à l'aide de l'API.

Utiliser une taille de page, des marges et une échelle personnalisées

Vous pouvez configurer n'importe quelle conversion HTML en PDF C# en fournissant des options de conversion vers les méthodes de création de PDF.

Voici un extrait de code qui montre comment configurer la taille, les marges et l'échelle de la page de sortie en C# :

using (var converter = await HtmlConverter.CreateAsync())
{
    var options = new HtmlConversionOptions();

    // vous pouvez également spécifier si l'orientation de la page
    // doit être paysage et vous pouvez fournir une taille en points ou en pouces
    options.Page.SetSize(PdfPaperSize.ItalyEnvelope);

    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.CreatePdfAsync(url, options))
        pdf.Save("output.pdf");
}

Vous pouvez spécifier des modèles d'en-tête et de pied de page à l'aide des options de page. Les modèles utilisent du code HTML standard avec prise en charge de quelques variables. Ces variables sont date, title, url, pageNumber et totalPages.

Il est recommandé d'utiliser des styles en ligne et des URI de données pour les images.

Vous souhaiterez peut-être spécifier les marges supérieure et inférieure de la page. Sans marges, l'en-tête ou le pied de page peuvent être masqués par le contenu de la page.

L'exemple de code Convertir HTML en PDF avec en-tête et pied de page en C# ou VB.NET montre comment utiliser les variables et les URI de données dans les modèles.

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

Vous pouvez créer un PDF même si une page HTML est protégée par une paire nom d'utilisateur/mot de passe. C'est aussi simple que de définir les options d'authentification dans HtmlConversionOptions.

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

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

C'est également simple si la page a besoin de certains cookies pour fonctionner correctement. Ajoutez simplement ces cookies aux options. Voici comment:

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

Retarder le début de la conversion

Par défaut, la conversion démarre immédiatement après le chargement. Mais il y a des cas où la page a besoin d'un certain temps pour se stabiliser. Par exemple, lorsqu'il effectue certains calculs et met à jour le contenu une fois ces calculs prêts.

En utilisant les options de démarrage de la conversion, vous pouvez retarder la conversion d'un nombre spécifié de millisecondes.

// Attendez 10 secondes avant de lancer la conversion.
var options = new HtmlConversionOptions();
options.Start.SetStartAfterDelay(10 * 1000);

Parfois, il est nécessaire d'exécuter un script pour basculer les éléments sur la page chargée ou pour effectuer un chargement dynamique du contenu. C'est également possible:

var options = new HtmlConversionOptions();
var js = @"
    async function scrollDownUntilYouCantAnyMore() {
        await new Promise((resolve, reject) => {
            // omis par souci de brièveté
            }, 400);
        });
    }
    scrollDownUntilYouCantAnyMore();
";
options.Start.SetStartAfterScriptRun(js);
using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

L'exemple de code HTML en PDF après l'exécution d'un script en C# ou VB.NET contient la fonction scrollDownUntilYouCantAnyMore complète. L'exemple montre comment exécuter un script avant les conversions HTML en PDF.

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

Lors d'une conversion, une erreur SSL peut survenir. De telles erreurs se produisent généralement en raison de certificats auto-signés ou non fiables. Les certificats révoqués et expirés peuvent également entraîner l'émission d'exceptions par le convertisseur HTML en PDF.

Vous pouvez ignorer les erreurs SSL si vous comprenez pourquoi elles se produisent et si vous êtes sûr de pouvoir les ignorer en toute sécurité. Pour ignorer les erreurs SSL lors d'une conversion HTML en PDF, utilisez les options du moteur avec IgnoreSslErrors = true.

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

Mettre du contenu HTML sur des pages PDF

Dans certains cas, vous devrez peut-être convertir du HTML et placer le résultat de la conversion au-dessus de certaines pages PDF existantes. Par exemple, lorsque vous avez une image d'un formulaire, vous souhaiterez peut-être placer quelque chose sur les zones vides de cette image. Le résultat ressemblera à un formulaire rempli.

Pour placer du HTML converti sur du contenu PDF existant, vous devrez :

  • créer des pages PDF avec un fond transparent à partir du HTML
  • créer des XObjects à partir des pages converties
  • dessinez ces XObjects sur des pages PDF existantes.

L'exemple de code Convertir le code HTML et le placer sur le contenu PDF existant en C# ou VB.NET montre toutes les étapes. Veuillez jeter un oeil à l'exemple de code.