IRONSOFTWAREHOME
FERRAMENTAS DE PDF

PDF vs PDF/A (Comparação e Como Usar)

Curtis Chau
Curtis Chau
Updated: 20 de junho de 2026

O erro "documento não tem páginas" do iText ocorre quando o XMLWorker falha em analisar conteúdo HTML, mas o renderizador baseado no Chrome do IronPDF elimina esse problema ao processar HTML exatamente como os navegadores fazem, fornecendo geração confiável de PDF sem exceções de análise.

Converter HTML em PDF é um requisito comum em aplicativos .NET, mas os desenvolvedores que usam iText frequentemente encontram o erro "documento não tem páginas". Esse erro ocorre quando o processo de geração do documento PDF falha, deixando os desenvolvedores em busca de soluções. Esta análise explora por que isso acontece e como resolver o problema de forma eficaz com os recursos de conversão de HTML para PDF do IronPDF .

O que causa o erro "O documento não tem páginas"?

A exceção "documento não tem páginas" ocorre quando o analisador do iText falha em processar o conteúdo HTML em um documento PDF válido. Esse erro normalmente ocorre durante a operação de fechamento do documento, conforme detalhado em várias discussões no Stack Overflow sobre esse problema . Compreender a causa raiz ajuda os desenvolvedores a escolher a biblioteca de PDF adequada às suas necessidades .

O erro surge porque o XMLWorker -- componente de análise de HTML do iText -- falha silenciosamente quando encontra estruturas HTML que não pode processar. Em vez de gerar uma exceção durante a análise sintática, produz um documento vazio. Quando o documento é fechado, o iText detecta que nenhum conteúdo foi escrito e lança a exceção "documento não tem páginas". Esse modo de falha silenciosa torna a depuração particularmente frustrante, já que o rastreamento da pilha aponta para a operação de fechamento em vez da falha de análise sintática propriamente dita.

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

O que é exibido no console quando esse erro ocorre?

Console de Depuração do Microsoft Visual Studio mostrando mensagem de erro 'Documento não tem páginas' com cabeçalho rosa em fundo escuro, exibindo detalhes da pilha de rastreamento e a exceção XMLWorker do iText que ocorre quando a análise de HTML falha durante a geração de PDF

Este código tenta criar um arquivo PDF a partir de HTML, mas encontra uma exceção porque o XMLWorker não conseguiu analisar o conteúdo HTML corretamente. A operação de gravação é concluída, mas nenhum conteúdo é adicionado ao documento, resultando em um arquivo vazio. Essa falha de análise é um dos problemas mais comuns que os desenvolvedores enfrentam ao trabalhar com a conversão de HTML para PDF em aplicativos ASP.NET . O problema se torna mais complexo ao lidar com estilos CSS personalizados ou conteúdo renderizado por JavaScript.

Por que a biblioteca substituta enfrenta o mesmo problema?

Embora o XMLWorker tenha substituído o HTMLWorker, que foi descontinuado, ele ainda enfrenta o mesmo problema com certas estruturas HTML. O problema persiste porque o XMLWorker tem requisitos de análise rigorosos, conforme documentado nos fóruns oficiais do iText . Essa limitação afeta desenvolvedores que tentam implementar a conversão de HTML para PDF com precisão de pixels ou que trabalham com layouts CSS responsivos em aplicações web modernas.

A solução alternativa mais comum é preencher previamente o documento com um parágrafo vazio antes de analisar o HTML. Isso evita a exceção "nenhuma página" garantindo que exista pelo menos um elemento de conteúdo quando o documento for fechado:

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

Como fica o arquivo PDF gerado com essa solução alternativa?

PDF gerado com sucesso exibindo o cabeçalho 'Olá, Mundo!' com o cabeçalho 'Versão rascunho' e conteúdo de teste, mostrando a renderização HTML bem-sucedida do XMLWorker após a implementação da solução alternativa de parágrafo vazio que evita o erro 'O documento não possui páginas'

Por que elementos HTML complexos ainda não são renderizados corretamente?

Adicionar um parágrafo vazio evita o erro imediato, mas HTML complexo com elementos de tabela, imagens ou fontes personalizadas geralmente não é renderizado corretamente. O conteúdo pode estar ausente ou malformado no documento PDF resultante. Os desenvolvedores encontram o mesmo problema ao processar HTML com estilos incorporados, elementos de hiperlink ou propriedades de largura específicas. Referências nulas e a falta de renderização de elementos criam problemas adicionais que exigem soluções mais aprofundadas.

O XMLWorker foi projetado para lidar com um subconjunto de HTML 4 e CSS básico 2. Páginas da web modernas rotineiramente usam recursos bem além desse escopo: CSS Grid, Flexbox, variáveis CSS, expressões calc(), gráficos SVG e renderização movida por JavaScript. Qualquer um desses fatores pode desencadear o erro "nenhuma página" ou produzir resultados corrompidos silenciosamente, sem nenhuma mensagem de erro descritiva para orientar a correção.

// 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 NotSupportedException("Flexbox layout not supported");

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

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

Como converter HTML moderno sem cometer o mesmo erro?

Este cenário real demonstra a conversão de uma fatura formatada de HTML para PDF. O exemplo inclui elementos comuns que frequentemente causam problemas: CSS embutido, consultas de mídia, layouts de tabela e hiperlinks. Esses são os tipos de estruturas que acionam o erro "nenhuma página" no 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

O que acontece quando o iText processa esta fatura?

Básico 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

Quando o iText processa este modelo de fatura, a saída é frequentemente despojada de estilização CSS, faltando cores de fundo e perdendo bordas de tabela. A consulta @media print é ignorada, e qualquer referência a fontes da web causa falhas de análise silenciosas. Se o HTML contiver uma propriedade CSS que o XMLWorker não reconheça, todo o bloco poderá não ser renderizado, resultando em conteúdo ausente sem que nenhum erro seja exibido durante a análise.

Como o IronPDF renderiza a mesma fatura?

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

Por que esses elementos HTML causam problemas no iText?

Com o XMLWorker do iText, esta fatura pode falhar devido à estilização de tabelas, propriedades de largura ou especificações de fontes. O erro "o documento não possui páginas" geralmente ocorre quando esses elementos não são suportados. Hiperlinks e referências de media queries também podem não ser renderizados corretamente. Essas limitações tornam-se críticas ao implementar recursos avançados de PDF, como assinaturas digitais ou números de página, em aplicações comerciais.

De acordo com a documentação da Mozilla Developer Network sobre CSS , o CSS moderno inclui centenas de propriedades e valores que os navegadores suportam nativamente. O XMLWorker abrange apenas uma pequena fração desses casos, e é por isso que o conteúdo da web do mundo real causa falhas de análise de forma consistente.

Como lidar com a conversão de HTML para PDF sem erros de análise sintática?

O IronPDF utiliza um mecanismo de renderização baseado no Chrome que processa o HTML exatamente como ele aparece em um navegador da web. Essa abordagem elimina erros de análise sintática e oferece suporte a todos os recursos modernos de HTML e CSS. Você pode consultar a referência da API ChromePdfRenderer para obter a lista completa de opções de configuração. O mecanismo do Chrome oferece suporte à execução de JavaScript , fontes da web e layouts responsivos que o XMLWorker não consegue lidar.

Como instalar o IronPDF via NuGet?

Antes de escrever qualquer código, instale o pacote NuGet IronPDF . Você pode fazer isso a partir da CLI do .NET :

dotnet add package IronPdf

Ou a partir do Console do Gerenciador de Pacotes NuGet no Visual Studio:

PM > Install-Package IronPdf

Uma vez instalado, você tem acesso a ChromePdfRenderer, que substitui todo o pipeline iText + XMLWorker por uma chamada única e confiável.

Como converter HTML para PDF com o IronPDF?

O exemplo a seguir renderiza o mesmo HTML de fatura que causou falhas no iText. Observe que não há soluções alternativas, nem parágrafos vazios para prencher, nem falhas silenciosas a gerenciar:

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

Qual é a aparência da saída do IronPDF ?

PDF de fatura profissional e limpa, mostrando a Fatura nº 12345 com tabela de duas colunas formatada corretamente, contendo os cabeçalhos Item e Preço, demonstrando a renderização confiável de tabelas HTML do IronPDF sem erros de análise ou problemas de formatação

Por que essa abordagem elimina erros de análise sintática?

Este código cria o arquivo PDF com sucesso, sem nenhuma exceção. O método lida automaticamente com HTML e CSS complexos, eliminando a necessidade de soluções alternativas. O conteúdo é renderizado com perfeição de pixels, correspondendo à pré-visualização do navegador. O IronPDF também oferece suporte à renderização assíncrona , margens personalizadas e compressão de PDF para otimizar o tamanho dos arquivos.

Para cenários que envolvem conteúdo pesado em JavaScript ou aplicativos de página única, a opção RenderDelay do IronPDF permite que o JavaScript seja executado antes que o PDF seja gerado -- algo que o XMLWorker não pode fazer de forma alguma. O exemplo a seguir adiciona cabeçalhos, rodapés e configurações de segurança em um padrão assíncrono pronto para produção:

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

Qual é a melhor solução para geração confiável de PDFs?

Ao comparar as duas bibliotecas para conversão de HTML para PDF, as diferenças de capacidade afetam diretamente a qualidade do PDF e a confiabilidade da implementação:

Comparação de recursos: iText com XMLWorker vs. IronPDF
RecursoiText + XMLWorkerIronPDF
Suporte moderno a HTML/CSSLimitado (HTML 4, CSS 2)Completo (mecanismo de renderização do Chrome)
Execução de JavaScriptNãoSim
Tratamento de errosExceções de análise sintática comunsRenderização confiável
Tabelas complexasFrequentemente falhaApoio total
Fontes personalizadasIncorporação manual necessáriamanuseio automático
Suporte a SVGNãoSim
Renderização assíncronaNãoSim
Suporte a Docker/LinuxLimitadoSuporte nativo completo
tipos de mídia CSSBásicoSerigrafia e Impressão
Ferramentas de depuraçãoLimitadoIntegração do Chrome DevTools

Como migrar do iText para o IronPDF?

Para desenvolvedores que enfrentam o erro "documento não possui páginas", a migração para o IronPDF oferece uma solução imediata. O processo de conversão é direto, e o IronPDF oferece documentação completa e exemplos de código. A comparação a seguir, de antes e depois, mostra a redução na complexidade:

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

O que torna a API do IronPDF mais amigável para desenvolvedores?

A API simplificada significa menos código para manter e nenhum erro de análise para depurar. O IronPDF também oferece recursos para adicionar cabeçalhos e rodapés , mesclar PDFs e aplicar assinaturas digitais sem soluções alternativas complexas. Para equipes que trabalham em ambientes Docker ou que fazem implantações em servidores Linux, o IronPDF oferece comportamento consistente em todas as plataformas.

NuGetInstalar com 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.

Inicie seu teste gratuito para experimentar a conversão de HTML para PDF sem erros.

Quais são os seus próximos passos?

O erro "documento não tem páginas" decorre de limitações fundamentais de análise embutidas no XMLWorker do iText. Embora existam soluções alternativas — como preencher previamente o documento com um parágrafo vazio — elas não resolvem o problema subjacente do processamento complexo de HTML. A renderização do IronPDF baseada no Chrome oferece uma solução confiável que lida com conteúdo da web moderno sem exceções de análise sintática.

Para aplicações de produção que exigem a geração consistente de PDFs a partir de HTML, o IronPDF elimina a frustração de depurar erros de análise sintática e oferece resultados profissionais. O mecanismo processa todos os elementos HTML, estilos CSS e JavaScript, garantindo que os documentos sejam renderizados corretamente sempre. Seja para criar faturas , relatórios ou qualquer documento com texto, tabelas e imagens, o IronPDF oferece a solução ideal.

Para prosseguir, seguem os próximos passos recomendados:

Observe: iText e XMLWorker são marcas registradas de seus respectivos proprietários. Este site não é afiliado, endossado ou patrocinado pelo iText ou XMLWorker. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.
Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.

...
Leia mais

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua demonstração ao vivo gratuita.
Booking Badge

Aprovado por milhões de engenheiros em todo o mundo.

Logotipos dos clientes da Iron Software
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.