Passer au contenu du pied de page
UTILISATION DE IRONPDF

Exportation en un clic vers le format PDF en C# pour les tableaux de bord d'administration

Le problème de la préservation du contenu HTML à grande échelle

Page d'accueil IronPDF Lorsqu'une organisation désactive un CMS hérité, un intranet ou un portail public, le contenu qui s'y trouve ne cesse simplement pas d'importer. Un hôpital mettant hors service une base de données d'articles de santé des patients a toujours besoin de ces articles préservés : une agence gouvernementale redessinant son site web doit conserver les avis publics qui existaient à un moment donné, un cabinet d'avocats fermant une plateforme de recherche de cas a besoin que chaque page soit convertie dans un format compatible avec une rétention légale.

L'échelle est là où toute approche manuelle échoue. La fonctionnalité d'imprimer en PDF basée sur un navigateur fonctionne pour un document. Ce n'est pas une solution pour 10 000. Écrire un script pour un navigateur sans tête fonctionne jusqu'à ce que vous rencontriez du HTML mal formé, des ressources manquantes ou un mur d'authentification, et le contenu hérité est rarement propre.

Les outils de conversion par lots existants ont un problème similaire avec les anciens balisages : styles en ligne de 2005, mises en page de tables non standard, références d'image à des chemins qui ne se résolvent plus. Ils échouent soit silencieusement, produisent des PDF avec des mises en page cassées, soit nécessitent une correction manuelle par page. Pendant ce temps, les équipes informatiques ne peuvent pas justifier le maintien d'une infrastructure héritée en ligne indéfiniment juste pour supporter une migration qui aurait dû être terminée depuis des mois.

La sortie doit également être cohérente. Un hôpital archivant des articles de santé, une institution financière préservant des pages de divulgation pour la conformité réglementaire, un cabinet d'avocats construisant une archive de rétention, tous ont besoin que les PDF résultants ressemblent à venir du même système, pas une collection d'exportations de navigateur uniques. Pour ce tutoriel, nous allons vous guider à travers un exemple d'IronPDF pour voir comment cette bibliothèque peut aider à améliorer vos flux de projet.

La solution : Conversion par lots automatisée de HTML en PDF avec IronPDF

L'IronPDF d'Iron Software permet aux applications .NET de convertir en lots des fichiers HTML, des chaînes HTML, ou des URL en ligne en PDF standardisés en une seule exécution automatisée. Un script de migration lit à partir d'une source : un répertoire de fichiers HTML, une base de données de blobs HTML ou une liste d'URL à capturer avant que l'ancien serveur ne se déconnecte, alimente chaque page au ChromePdfRenderer et écrit la sortie vers une destination d'archive.

Le moteur de rendu basé sur Chromium gère le balisage incohérent, les styles en ligne, et les actifs intégrés de la même manière qu'un navigateur, produisant un instantané visuel fidèle quel que soit le mode d'écriture du HTML original. Il n'y a pas de piratages d'automatisation de navigateur à maintenir et pas de coûts d'API par document qui rendent une archive de 50 000 pages prohibitivement chère. La conversion s'exécute au sein d'une application console .NET ou d'un service en arrière-plan, un package NuGet, aucun processus externe.

Comment cela fonctionne en pratique : création de documents PDF C

1. Le script de migration énumère le contenu source

Le script est généralement une application console construite pour la migration, une exécution unique ou un travail répétable pour des ensembles de contenus incrémentaux. Il commence par énumérer la source : un répertoire de fichiers .html sur disque, une table de base de données avec des blobs HTML et des métadonnées (URL originale, date de création, ID de contenu), ou une liste aplatie de pages web en ligne à capturer avant que l'ancien serveur ne se déconnecte.

Pour les sources de base de données, la requête renvoie à la fois le contenu HTML et les métadonnées qui peupleront le manifeste d'archive. Pour les listes d'URL, l'ordre de traitement peut être trié par priorité, les pages à fort trafic ou les contenus légalement sensibles capturés en premier.

2. Injection de feuilles de style pour normaliser la sortie

Le HTML hérité est inconsistent par nature. Les pages de différentes époques du même CMS peuvent avoir des tailles de police de base différentes, des conventions de marges différentes et des hypothèses de mise en page différentes. Avant le rendu, le script prénoterie avec un bloc de <style> standardisé chaque chaîne HTML, définissant des marges uniformes, une police de corps cohérente et une largeur de page fixe, de sorte que chaque document PDF archivé partage la même base visuelle, quel que soit le style original.

