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:
-
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.
-
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. -
Apenas
net8.0: o pacote tem como alvonet8.0; projetos mais antigos do .NET Framework / .NET 6 precisam ser atualizados ou escolher uma biblioteca diferente. -
Comunidade Pequena: um único mantenedor do GitHub, documentação limitada, exemplos limitados.
- 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
- Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
- Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
- 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
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"
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" .
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
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
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
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
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
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
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
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()
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
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>"
}
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
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")
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")
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")
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")
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)
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+PdfGenerateConfigporChromePdfRenderer - Substitua
await generator.GeneratePdf(html, config)porrenderer.RenderHtmlAsPdf(html)(ouRenderHtmlAsPdfAsyncpara permanecer assíncrono) - Substitua
HttpClientNetworkAdapter+GeneratePdf(null, config)porrenderer.RenderUrlAsPdf(url) - Substitua
document.Save(stream)porpdf.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.

