Ir para o conteúdo do rodapé
GUIAS DE MIGRAçãO

Como migrar do PeachPDF para o IronPDF em C#

A migração do PêssegoPDF para o IronPDF proporciona acesso à geração de PDFs de nível empresarial com recursos abrangentes, desenvolvimento ativo e suporte profissional. Este guia fornece um caminho de migração passo a passo que leva você do fluxo de trabalho de HTML-para-PDF assíncrono pré-1.0 do PêssegoPDF para uma solução mais completa de PDF com renderização Chromium, configurações de segurança e APIs de manipulação de documentos.

Por que migrar do PêssegoPDF para o IronPDF?

Entendendo o PeachPDF

O PêssegoPDF é um recém-chegado ao ecossistema .NET , projetado para desenvolvedores que precisam converter HTML em PDF. Como biblioteca, o PêssegoPDF promete uma implementação .NET pura, diferenciando-se por não depender de processos externos, garantindo assim uma integração perfeita em todas as plataformas que suportam .NET . Essa característica posiciona o PêssegoPDF como uma opção atraente para projetos que buscam uma solução de biblioteca gerenciada e leve.

Apesar do seu potencial, o PêssegoPDF ainda está em desenvolvimento, o que evidencia tanto possibilidades interessantes quanto limitações importantes. O PêssegoPDF continua atraente devido ao seu .NET Core puro, que promete uma implementação simples em diversos ambientes. Não entanto, isso também se traduz em adoção limitada, com uma base de usuários menor e suporte impulsionado pela comunidade.

As limitações do PeachPDF

PeachPDF é uma biblioteca .NET com manutenção única, versão pré-1.0 (última 0.7.26, outubro de 2025) lançada sobBSD-3-Clausepor jhaygood86. Falta-lhe a maturidade, recursos e suporte de soluções estabelecidas. Principais razões para migrar:

  1. Conjunto de Recursos Pré-1.0: PêssegoPDF não tem assinaturas digitais embutidas, conformidade PDF/A, OCR, preenchimento de formulários ou API de cabeçalho/rodapé em nível de página.

  2. Sem motor JavaScript: PêssegoPDF é um renderizador de layout construído em PeachPDF.PdfSharpCore, não um navegador; scripts e layouts complexos de Grid/Flexbox não são executados.

  3. Apenas net8.0: o pacote tem como alvo net8.0; projetos mais antigos do .NET Framework / .NET 6 precisam ser atualizados ou escolher uma biblioteca diferente.

  4. Comunidade Pequena: um único mantenedor do GitHub, documentação limitada, exemplos limitados.

  5. Sem Suporte Empresarial: nenhum suporte comercial ou opções de SLA.

Comparação entre PêssegoPDF e IronPDF

Característica/Característica PêssegoPDF IronPDF
Implementação Puro .NET gerenciado (em PeachPDF.PdfSharpCore + SixLabors) Gerenciado com tempo de execução Chromium incorporado
Licença BSD-3-Clause Comercial
Framework Alvo Apenas net8.0 .NET Framework 4.6.2+, .NET 6/7/8
Base de usuários Pequeno (pré-1.0, 0.7.26 lançado em outubro de 2025) Grande
Apoiar Dirigido pela comunidade (manutenção única, jhaygood86) Profissional com suporte dedicado
Renderização HTML Motor de layout HTML+CSS no PdfSharpCore Cromo completo
Suporte a CSS Subconjunto HTML+CSS, fontes da web, @font-face CSS3 completo
JavaScript Não executado ES2024 completo
Assinaturas digitais Não Sim
Conformidade com PDF/A Não Sim
Documentação Limitado (único README) Extenso
Estado de desenvolvimento Pré-1.0 (0.7.26, out 2025) Liberação madura e estável

O IronPDF se destaca por sua funcionalidade mais ampla, suportando não apenas conversões de HTML para PDF, mas também OCR, marcas d'água e outros recursos avançados. Sua estrutura de suporte profissional oferece caminhos de resolução rápida para problemas que os desenvolvedores enfrentam.

Para equipes que adotam o moderno .NET, o IronPDF fornece recursos abrangentes e manutenção ativa para apoiar a estabilidade a longo prazo nas versões .NET atuais.


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 PeachPDF
dotnet remove package PeachPDF

# Install IronPDF
dotnet add package IronPdf
# Remove PeachPDF
dotnet remove package PeachPDF

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuração de licença

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

Identificar o uso do PeachPDF

# Audit PêssegoPDF usage in codebase
grep -r "using PeachPDF" --include="*.cs" .
grep -r "PdfGenerator\|PdfGenerateConfig\|GeneratePdf" --include="*.cs" .
# Audit PêssegoPDF usage in codebase
grep -r "using PeachPDF" --include="*.cs" .
grep -r "PdfGenerator\|PdfGenerateConfig\|GeneratePdf" --include="*.cs" .
SHELL

Referência completa da API

Alterações de namespace

// Before: PeachPDF
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PeachPDF
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports IronPdf
Imports IronPdf.Rendering
Imports System.IO
Imports System.Threading.Tasks
$vbLabelText   $csharpLabel

Mapeamentos da API principal

PêssegoPDF IronPDF
new PdfGenerator() new ChromePdfRenderer()
await generator.GeneratePdf(html, config) renderer.RenderHtmlAsPdf(html)
document.Save(stream) pdf.SaveAs(path)
document.Save(memStream) então memStream.ToArray() pdf.BinaryData
new PdfGenerateConfig { NetworkAdapter = new HttpClientNetworkAdapter(...) } renderer.RenderUrlAsPdf(url)
config.PageSize, config.PageOrientation renderer.RenderingOptions.PaperSize, .PaperOrientation
Incorporar no HTML da fonte (CSS position: fixed) RenderingOptions.HtmlHeader / HtmlFooter
Não suportado PdfDocument.FromFile(path)
Não suportado PdfDocument.Merge(pdfs) / pdf.AppendPdf(...)

Exemplos de migração de código

Exemplo 1: Conversão de string HTML para PDF

Antes (PeachPDF):

using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = "<html><body><h1>Hello World</h1></body></html>";

        var config = new PdfGenerateConfig
        {
            PageSize = PageSize.Letter,
            PageOrientation = PageOrientation.Portrait
        };

        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(html, config);

        using var stream = File.Create("output.pdf");
        document.Save(stream);
    }
}
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = "<html><body><h1>Hello World</h1></body></html>";

        var config = new PdfGenerateConfig
        {
            PageSize = PageSize.Letter,
            PageOrientation = PageOrientation.Portrait
        };

        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(html, config);

        using var stream = File.Create("output.pdf");
        document.Save(stream);
    }
}
Imports PeachPDF
Imports PeachPDF.PdfSharpCore
Imports System.IO
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Dim html As String = "<html><body><h1>Hello World</h1></body></html>"

        Dim config As New PdfGenerateConfig With {
            .PageSize = PageSize.Letter,
            .PageOrientation = PageOrientation.Portrait
        }

        Dim generator As New PdfGenerator()
        Dim document = Await generator.GeneratePdf(html, config)

        Using stream As FileStream = File.Create("output.pdf")
            document.Save(stream)
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Após (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim html = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Este exemplo mostra a diferença fundamental entre as duas bibliotecas. PêssegoPDF separa um PdfGenerator (motor) de um PdfGenerateConfig (configurações), expõe um método assíncrono GeneratePdf, e retorna um documento cujo método Save escreve para um Stream.IronPDF usa ChromePdfRenderer com RenderHtmlAsPdf(), que retorna um objeto PdfDocument com um método embutido SaveAs().

Uma vantagem prática da abordagem do IronPDF: o objeto PdfDocument pode ser ainda mais manipulado (adicionando marcas d'água, mesclando, configurações de segurança) antes de salvar, e SaveAs aceita um caminho de arquivo diretamente sem um FileStream intermediário. Veja a documentação de HTML para PDF para mais exemplos.

Exemplo 2: Conversão de URL para PDF

Antes (PeachPDF):

// PêssegoPDF has no ConvertUrl-style helper; URL fetching is wired via
// HttpClientNetworkAdapter and passing null HTML so the engine fetches the page.
using PeachPDF;
using PeachPDF.Network;
using PeachPDF.PdfSharpCore;
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var http = new HttpClient();

        var config = new PdfGenerateConfig
        {
            PageSize = PageSize.Letter,
            NetworkAdapter = new HttpClientNetworkAdapter(http, new Uri("https://www.example.com"))
        };

        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(null, config);

        using var stream = File.Create("webpage.pdf");
        document.Save(stream);
    }
}
// PêssegoPDF has no ConvertUrl-style helper; URL fetching is wired via
// HttpClientNetworkAdapter and passing null HTML so the engine fetches the page.
using PeachPDF;
using PeachPDF.Network;
using PeachPDF.PdfSharpCore;
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var http = new HttpClient();

        var config = new PdfGenerateConfig
        {
            PageSize = PageSize.Letter,
            NetworkAdapter = new HttpClientNetworkAdapter(http, new Uri("https://www.example.com"))
        };

        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(null, config);

        using var stream = File.Create("webpage.pdf");
        document.Save(stream);
    }
}
Imports PeachPDF
Imports PeachPDF.Network
Imports PeachPDF.PdfSharpCore
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Dim http As New HttpClient()

        Dim config As New PdfGenerateConfig With {
            .PageSize = PageSize.Letter,
            .NetworkAdapter = New HttpClientNetworkAdapter(http, New Uri("https://www.example.com"))
        }

        Dim generator As New PdfGenerator()
        Dim document = Await generator.GeneratePdf(Nothing, config)

        Using stream As FileStream = File.Create("webpage.pdf")
            document.Save(stream)
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Após (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim url = "https://www.example.com"
        Dim pdf = renderer.RenderUrlAsPdf(url)
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

PeachPDF não possui um assistente de URL-para-PDF de primeira classe; você define NetworkAdapter na configuração para um HttpClientNetworkAdapter e passa null HTML para que o motor busque a página.IronPDF expõe RenderUrlAsPdf(url) diretamente. Como o PêssegoPDF não executa JavaScript, aplicativos de página única e conteúdo dinâmico geralmente não são renderizados corretamente via rota do adaptador de rede; O motor Chromium do IronPDF lida com CSS moderno e JavaScript. Saiba mais em nossos tutoriais .

Exemplo 3: Adicionando cabeçalhos e rodapés

Antes (PeachPDF):

// PêssegoPDF v0.7.x has no header/footer API. The closest approach is
// to embed the header/footer markup directly inside the source HTML
// using CSS positioning.
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = @"
            <html><head><style>
              .header { position: fixed; top: 0; left: 0; right: 0; text-align:center; }
              .footer { position: fixed; bottom: 0; left: 0; right: 0; text-align:center; }
            </style></head>
            <body>
              <div class='header'>My Header</div>
              <h1>Document Content</h1>
              <div class='footer'>Footer text</div>
            </body></html>";

        var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(html, config);

        using var stream = File.Create("document.pdf");
        document.Save(stream);
    }
}
// PêssegoPDF v0.7.x has no header/footer API. The closest approach is
// to embed the header/footer markup directly inside the source HTML
// using CSS positioning.
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = @"
            <html><head><style>
              .header { position: fixed; top: 0; left: 0; right: 0; text-align:center; }
              .footer { position: fixed; bottom: 0; left: 0; right: 0; text-align:center; }
            </style></head>
            <body>
              <div class='header'>My Header</div>
              <h1>Document Content</h1>
              <div class='footer'>Footer text</div>
            </body></html>";

        var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(html, config);

        using var stream = File.Create("document.pdf");
        document.Save(stream);
    }
}
Imports PeachPDF
Imports PeachPDF.PdfSharpCore
Imports System.IO
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Dim html As String = "
            <html><head><style>
              .header { position: fixed; top: 0; left: 0; right: 0; text-align:center; }
              .footer { position: fixed; bottom: 0; left: 0; right: 0; text-align:center; }
            </style></head>
            <body>
              <div class='header'>My Header</div>
              <h1>Document Content</h1>
              <div class='footer'>Footer text</div>
            </body></html>"

        Dim config As New PdfGenerateConfig With {.PageSize = PageSize.Letter}
        Dim generator As New PdfGenerator()
        Dim document = Await generator.GeneratePdf(html, config)

        Using stream As FileStream = File.Create("document.pdf")
            document.Save(stream)
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Após (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>My Header</div>" };
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>Page {page}</div>" };
        var html = "<html><body><h1>Document Content</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("document.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>My Header</div>" };
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>Page {page}</div>" };
        var html = "<html><body><h1>Document Content</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("document.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System

Module Program
    Sub Main()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {.HtmlFragment = "<div style='text-align:center'>My Header</div>"}
        renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {.HtmlFragment = "<div style='text-align:center'>Page {page}</div>"}
        Dim html As String = "<html><body><h1>Document Content</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("document.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

Este exemplo mostra uma diferença arquitetônica fundamental. PêssegoPDF não expõe uma API de cabeçalho/rodapé em PdfGenerator ou PdfGenerateConfig, então o chrome da página precisa estar dentro do HTML da fonte usando posicionamento CSS.IronPDF usa objetos HtmlHeaderFooter atribuídos a RenderingOptions.HtmlHeader e RenderingOptions.HtmlFooter, separando o chrome da página do conteúdo do documento.

A abordagem do IronPDF também expõe propriedades como MaxHeight para controlar o tamanho do cabeçalho/rodapé, e suporta os espaços reservados {page} e {total-pages} para numeração de páginas.

Note o namespace adicional necessário para o IronPDF: using IronPdf.Rendering; é necessário para a classe HtmlHeaderFooter.


Notas críticas sobre migração

Alteração de Classe de Gerador/Renderizador

PeachPDF usa um par PdfGenerator + PdfGenerateConfig;IronPDF usa um único ChromePdfRenderer:

// PeachPDF
var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
var generator = new PdfGenerator();

// IronPDF
var renderer = new ChromePdfRenderer();
// PeachPDF
var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
var generator = new PdfGenerator();

// IronPDF
var renderer = new ChromePdfRenderer();
' PeachPDF
Dim config As New PdfGenerateConfig With {.PageSize = PageSize.Letter}
Dim generator As New PdfGenerator()

' IronPDF
Dim renderer As New ChromePdfRenderer()
$vbLabelText   $csharpLabel

Assíncrono vs Síncrono, e Tipo de Retorno

O GeneratePdf do PêssegoPDF é apenas assíncrono e retorna um documento cujo método Save aceita um Stream. O RenderHtmlAsPdf do IronPDF é síncrono (uma variante assíncrona RenderHtmlAsPdfAsync também está disponível) e retorna um PdfDocument:

// PeachPDF: async, save to a Stream
var document = await generator.GeneratePdf(html, config);
using var fs = File.Create("output.pdf");
document.Save(fs);

// IronPDF: synchronous PdfDocument object
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or get bytes: byte[] bytes = pdf.BinaryData;
// PeachPDF: async, save to a Stream
var document = await generator.GeneratePdf(html, config);
using var fs = File.Create("output.pdf");
document.Save(fs);

// IronPDF: synchronous PdfDocument object
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or get bytes: byte[] bytes = pdf.BinaryData;
Imports System.IO

' PeachPDF: async, save to a Stream
Dim document = Await generator.GeneratePdf(html, config)
Using fs As FileStream = File.Create("output.pdf")
    document.Save(fs)
End Using

' IronPDF: synchronous PdfDocument object
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or get bytes: Dim bytes As Byte() = pdf.BinaryData
$vbLabelText   $csharpLabel

Alteração da propriedade de cabeçalho/rodapé

// PeachPDF: no header/footer API -- embed in source HTML
// (e.g. via CSS position:fixed)

// IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div>Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<div>Footer</div>"
};
// PeachPDF: no header/footer API -- embed in source HTML
// (e.g. via CSS position:fixed)

// IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div>Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<div>Footer</div>"
};
' PeachPDF: no header/footer API -- embed in source HTML
' (e.g. via CSS position:fixed)

' IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
    .HtmlFragment = "<div>Header</div>"
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
    .HtmlFragment = "<div>Footer</div>"
}
$vbLabelText   $csharpLabel

Alterações no nome do método

PêssegoPDF IronPDF
await generator.GeneratePdf(html, config) renderer.RenderHtmlAsPdf(html)
NetworkAdapter = new HttpClientNetworkAdapter(...) + GeneratePdf(null, config) renderer.RenderUrlAsPdf(url)
document.Save(stream) pdf.SaveAs(path)

Novas funcionalidades após a migração

Após migrar para o IronPDF, você obtém recursos que o PêssegoPDF não oferece:

Fusão de PDFs

var pdf1 = PdfDocument.FromFile("doc1.pdf");
var pdf2 = PdfDocument.FromFile("doc2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("doc1.pdf");
var pdf2 = PdfDocument.FromFile("doc2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
CONVERTER NOT RUNNING
$vbLabelText   $csharpLabel

Marcas d'água com HTML

var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>");
pdf.SaveAs("watermarked.pdf");
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>");
pdf.SaveAs("watermarked.pdf");
Dim pdf = PdfDocument.FromFile("document.pdf")
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>")
pdf.SaveAs("watermarked.pdf")
$vbLabelText   $csharpLabel

Proteção por senha

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;

pdf.SaveAs("protected.pdf");
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;

pdf.SaveAs("protected.pdf");
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>")

pdf.SecuritySettings.OwnerPassword = "owner123"
pdf.SecuritySettings.UserPassword = "user123"
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint

pdf.SaveAs("protected.pdf")
$vbLabelText   $csharpLabel

Assinaturas digitais

using IronPdf.Signing;

var pdf = PdfDocument.FromFile("document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningReason = "Document Approval",
    SigningLocation = "New York"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");
using IronPdf.Signing;

var pdf = PdfDocument.FromFile("document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningReason = "Document Approval",
    SigningLocation = "New York"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");
Imports IronPdf.Signing

Dim pdf = PdfDocument.FromFile("document.pdf")
Dim signature = New PdfSignature("certificate.pfx", "password") With {
    .SigningReason = "Document Approval",
    .SigningLocation = "New York"
}
pdf.Sign(signature)
pdf.SaveAs("signed.pdf")
$vbLabelText   $csharpLabel

Operações assíncronas

var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>");
pdf.SaveAs("async_output.pdf");
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>");
pdf.SaveAs("async_output.pdf");
Dim renderer As New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>")
pdf.SaveAs("async_output.pdf")
$vbLabelText   $csharpLabel

Resumo da comparação de recursos

Recurso PêssegoPDF IronPDF
HTML para PDF Layout baseado em PdfSharpCore Cromo completo
URL para PDF Via HttpClientNetworkAdapter (sem JS) Sim
CSS Grid/Flexbox Parcial / não garantido Sim
JavaScript Não executado ES2024 completo
Mesclar PDFs Não (HTML->PDF apenas) Sim
Dividir PDFs Não Sim
Marcas d'água Manual via HTML HTML completo
Cabeçalhos/Rodapés Manual via HTML/CSS HTML completo
Assinaturas digitais Não Sim
PDF/A Não Sim
Preenchimento de formulários Não Sim
Extração de texto Não Sim
Extração de Imagens Não Sim
Suporte assíncrono API apenas assíncrona Sim
Multiplataforma net8.0 (Windows / Linux / macOS) Sim

Problemas comuns de migração

Problema 1: Padrão de API diferente

Problema: PêssegoPDF separa PdfGenerator (motor) de PdfGenerateConfig (configurações) e é assíncrono;IronPDF usa um único ChromePdfRenderer que retorna um PdfDocument de forma síncrona.

Solução:

// PêssegoPDF pattern (async, stream-out)
var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
var generator = new PdfGenerator();
var document = await generator.GeneratePdf(html, config);
using var fs = File.Create(path);
document.Save(fs);

//IronPDF pattern
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path);
// PêssegoPDF pattern (async, stream-out)
var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
var generator = new PdfGenerator();
var document = await generator.GeneratePdf(html, config);
using var fs = File.Create(path);
document.Save(fs);

//IronPDF pattern
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path);
Imports System.IO

' PêssegoPDF pattern (async, stream-out)
Dim config As New PdfGenerateConfig With {.PageSize = PageSize.Letter}
Dim generator As New PdfGenerator()
Dim document = Await generator.GeneratePdf(html, config)
Using fs As FileStream = File.Create(path)
    document.Save(fs)
End Using

' IronPDF pattern
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(path)
$vbLabelText   $csharpLabel

Problema 2: Salva Alvo para um Fluxo, Não um Caminho

Problema: O document.Save(stream) do PêssegoPDF aceita apenas um Stream; O pdf.SaveAs(path) do IronPDF aceita uma string de caminho.

Solução: Use pdf.SaveAs("file.pdf") diretamente no IronPDF em vez de abrir um FileStream.

Problema 3: Sem Operações de PDF Existente

Problema: PêssegoPDF é apenas HTML-para-PDF; não pode carregar, mesclar, dividir ou editar PDFs existentes.

Solução: Substitua essas operações por PdfDocument.FromFile, PdfDocument.Merge e pdf.AppendPdf do IronPDF uma vez migrado.


Lista de verificação para migração

Pré-migração

  • Auditar o uso do PêssegoPDF na base de código
  • Documentar configurações personalizadas
  • Observe todas as implementações de cabeçalho/rodapé
  • Obtenha a chave de licença do IronPDF em IronPDF
  • Teste primeiro com a licença de avaliação do IronPDF

Alterações no pacote

  • Remova o pacote NuGet PeachPDF
  • Instale o pacote NuGet IronPdf: dotnet add package IronPdf

Alterações no código

  • Atualize as importações de namespace (using PeachPDF;using IronPdf;)
  • Adicione using IronPdf.Rendering; para a funcionalidade de cabeçalho/rodapé
  • Substitua PdfGenerator + PdfGenerateConfig por ChromePdfRenderer
  • Substitua await generator.GeneratePdf(html, config) por renderer.RenderHtmlAsPdf(html) (ou RenderHtmlAsPdfAsync para permanecer assíncrono)
  • Substitua HttpClientNetworkAdapter + GeneratePdf(null, config) por renderer.RenderUrlAsPdf(url)
  • Substitua document.Save(stream) por pdf.SaveAs(path)
  • Substitua os cabeçalhos/rodapés incorporados no HTML por objetos HtmlFooter
  • Adicionar inicialização de licença na inicialização do aplicativo

Pós-migração

  • Testar a qualidade da renderização HTML
  • Verificar se o PDF gerado corresponde às expectativas.
  • Testar a renderização do cabeçalho/rodapé com números de página
  • Adicionar novas funcionalidades (segurança, marcas d'água, mesclagem) conforme necessário.

ObservePeachPDF é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado por PeachPDF. 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 ...

Leia mais

Equipe de Suporte Iron

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim