IRONSOFTWAREHOME
VÍDEOS

Como renderizar imagens armazenadas no Armazenamento de Blobs do Azure em C#

Curtis Chau
Curtis Chau
Updated: 19 de julho de 2026

Migrar de PuppeteerSharp para IronPDF move seu fluxo de trabalho de geração de PDF de uma ferramenta de automação de navegador com uma dependência de Chromium de 300 MB ou mais para uma biblioteca de PDF projetada especialmente que oferece gerenciamento automático de memória. Este guia fornece um caminho de migração passo a passo que elimina o download do runtime Chromium, aborda o crescimento de memória reportado sob carga, e adiciona capacidades abrangentes de manipulação de PDF.

Por que migrar do PuppeteerSharp para o IronPDF?

Entendendo o PuppeteerSharp

PuppeteerSharp é uma versão .NET do Puppeteer do Google, que traz recursos de automação de navegador para C#. Ele gera PDFs usando a funcionalidade integrada de impressão para PDF do Chrome — o mesmo que pressionar Ctrl+P em um navegador. Isso produz um resultado pronto para impressão, otimizado para papel, que difere do que você vê na tela.

O PuppeteerSharp foi projetado para testes e extração de dados da web, não para geração de documentos. Embora seja uma ferramenta capaz, o uso do PuppeteerSharp para geração de PDFs apresenta desafios significativos de produção.

O problema da automação do navegador

O PuppeteerSharp foi projetado para automação de navegadores, não para geração de documentos. Isso cria problemas fundamentais ao usá-lo com PDFs:

  1. É necessário fazer o download do Chromium (mais de 300 MB) antes do primeiro uso. Uma desvantagem significativa do PuppeteerSharp é o seu tamanho de implantação considerável, principalmente devido ao binário do Chromium que ele inclui. Esse tamanho considerável pode inflar as imagens do Docker e causar problemas de inicialização a frio em ambientes sem servidor.

  2. Crescimento de memória relatado sob carga requerendo reciclagem manual do navegador. Sob carga sustentada, usuários do PuppeteerSharp relataram acúmulo de memória em instâncias de navegador, tipicamente abordado por reciclagem manual do processo.

  3. Padrões assíncronos complexos com gerenciamento do ciclo de vida do navegador.

  4. Impressão em PDF (equivalente a Ctrl+P, não captura de tela). Os layouts podem ser redimensionados, os planos de fundo podem ser omitidos por padrão e a saída é paginada para impressão em vez de corresponder à área visível do navegador.

  5. Não há suporte para PDF/A ou PDF/UA para atender aos requisitos de conformidade. O PuppeteerSharp não consegue gerar documentos compatíveis com PDF/A (arquivísticos) ou PDF/UA (acessíveis).

  6. Sem manipulação de PDF - apenas geração, sem mesclagem/divisão/edição. Embora o PuppeteerSharp seja eficiente na geração de PDFs, ele carece de recursos para manipulação adicional, como mesclagem, divisão, proteção ou edição de PDFs.

Comparação entre PuppeteerSharp e IronPDF

AspectoPuppeteerSharpIronPDF
Objetivo principalAutomação do navegadorGeração de PDF
Dependência do ChromiumDownload separado de mais de 300 MBMotor otimizado integrado
Complexidade da APICiclo de vida assíncrono do navegador/páginaFrases curtas síncronas
InicializaçãoBrowserFetcher.DownloadAsync() + LaunchAsyncnew ChromePdfRenderer()
Gerenciamento de memóriaReciclagem manual do navegadorAutomático
Memória sob cargaCrescimento relatado em cargas pesadasEstável em execuções sustentadas
Suporte PDF/ANão disponívelApoiado
Acessibilidade PDF/UANão disponívelApoiado
Edição de PDFNão disponívelMesclar, dividir, carimbar, editar
Assinaturas digitaisNão disponívelApoiado
Segurança da roscaLimitado (conforme orientação upstream)Completo
LicenciamentoMIT (código aberto)Licença comercial

Suporte da plataforma

Biblioteca.NET Framework 4.7.2.NET Core 3.1.NET 6-8.NET 10
IronPDFCompletoCompletoCompletoCompleto
PuppeteerSharpvia netstandard2.0CompletoCompletoCompleto

O suporte do IronPDF em alvos modernos do .NET significa que ele se encaixa na maioria das aplicações existentes sem atrito de compatibilidade.


Antes de começar

Pré-requisitos

  1. Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
  3. Licença do IronPDF: Obtenha sua chave de licença em IronPDF

Alterações no pacote NuGet

# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp

# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder

# Add IronPDF
dotnet add package IronPdf
SHELL

Nenhum BrowserFetcher.DownloadAsync() necessário com IronPDF - o mecanismo de renderização é incluído automaticamente.

Configuração de licença

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Referência completa da API

Alterações de namespace

// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;

Mapeamentos da API principal

API PuppeteerSharpAPI IronPDFNotas
new BrowserFetcher().DownloadAsync()Não é necessárioSem download no navegador
Puppeteer.LaunchAsync(options)Não é necessárioSem gerenciamento de navegador
browser.NewPageAsync()Não é necessárioSem contexto de página
page.GoToAsync(url)renderer.RenderUrlAsPdf(url)Renderização direta
page.SetContentAsync(html)renderer.RenderHtmlAsPdf(html)Renderização direta
page.PdfAsync(path)pdf.SaveAs(path)Após a renderização
await page.CloseAsync()Não é necessárioLimpeza automática
await browser.CloseAsync()Não é necessárioLimpeza automática
PdfOptions.FormatRenderingOptions.PaperSizeTamanho do papel
PdfOptions.LandscapeRenderingOptions.PaperOrientationOrientação
PdfOptions.MarginOptionsRenderingOptions.MarginTop/Bottom/Left/Rightmargens individuais
PdfOptions.PrintBackgroundRenderingOptions.PrintHtmlBackgroundsImpressão de fundo
PdfOptions.HeaderTemplateRenderingOptions.HtmlHeaderCabeçalhos HTML
PdfOptions.FooterTemplateRenderingOptions.HtmlFooterRodapés HTML
page.WaitForSelectorAsync()RenderingOptions.WaitFor.HtmlElementIdAguarde o elemento

Exemplos de migração de código

Exemplo 1: Conversão básica de HTML para PDF

Antes (PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();
        
        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });
        
        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
        await page.PdfAsync("output.pdf");
    }
}

Após (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
        pdf.SaveAs("output.pdf");
    }
}

Este exemplo demonstra a diferença arquitetônica fundamental. PuppeteerSharp requer seis operações assíncronas: BrowserFetcher.DownloadAsync() (download do Chromium de 300MB+), Puppeteer.LaunchAsync(), browser.NewPageAsync(), page.SetContentAsync(), e page.PdfAsync(), além de uma disposição adequada com await using.

IronPDF elimina toda essa complexidade: crie um ChromePdfRenderer, chame RenderHtmlAsPdf(), e SaveAs(). Sem padrões assíncronos, sem ciclo de vida do navegador, sem downloads do Chromium. A abordagem do IronPDF oferece uma sintaxe mais limpa e melhor integração com aplicativos .NET modernos. Consulte a documentação de conversão de HTML para PDF para obter exemplos completos.

Exemplo 2: Conversão de URL para PDF

Antes (PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();
        
        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });
        
        await using var page = await browser.NewPageAsync();
        await page.GoToAsync("https://www.example.com");
        await page.PdfAsync("webpage.pdf");
    }
}

Após (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}

PuppeteerSharp usa GoToAsync() para navegar até um URL seguido de PdfAsync().IronPDF fornece um único método RenderUrlAsPdf() que lida com a navegação e a geração de PDF em uma única chamada. Saiba mais em nossos tutoriais .

Exemplo 3: Configurações de página personalizadas com margens

Antes (PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();
        
        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });
        
        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        
        await page.PdfAsync("custom.pdf", new PdfOptions
        {
            Format = PaperFormat.A4,
            Landscape = true,
            MarginOptions = new MarginOptions
            {
                Top = "20mm",
                Bottom = "20mm",
                Left = "20mm",
                Right = "20mm"
            }
        });
    }
}

Após (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 20;
        renderer.RenderingOptions.MarginRight = 20;
        
        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        pdf.SaveAs("custom.pdf");
    }
}

Este exemplo mostra como as opções de PDF são mapeadas entre as duas bibliotecas. PuppeteerSharp usa PdfOptions com Format, Landscape, e MarginOptions contendo valores de string ("20mm").IronPDF usa propriedades RenderingOptions com enums de tamanho de papel direto, enums de orientação, e valores numéricos de margem em milímetros.

Mapeamentos de teclas:

  • Format = PaperFormat.A4PaperSize = PdfPaperSize.A4
  • Landscape = truePaperOrientation = PdfPaperOrientation.Landscape
  • MarginOptions.Top = "20mm"MarginTop = 20 (milímetros numéricos)

Crescimento de Memória Sob Carga Sustentada

Usuários relataram acúmulo de memória com PuppeteerSharp sob carga sustentada, tipicamente mitigado por reciclagem manual do navegador:

// PuppeteerSharp - memory growth typically requires periodic recycling
for (int i = 0; i < 1000; i++)
{
    var page = await browser.NewPageAsync();
    await page.SetContentAsync($"<h1>Document {i}</h1>");
    await page.PdfAsync($"doc_{i}.pdf");
    await page.CloseAsync();
}
// Recommended: await browser.CloseAsync(); and re-launch every N operations

//IronPDF- reuse a single renderer across operations
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
    var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
    pdf.SaveAs($"doc_{i}.pdf");
    // Memory managed automatically
}
C#

O IronPDF elimina a necessidade da infraestrutura de agrupamento de navegadores exigida pelo PuppeteerSharp:

// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
    private readonly ConcurrentBag<IBrowser> _browsers;
    private readonly SemaphoreSlim _semaphore;
    private int _operationCount;
    // ... recycling logic ...
}

// After (IronPDF - simple reuse)
public class PdfService
{
    private readonly ChromePdfRenderer _renderer = new();

    public byte[] Generate(string html)
    {
        return _renderer.RenderHtmlAsPdf(html).BinaryData;
    }
}

Notas críticas sobre migração

Conversão de assíncrono para síncrono

O PuppeteerSharp requer async/await em todas as suas etapas; O IronPDF suporta operações síncronas:

// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    await new BrowserFetcher().DownloadAsync();
    await using var browser = await Puppeteer.LaunchAsync(...);
    await using var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfDataAsync();
}

// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}

// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}

Conversão de Unidades de Margem

PuppeteerSharp usa unidades de corda; O IronPDF usa milímetros numéricos:

// PuppeteerSharp - string units
MarginOptions = new MarginOptions
{
    Top = "1in",      // 25.4mm
    Bottom = "0.75in", // 19mm
    Left = "1cm",     // 10mm
    Right = "20px"    // ~7.5mm at 96dpi
}

//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25;    // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;
C#

Conversão de espaços reservados para cabeçalho/rodapé

Puppeteer Classe AfiadaEspaço reservado para IronPDF
<span class='pageNumber'>{page}
<span class='totalPages'>{total-pages}
<span class='date'>{date}
<span class='title'>{html-title}

Novas funcionalidades após a migração

Após migrar para o IronPDF, você obtém recursos que o PuppeteerSharp não pode fornecer:

Fusão de PDFs

var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");

Marcas d'água

var watermark = new TextStamper
{
    Text = "CONFIDENTIAL",
    FontSize = 48,
    Opacity = 30,
    Rotation = -45
};
pdf.ApplyStamp(watermark);

Proteção por senha

pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

Assinaturas digitais

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);

Conformidade com PDF/A

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);

Resumo da comparação de desempenho

MétricaPuppeteerSharpIronPDFMelhoria
Primeiro PDF (Inicialização a frio)45s+~20s55% mais rápido
PDFs subsequentesVariávelConsistentePrevisível
Uso de memóriaMais de 500 MB (e continua crescendo)~50 MB (estável)90% menos memória
Espaço em disco (Chromium)300 MB ou mais0Eliminar downloads
Download do navegadorObrigatórioNão é necessárioConfiguração zero
Segurança da roscaLimitadoCompletoConcorrência confiável
Tempo de geração do PDF45sanos 2055% mais rápido

Lista de verificação para migração

Pré-migração

  • Identificar todas as utilizações do PuppeteerSharp na base de código.
  • Valores de margem do documento (converter strings em milímetros)
  • Observe a sintaxe dos espaços reservados para cabeçalho/rodapé para conversão.
  • Eliminar a infraestrutura de agrupamento/reciclagem de navegadores
  • Obtenha a chave de licença do IronPDF em IronPDF

Alterações no pacote

  • Remover pacote NuGet PuppeteerSharp
  • Excluir pasta .local-chromium para recuperar ~300MB de espaço em disco
  • Instalar pacote NuGet IronPdf: dotnet add package IronPdf

Alterações no código

  • Atualizar importações de namespace
  • Remover chamadas BrowserFetcher.DownloadAsync()
  • Remover Puppeteer.LaunchAsync() e gerenciamento de navegador
  • Substituir page.SetContentAsync() + page.PdfAsync() por RenderHtmlAsPdf()
  • Substituir page.GoToAsync() + page.PdfAsync() por RenderUrlAsPdf()
  • Converter strings de margem em valores em milímetros
  • Converter sintaxe de espaço reservado de cabeçalho/rodapé
  • Remover todos os códigos de descarte de navegador/página
  • Excluir a infraestrutura de agrupamento de navegadores
  • Adicionar inicialização de licença na inicialização do aplicativo

Pós-migração

  • Comparação visual da saída em PDF
  • Teste de carga para estabilidade da memória (deve permanecer estável sem reinicialização)
  • Verificar a renderização do cabeçalho/rodapé com os números de página
  • Adicionar novas funcionalidades (segurança, marcas d'água, mesclagem) conforme necessário.

Observe: PuppeteerSharp é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado pelo PuppeteerSharp. Todos os nomes, logos e marcas dos produtos são de propriedade de seus respectivos donos. 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.