Cette étape de normalisation fait la différence entre une archive qui ressemble à une collection de documents cohérente et une qui ressemble à un assortiment aléatoire de captures de navigateur.

3. ChromePdfRenderer convertit chaque page en fichier PDF

Pour les fichiers HTML sur disque ou les chaînes HTML d'une base de données, RenderHtmlAsPdf() gère la conversion. Un paramètre BaseUrlPath résout les références d'images et de feuilles de style relatives par rapport au répertoire du fichier original, préservant les actifs intégrés :

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

string sourceDir = @"C:\LegacyContent\html";

string archiveDir = @"C:\Archive\pdf";

Directory.CreateDirectory(archiveDir);

foreach (string htmlFile in Directory.EnumerateFiles(sourceDir, "*.html"))
{
    string html = File.ReadAllText(htmlFile);
    PdfDocument pdf = renderer.RenderHtmlAsPdf(html, sourceDir);
    string outputPath = Path.Combine(archiveDir,
        Path.GetFileNameWithoutExtension(htmlFile) + ".pdf");

    pdf.SaveAs(outputPath);
    Console.WriteLine($"Archived: {outputPath}");
}
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

string sourceDir = @"C:\LegacyContent\html";

string archiveDir = @"C:\Archive\pdf";

Directory.CreateDirectory(archiveDir);

foreach (string htmlFile in Directory.EnumerateFiles(sourceDir, "*.html"))
{
    string html = File.ReadAllText(htmlFile);
    PdfDocument pdf = renderer.RenderHtmlAsPdf(html, sourceDir);
    string outputPath = Path.Combine(archiveDir,
        Path.GetFileNameWithoutExtension(htmlFile) + ".pdf");

    pdf.SaveAs(outputPath);
    Console.WriteLine($"Archived: {outputPath}");
}
Imports IronPdf
Imports System.IO

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4

renderer.RenderingOptions.MarginTop = 20

renderer.RenderingOptions.MarginBottom = 20

Dim sourceDir As String = "C:\LegacyContent\html"

Dim archiveDir As String = "C:\Archive\pdf"

Directory.CreateDirectory(archiveDir)

For Each htmlFile As String In Directory.EnumerateFiles(sourceDir, "*.html")
    Dim html As String = File.ReadAllText(htmlFile)
    Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html, sourceDir)
    Dim outputPath As String = Path.Combine(archiveDir, Path.GetFileNameWithoutExtension(htmlFile) & ".pdf")

    pdf.SaveAs(outputPath)
    Console.WriteLine($"Archived: {outputPath}")
Next
$vbLabelText   $csharpLabel

Fichiers HTML convertis en format PDF

Fichiers de sortie

Exemple de sortie : fichier HTML vs. sortie PDF

Exemple de sortie IronPDF Pour les URL en direct, les pages qui doivent encore être capturées à partir du serveur en cours d'exécution avant la mise hors service, RenderUrlAsPdf() gère chaque requête. Le traitement par lots parallèle rend la durée d'exécution gérable sur de grands ensembles d'URL :

using IronPdf;

var renderer = new ChromePdfRenderer();

int completed = 0, failed = 0;

await Parallel.ForEachAsync(urlList,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    async (url, _) =>
    {
        try
        {
            PdfDocument pdf = renderer.RenderUrlAsPdf(url);
            string filename = Uri.EscapeDataString(url).Replace("%", "_") + ".pdf";
            pdf.SaveAs(Path.Combine(@"C:\Archive\pdf", filename));
            Interlocked.Increment(ref completed);
        }
        catch (Exception ex)
        {
            Interlocked.Increment(ref failed);
            Console.Error.WriteLine($"Failed: {url} — {ex.Message}");
        }
        Console.WriteLine($"Progress: {completed} completed, {failed} failed");
    });
using IronPdf;

var renderer = new ChromePdfRenderer();

int completed = 0, failed = 0;

await Parallel.ForEachAsync(urlList,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    async (url, _) =>
    {
        try
        {
            PdfDocument pdf = renderer.RenderUrlAsPdf(url);
            string filename = Uri.EscapeDataString(url).Replace("%", "_") + ".pdf";
            pdf.SaveAs(Path.Combine(@"C:\Archive\pdf", filename));
            Interlocked.Increment(ref completed);
        }
        catch (Exception ex)
        {
            Interlocked.Increment(ref failed);
            Console.Error.WriteLine($"Failed: {url} — {ex.Message}");
        }
        Console.WriteLine($"Progress: {completed} completed, {failed} failed");
    });
