IRONSOFTWAREHOME
OUTILS PDF

PDF vs PDF/A (Comparaison et comment utiliser)

Curtis Chau
Curtis Chau
Updated: 20 juin 2026

L'erreur "document has no pages" de iText se produit lorsque XMLWorker échoue à analyser le contenu HTML, mais le rendu basé sur Chrome d'IronPDF élimine ce problème en traitant le HTML exactement comme le font les navigateurs, fournissant une génération de PDF fiable sans exceptions d'analyse.

La conversion de HTML en PDF est une exigence courante dans les applications .NET, mais les développeurs utilisant iText rencontrent fréquemment l'erreur "document has no pages". Cette erreur apparaît lorsque le processus de génération de documents PDF échoue, obligeant les développeurs à rechercher des solutions. Cette analyse explore les raisons de ce phénomène et comment le résoudre efficacement grâce aux fonctionnalités HTML vers PDF d'IronPDF .

Qu'est-ce qui provoque l'erreur "Le document n'a pas de pages" ?

L'exception "document has no pages" se produit lorsque l'analyseur de iText échoue à traiter le contenu HTML en un document PDF valide. Cette erreur apparaît généralement lors de la fermeture du document, comme détaillé dans de nombreux fils de discussion Stack Overflow concernant ce problème . Comprendre la cause profonde aide les développeurs à choisir la bibliothèque PDF adaptée à leurs besoins .

L'erreur apparaît parce que XMLWorker -- le composant d'analyse HTML de iText -- échoue silencieusement lorsqu'il rencontre des structures HTML qu'il ne peut pas traiter. Au lieu de générer une exception lors de l'analyse, il produit un document vide. Lorsque le document se ferme, iText détecte qu'aucun contenu n'a été écrit et lance l'exception "document has no pages". Ce mode de défaillance silencieux rend le débogage particulièrement frustrant, car la trace de la pile pointe vers l'opération de fermeture plutôt que vers l'échec d'analyse réel.

static void Main(string[] args)
{
    Document pdfDoc = new Document(PageSize.A4);
    FileStream stream = new FileStream("output.pdf", FileMode.Create);
    PdfWriter writer = PdfWriter.GetInstance(pdfDoc, stream);
    pdfDoc.Open();
    // HTML parsing fails silently -- no exception here
    var sr = new StringReader("<div>Complex HTML</div>");
    XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
    pdfDoc.Close(); // Exception: The document has no pages
    Console.WriteLine("Error: Document has no pages");
}

Que s'affiche la console lorsque cette erreur se produit ?

Console de débogage de Microsoft Visual Studio montrant le message d'erreur 'Document has no pages' avec un en-tête rose sur fond sombre, affichant les détails de la trace de pile et l'exception XMLWorker de iText qui se produit lorsque l'analyse HTML échoue lors de la génération de PDF

Ce code tente de créer un fichier PDF à partir de HTML, mais rencontre une exception car XMLWorker n'a pas pu analyser correctement le contenu HTML. L'opération d'écriture s'achève, mais aucun contenu n'est ajouté au document, ce qui donne un fichier vide. Cet échec d'analyse est l'un des problèmes les plus courants rencontrés par les développeurs lors de la conversion de HTML en PDF dans les applications ASP.NET . Le problème se complexifie lorsqu'il s'agit de styles CSS personnalisés ou de contenu rendu en JavaScript.

Pourquoi la bibliothèque de remplacement rencontre-t-elle le même problème ?

Bien que XMLWorker ait remplacé le HTMLWorker obsolète, il rencontre toujours le même problème avec certaines structures HTML. Le problème persiste car XMLWorker a des exigences d'analyse strictes, comme indiqué dans les forums officiels d'iText . Cette limitation affecte les développeurs qui tentent de mettre en œuvre une conversion HTML vers PDF au pixel près ou qui travaillent avec des mises en page CSS réactives dans les applications Web modernes.

La solution courante consiste à pré-remplir le document avec un paragraphe vide avant d'analyser le code HTML. Cela empêche l'exception " aucune page " en garantissant qu'au moins un élément de contenu existe lors de la fermeture du document :

public static void CreatePDF(string html, string path)
{
    using (var fs = new FileStream(path, FileMode.Create))
    {
        var document = new Document();
        var writer = PdfWriter.GetInstance(document, fs);
        document.Open();
        document.Add(new Paragraph("")); // Workaround to avoid error
        var phrase = new Phrase("Draft version", FontFactory.GetFont("Arial", 8));
        document.Add(phrase);
        using (var sr = new StringReader(html))
        {
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr);
        }
        document.Close();
    }
}

À quoi ressemble le fichier PDF généré avec cette solution de contournement ?

PDF généré avec succès affichant le titre 'Hello, World!' avec un en-tête 'Version brouillon' et un contenu de test, montrant le rendu HTML réussi de XMLWorker après avoir mis en œuvre la solution de contournement du paragraphe vide qui empêche l'erreur 'Document has no pages'

Pourquoi certains éléments HTML complexes ne s'affichent-ils toujours pas ?

L'ajout d'un paragraphe vide empêche l'erreur immédiate, mais le code HTML complexe contenant des éléments de tableau, des images ou des polices personnalisées ne s'affiche souvent pas correctement. Le contenu du document PDF résultant peut être manquant ou malformé. Les développeurs rencontrent le même problème lors du traitement de code HTML contenant des styles intégrés, des éléments de lien hypertexte ou des propriétés de largeur spécifiques. Les références nulles et le rendu d'éléments manquants créent des problèmes supplémentaires qui nécessitent une résolution plus poussée.

XMLWorker a été conçu pour gérer un sous-ensemble de HTML 4 et de CSS 2 basique. Les pages web modernes utilisent régulièrement des fonctionnalités bien au-delà de ce cadre : CSS Grid, Flexbox, variables CSS, calc() expressions, graphiques SVG, et rendu piloté par JavaScript. Chacun de ces éléments peut déclencher l'erreur " aucune page " ou produire une sortie corrompue sans message d'erreur explicite, ni autre message descriptif pour guider la correction.

// Common XMLWorker limitations that require manual handling
public void ProcessComplexHTML(string htmlContent)
{
    // CSS flexbox -- not supported by XMLWorker
    if (htmlContent.Contains("display: flex"))
        throw new NontSupportedException("Flexbox layout not supported");

    // JavaScript content -- silently ignored
    if (htmlContent.Contains("<script>"))
        Console.WriteLine("Warning: JavaScript will be ignored");

    // Polices personnalisées -- require manual embedding
    if (htmlContent.Contains("@font-face"))
        Console.WriteLine("Warning: Web fonts need manual setup");
}
C#

Comment convertir du HTML moderne sans rencontrer la même erreur ?

Ce scénario concret illustre la conversion d'une facture stylisée du format HTML au format PDF. L'exemple comprend des éléments courants qui causent souvent des problèmes : CSS en ligne, requêtes média, mises en page de tableaux et hyperliens. Voici les types de structures qui déclenchent l'erreur " aucune page " dans XMLWorker :

<!-- Invoice HTML with modern styling -->
<!DOCTYPE html>
<html>
<head>
    <title>Invoice Sample</title>
    <style>
        .invoice-header {
            background-color: #f0f0f0;
            padding: 20px;
        }
        .invoice-table {
            margin-top: 20px;
        }
        @media print {
            .no-print { display: none; }
        }
    </style>
</head>
<body>
    <div style="font-family: Arial; width: 100%;">
        <div class="invoice-header">
            <h1 style="color: #2e6c80;">Invoice #12345</h1>
            <p>Date: <span id="date">2025-01-15</span></p>
        </div>
        <table class="invoice-table" style="width: 100%; border-collapse: collapse;">
            <thead>
                <tr>
                    <th style="border: 1px solid #ddd; padding: 8px;">Item</th>
                    <th style="border: 1px solid #ddd; padding: 8px;">Price</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td style="border: 1px solid #ddd; padding: 8px;">Service</td>
                    <td style="border: 1px solid #ddd; padding: 8px;">$100.00</td>
                </tr>
            </tbody>
        </table>
        <a href="https://example.com/terms" class="no-print">View Terms</a>
    </div>
</body>
</html>
HTML

Que se passe-t-il lorsque iText traite cette facture ?

Basique invoice PDF displaying Invoice #12345 with simple table formatting containing one service item for $100, demonstrating iText's limited CSS styling capabilities and basic table rendering when XMLWorker successfully processes simple HTML structures

Lorsque iText traite ce modèle de facture, la sortie est souvent dépouillée du style CSS, les couleurs de fond manquent, et les bordures de tableau sont perdues. La requête @media print est ignorée, et toute référence à des polices web provoque des échecs de parsing silencieux. Si le code HTML contient une propriété CSS que XMLWorker ne reconnaît pas, le bloc entier risque de ne pas s'afficher, ce qui entraînera un contenu manquant sans qu'aucune erreur ne soit signalée lors de l'analyse.

Comment IronPDF génère-t-il la même facture ?

Professional invoice PDF #12345 rendered with IronPDF showing preserved CSS styling, properly formatted table with service item for $100, and functioning 'View Terms' hyperlink, demonstrating the Chrome rendering engine's superior HTML/CSS support compared to XMLWorker

Pourquoi ces éléments HTML posent-ils problème avec iText ?

Avec le XMLWorker de iText, cette facture pourrait échouer en raison du style de tableau, des propriétés de largeur ou des spécifications de police. L'erreur " ce document ne comporte aucune page " apparaît souvent lorsque ces éléments ne sont pas pris en charge. Les hyperliens et les références de requêtes média peuvent également ne pas s'afficher correctement. Ces limitations deviennent critiques lors de la mise en œuvre de fonctionnalités PDF avancées telles que les signatures numériques ou la numérotation des pages dans les applications professionnelles.

Selon la documentation du Mozilla Developer Network sur CSS , le CSS moderne comprend des centaines de propriétés et de valeurs prises en charge nativement par les navigateurs. XMLWorker ne couvre qu'une petite partie de ces cas, ce qui explique pourquoi le contenu web réel provoque systématiquement des erreurs d'analyse.

Comment gérer la conversion HTML vers PDF sans erreurs d'analyse ?

IronPDF utilise un moteur de rendu basé sur Chrome qui traite le HTML exactement comme il apparaît dans un navigateur web. Cette approche élimine les erreurs d'analyse et prend en charge toutes les fonctionnalités HTML et CSS modernes. Vous pouvez consulter la documentation de l'API ChromePdfRenderer pour obtenir la liste complète des options de configuration. Le moteur Chrome prend en charge l'exécution de JavaScript , les polices Web et les mises en page réactives, ce que XMLWorker ne peut pas gérer.

Comment installer IronPDF via NuGet?

Avant d'écrire le moindre code, installez le package NuGet IronPDF . Vous pouvez le faire depuis l'interface de ligne de commande .NET :

> dotnet add package IronPdf

Ou depuis la console du gestionnaire de packages NuGet dans Visual Studio :

PM > Install-Package IronPdf

Une fois installé, vous avez accès à ChromePdfRenderer, qui remplace l'ensemble du pipeline iText + XMLWorker par un appel unique et fiable.

Comment convertir du HTML en PDF avec IronPDF?

L'exemple suivant rend le même HTML de facture qui a causé des échecs dans iText. Nontez qu'il n'y a pas de contournements, pas de paragraphes vides à précéder, et pas d'échecs silencieux à gérer :

using IronPdf;

ChromePdfRenderer renderer = new ChromePdfRenderer();

// Configure rendering options for production use
renderer.RenderingOptions.MarginTop = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;

string html = @"<div style='font-family: Arial; width: 100%;'>
    <h1 style='color: #2e6c80;'>Invoice #12345</h1>
    <table style='width: 100%; border-collapse: collapse;'>
        <tr>
            <th style='border: 1px solid #ddd; padding: 8px;'>Item</th>
            <th style='border: 1px solid #ddd; padding: 8px;'>Price</th>
        </tr>
        <tr>
            <td style='border: 1px solid #ddd; padding: 8px;'>Service</td>
            <td style='border: 1px solid #ddd; padding: 8px;'>$100.00</td>
        </tr>
    </table>
</div>";

PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");

À quoi ressemble le résultat IronPDF ?

Facture professionnelle propre PDF affichant la facture n°12345 avec un tableau à deux colonnes correctement formaté contenant les en-têtes Article et Prix, démontrant le rendu fiable des tableaux HTML par IronPDF sans erreurs d'analyse ni problèmes de formatage

Pourquoi cette approche élimine-t-elle les erreurs d'analyse syntaxique ?

Ce code crée avec succès le fichier PDF sans aucune exception. La méthode traite automatiquement les fichiers HTML et CSS complexes, éliminant ainsi la nécessité de recourir à des solutions de contournement. Le contenu est rendu au pixel près, correspondant à la prévisualisation du navigateur. IronPDF prend également en charge le rendu asynchrone , les marges personnalisées et la compression PDF pour des fichiers de taille optimisée.

Pour les scénarios impliquant du contenu riche en JavaScript ou des applications monopage, l'option RenderDelay d'IronPDF permet d'exécuter le JavaScript avant que le PDF soit capturé -- ce que XMLWorker ne peut pas faire du tout. L'exemple suivant ajoute des en-têtes, des pieds de page et des paramètres de sécurité selon un modèle asynchrone prêt pour la production :

using IronPdf;
using Microsoft.Extensions.Logging;

// Production-ready PDF generation with IronPDF
public class PdfGenerator
{
    private readonly ChromePdfRenderer _renderer;
    private readonly ILogger<PdfGenerator> _logger;

    public PdfGenerator(ILogger<PdfGenerator> logger)
    {
        _logger = logger;
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.Timeout = 60;
        _renderer.RenderingOptions.EnableJavaScript = true;
        _renderer.RenderingOptions.RenderDelay = 2000;
        _renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
        {
            Height = 25,
            HtmlFragment = "<div style='text-align: center;'>{page} of {total-pages}</div>"
        };
    }

    public async Task<PdfDocument> GenerateWithRetry(string html, int maxRetries = 3)
    {
        for (int i = 0; i < maxRetries; i++)
        {
            try
            {
                _logger.LogInformation("Generating PDF, attempt {Attempt}", i + 1);
                return await _renderer.RenderHtmlAsPdfAsync(html);
            }
            catch (Exception ex)
            {
                _logger.LogWarning("PDF generation failed: {Message}", ex.Message);
                if (i == maxRetries - 1) throw;
                await Task.Delay(1000 * (i + 1));
            }
        }
        throw new InvalidOperationException("PDF generation failed after retries");
    }
}

Quelle est la meilleure solution pour générer des PDF fiables ?

Lorsqu'on compare les deux bibliothèques de conversion HTML vers PDF, les différences de fonctionnalités affectent directement la qualité du PDF et la fiabilité du déploiement :

Comparaison des fonctionnalités : iText avec XMLWorker vs IronPDF
CaractéristiqueiText + XMLWorkerIronPDF
Prise en charge moderne du HTML/CSSLimité (HTML 4, CSS 2)Complet (moteur de rendu Chrome)
Exécution JavaScriptNonOui
Gestion des erreursExceptions d'analyse courantesRendu fiable
Tables complexesÉchoue souventPrise en charge complète
Polices personnaliséesIntégration manuelle requiseGestion automatique
Support SVGNonOui
rendu asynchroneNonOui
Prise en charge de Docker/LinuxLimitéePrise en charge native complète
types de médias CSSBasiqueSérigraphie et impression
Outils de débogageLimitéeIntégration des outils de développement Chrome

Comment migrer de iText vers IronPDF ?

Pour les développeurs qui rencontrent l'erreur "le document n'a pas de pages", la migration vers IronPDF offre une solution immédiate. Le processus de conversion est simple et IronPDF propose une documentation complète ainsi que des exemples de code . La comparaison avant-après suivante illustre la réduction de la complexité :

// Before (iTextSharp) -- error-prone approach requiring workarounds
public byte[] CreatePdfWithIText(string htmlContent)
{
    using var ms = new MemoryStream();
    var document = new Document();
    var writer = PdfWriter.GetInstance(document, ms);
    document.Open();

    // Must add empty paragraph to avoid "no pages" error
    document.Add(new Paragraph(""));

    try
    {
        using var sr = new StringReader(htmlContent);
        XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr);
    }
    catch (Exception ex)
    {
        document.Add(new Paragraph("Error: " + ex.Message));
    }

    document.Close();
    return ms.ToArray();
}

// After (IronPDF) -- reliable, no workarounds needed
public byte[] CreatePdfWithIron(string htmlContent)
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.RenderDelay = 500;

    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
    return pdf.BinaryData;
}

Qu'est-ce qui rend l'API d'IronPDF plus conviviale pour les développeurs ?

L'API simplifiée signifie moins de code à maintenir et pas d'erreurs d'analyse à déboguer. IronPDF offre également des fonctionnalités permettant d' ajouter des en-têtes et des pieds de page , de fusionner des PDF et d'appliquer des signatures numériques sans solutions de contournement complexes. Pour les équipes travaillant dans des environnements Docker ou déployant sur des serveurs Linux, IronPDF offre un comportement cohérent sur toutes les plateformes.

NuGetInstaller avec NuGet

PM > Install-Package IronPdf

Install IronPDF by running the command above in the NuGet Package Manager Console, or search for the package in the NuGet Package Manager.

Démarrez votre essai gratuit pour bénéficier d'une conversion HTML vers PDF sans erreur.

Quelles sont vos prochaines étapes ?

L'erreur "document has no pages" provient de limitations fondamentales d'analyse intégrées dans le XMLWorker de iText. Bien qu'il existe des solutions de contournement - comme le pré-remplissage du document avec un paragraphe vide - , elles ne résolvent pas le problème sous-jacent lié au traitement complexe du HTML. Le rendu d'IronPDF basé sur Chrome offre une solution fiable qui gère le contenu web moderne sans exceptions d'analyse.

Pour les applications de production nécessitant une génération cohérente de PDF à partir de HTML, IronPDF élimine la frustration liée au débogage des erreurs d'analyseur syntaxique et fournit des résultats professionnels. Le moteur gère tous les éléments HTML, les styles CSS et JavaScript, garantissant ainsi un affichage correct des documents à chaque fois. Que vous créiez des factures , des rapports ou tout autre document contenant du texte, des tableaux et des images, IronPDF vous offre la solution idéale.

Pour aller de l'avant, voici les prochaines étapes recommandées :

Veuillez noter: iText et XMLWorker sont des marques déposées de leurs propriétaires respectifs. Ce site n'est pas affilié, approuvé par, ou sponsorisé par iText ou XMLWorker. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.
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 et créer des manuels bien structurés et visuellement attrayants.

...
Lire la suite

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

OR
bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise
Bibliothèque C# NuGet pour PDF
Installer avec NuGet

Version : 2026.9

PM > Install-Package IronPdf
nuget.org/packages/IronPdf/
  1. Dans l'explorateur de solutions, faites un clic droit sur Références, Gestion des packages NuGet
  2. Sélectionnez Parcourir et recherchez « IronPDF »
  3. Sélectionnez le package et installez
C# PDF DLL
Télécharger DLL

Version : 2026.9

ou téléchargez l'installateur Windows ici.

  1. Téléchargez et décompressez IronPDF à un emplacement tel que ~/Libs dans votre répertoire de solution
  2. Dans l'explorateur de solutions Visual Studio, faites un clic droit sur Références. Sélectionnez Parcourir, « IronPDF.dll »

Licences à partir de 999 $