Imports IronPdf
Imports System.IO
Imports System.Threading
Imports System.Threading.Tasks

Dim renderer As New ChromePdfRenderer()

Dim completed As Integer = 0
Dim failed As Integer = 0

Await Parallel.ForEachAsync(urlList,
    New ParallelOptions With {.MaxDegreeOfParallelism = 4},
    Async Function(url, _) As Task
        Try
            Dim pdf As PdfDocument = renderer.RenderUrlAsPdf(url)
            Dim filename As String = Uri.EscapeDataString(url).Replace("%", "_") & ".pdf"
            pdf.SaveAs(Path.Combine("C:\Archive\pdf", filename))
            Interlocked.Increment(completed)
        Catch ex As Exception
            Interlocked.Increment(failed)
            Console.Error.WriteLine($"Failed: {url} — {ex.Message}")
        End Try
        Console.WriteLine($"Progress: {completed} completed, {failed} failed")
    End Function)
$vbLabelText   $csharpLabel

Fichiers générés à partir d'URLs

Fichiers générés à partir des URLs

Exemple de sortie

Exemple de sortie URL vers PDF Chaque PDF de sortie est enregistré dans une structure de dossiers reproduisant la hiérarchie du site original, avec un fichier manifeste enregistrant l'URL originale, l'horodatage de conversion et le chemin de sortie pour chaque document traité.

Avis Réels

Débit. IronPDF rend chaque page en quelques millisecondes. Une archive de 10 000 pages avec quatre threads parallèles se termine généralement en quelques heures sur un matériel serveur standard, sans fenêtres de traitement de nuit, sans transferts manuels entre les exécutions de conversion.

Fidélité visuelle. Le rendu basé sur Chromium signifie que les tables, mises en page CSS, images intégrées et styles en ligne sont traités de la même manière qu'ils le seraient dans un navigateur. Le PDF archivé correspond à l'apparence de la page originale, et non à une approximation réduite.

Mise hors service à l'échéance. Une fois le traitement d'archive terminé et le manifeste vérifié, les serveurs hérités, bases de données et installations de CMS peuvent être arrêtés. Le contenu existe sous forme d'une collection PDF permanente et autonome, ne dépendant de rien que l'ancienne infrastructure fournissait.

Conformité réglementaire. Les instantanés PDF immuables satisfont aux exigences de rétention et de suspension légale. IronPDF prend en charge le rendu PDF/A pour la préservation archivistique à long terme, une seule option de rendu convertit la sortie dans un format standardisé ISO accepté pour la conservation de documents réglementés.

Cohérence de la qualité du contenu. L'injection d'une feuille de style normalisée avant le rendu garantit que chaque PDF archivé partage des marges, polices et dimensions de page uniformes, qu'il s'agisse d'un HTML original écrit par un développeur suivant les normes ou d'un auteur de contenu collant depuis Word.

Aucun coût par document. La conversion s'exécute en processus. Il n'y a pas d'appels d'API à un fournisseur de conversion externe et aucun modèle de tarification qui rend une grande archive excessivement chère. Convertir 500 pages ou 50 000 coûte la même chose en termes d'infrastructure.

Conclusion

Une migration de contenu avec une échéance de mise hors service ne laisse pas de temps pour des flux de travail de conversion manuels ou des outils qui échouent sur du HTML désordonné. La conversion doit s'exécuter automatiquement, produire une sortie cohérente en volume, et se terminer avant que les anciens serveurs ne se déconnectent.

Un script de migration .NET propulsé par IronPDF couvre toute cette surface, énumérant le contenu source, normalisant les styles, rendant chaque page via Chromium, écrivant vers une destination d'archive et journalisant les échecs pour révision. IronPDF gère l'ensemble du cycle de vie de génération de PDF en C# sur ironpdf.com, du rendu des chaînes HTML et des URL à la sauvegarde, la diffusion et la manipulation des documents. Si vous délimitez une migration ou démarrez un essai pilote, l'essai gratuit de 30 jours vous donne suffisamment de temps pour convertir un échantillon représentatif de votre contenu hérité et valider la sortie avant de vous engager dans une archive complète.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi