Como migrar do Api2pdf para o IronPDF em C#
OApi2pdfoferece um serviço baseado em nuvem para geração de PDFs, mas o envio de documentos confidenciais para servidores externos pode acarretar riscos de segurança, problemas de conformidade e custos contínuos que podem se acumular ao longo do tempo. Este guia fornece um caminho de migração detalhado doApi2pdfpara o IronPDF— uma biblioteca PDF nativa do .NET que processa documentos inteiramente em sua própria infraestrutura, eliminando as preocupações com a transmissão de dados e convertendo os custos por conversão em um investimento único.
Por que considerar migrar do Api2pdf?
Embora oApi2pdfofereça geração de PDFs conveniente baseada na nuvem, diversos fatores levam as equipes de desenvolvimento a buscar alternativas locais para suas necessidades de geração de PDFs.
Questões de segurança e conformidade
OApi2pdffunciona como um serviço baseado em nuvem, onde seus documentos e arquivos HTML confidenciais são enviados para servidores de terceiros para processamento. Isso gera preocupações significativas para organizações que lidam com dados regulamentados.
| Risco | Api2pdf | IronPDF |
|---|---|---|
| Transmissão de dados | Todo o conteúdo é enviado para servidores externos. | Processos locais em sua infraestrutura |
| Conformidade com o RGPD | Os dados transcendem jurisdições | Os dados nunca saem do seu ambiente. |
| Conformidade com a HIPAA | Informações de saúde protegidas transmitidas externamente | As informações de saúde protegidas (PHI) permanecem dentro dos seus sistemas. |
| SOC 2 | Dependência de terceiros | Controle total sobre o processamento de dados. |
| PCI DSS | Dados do cartão potencialmente expostos | Sem transmissão externa |
Acumulação de custos ao longo do tempo
Api2pdf cobra uma base de $1/mês mais uso metrado (largura de banda e segundos de computação) indefinidamente, enquanto IronPDF oferece uma licença perpétua única. Verify current numbers at api2pdf.com/pricing:
| Componente | Api2pdf | IronPDF |
|---|---|---|
| Base | $1/mês | Licença única |
| Largura de banda | $0.001 por MB | n/a (local) |
| Computação | $0.00019551 por segundo | n/a (local) |
| Escalabilidade de volume | Linear com o uso e tamanho do arquivo | Flat (Lite ~$749, Plus ~$1,499, Professional ~$2,999) |
Cargas de trabalho mais intensas (arquivos grandes, páginas pesadas em JS, longos tempos de renderização) elevam a conta api2pdf; O custo do IronPDF é fixo uma vez licenciado.
Desempenho e disponibilidade
A API2PDF requer requisições de rede que adicionam de 2 a 5 segundos de latência a cada solicitação de geração de PDF. O IronPDF processa localmente em 100 a 500 milissegundos. Além disso, o IronPDF funciona totalmente offline e em ambientes isolados da internet — algo essencial para aplicações que não podem depender da disponibilidade de serviços externos.
API2PDF vs. IronPDF: Principais Diferenças
| Aspecto | Api2pdf | IronPDF |
|---|---|---|
| Tratamento de dados | Enviado para servidores em nuvem de terceiros | Processado localmente em sua infraestrutura. |
| Preços | $1/mês base + metrado ($0.001/MB largura de banda, $0.00019551/seg computação) | Licença perpétua única |
| Latência | 2-5 segundos (tempo de ida e volta na rede) | 100-500ms (processamento local) |
| Offline | Não disponível | Funciona totalmente offline |
| Instalação | Chave de API + cliente HTTP | Pacote NuGet simples |
| Conformidade | Preocupações com o GDPR/HIPAA (dados saem da rede) | Controle total de conformidade |
Processo de migração passo a passo
Passo 1: Atualizar pacotes NuGet
Remova o pacoteApi2pdfe instale o IronPDF:
# Remove Api2pdf
dotnet remove package Api2Pdf
# Install IronPDF
dotnet add package IronPdf
# Remove Api2pdf
dotnet remove package Api2Pdf
# Install IronPDF
dotnet add package IronPdf
Ou através do Console do Gerenciador de Pacotes:
Uninstall-Package Api2Pdf
Install-Package IronPdf
Etapa 2: Atualizar referências de namespace
Substitua os namespaces doApi2pdfpelo IronPDF:
// Remove these
using Api2Pdf;
// Add these
using IronPdf;
using IronPdf.Rendering;
// Remove these
using Api2Pdf;
// Add these
using IronPdf;
using IronPdf.Rendering;
Imports IronPdf
Imports IronPdf.Rendering
Etapa 3: Configurar a chave de licença
Defina a chave de licença do IronPDF na inicialização do aplicativo:
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// Or configure via appsettings.json:
// { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" }
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// Or configure via appsettings.json:
// { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" }
' Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY"
' Or configure via appsettings.json:
' { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" }
Etapa 4: Remover a configuração da chave de API
O IronPDF funciona localmente e não requer chaves de API:
// Remove thisApi2pdfpattern
var client = new Api2Pdf("API_KEY");
// Just create the renderer directly
var renderer = new ChromePdfRenderer();
// Remove thisApi2pdfpattern
var client = new Api2Pdf("API_KEY");
// Just create the renderer directly
var renderer = new ChromePdfRenderer();
' Remove thisApi2pdfpattern
Dim client = New Api2Pdf("API_KEY")
' Just create the renderer directly
Dim renderer = New ChromePdfRenderer()
Referência completa para migração de API
Mapeamento de Classes Principais
| ClasseApi2pdf | Equivalente ao IronPDF |
|---|---|
Api2Pdf (cliente) |
ChromePdfRenderer |
Api2PdfResult |
PdfDocument |
ChromeHtmlToPdfOptions |
ChromePdfRenderOptions |
Mapeamento de Métodos
| MétodoApi2pdf | Método IronPDF |
|---|---|
client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest { Html = html }) |
renderer.RenderHtmlAsPdf(html) |
client.Chrome.UrlToPdfAsync(new ChromeUrlToPdfRequest { Url = url }) |
renderer.RenderUrlAsPdf(url) |
result.FileUrl (URL para download) |
pdf.SaveAs(path) |
result.GetFileBytes() |
pdf.BinaryData |
client.PdfSharp.MergePdfs(new PdfMergeRequest { Urls = urls }) |
PdfDocument.Merge(pdfs) |
client.PdfSharp.SetPassword(new PdfPasswordRequest { Url, OwnerPassword }) |
pdf.SecuritySettings.OwnerPassword |
Mapeamento de opções de renderização
| OpçãoApi2pdf | Opção IronPDF |
|---|---|
Landscape = true |
RenderingOptions.PaperOrientation = Landscape |
PreferCSSPageSize = true / Format |
RenderingOptions.PaperSize = PdfPaperSize.A4 |
PrintBackground = true |
RenderingOptions.PrintHtmlBackgrounds = true |
MarginTop, etc. |
RenderingOptions.MarginTop, etc. |
Delay = 5000 |
RenderingOptions.WaitFor.RenderDelay(5000) |
Exemplos de migração de código
Conversão de HTML para PDF
A operação mais comum doApi2pdfdemonstra a mudança fundamental — de chamadas de API na nuvem para processamento local.
Implementação do Api2pdf:
// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;
class Program
{
static async Task Main(string[] args)
{
var client = new Api2Pdf("your-api-key");
var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = "<h1>Hello World</h1>"
});
Console.WriteLine(result.FileUrl);
}
}
// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;
class Program
{
static async Task Main(string[] args)
{
var client = new Api2Pdf("your-api-key");
var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = "<h1>Hello World</h1>"
});
Console.WriteLine(result.FileUrl);
}
}
Imports System
Imports System.Threading.Tasks
Imports Api2Pdf
Module Program
Async Function Main(args As String()) As Task
Dim client = New Api2Pdf("your-api-key")
Dim result = Await client.Chrome.HtmlToPdfAsync(New ChromeHtmlToPdfRequest With {
.Html = "<h1>Hello World</h1>"
})
Console.WriteLine(result.FileUrl)
End Function
End Module
Implementação do IronPDF:
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports System
Imports IronPdf
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Class
O IronPDF elimina a comunicação de ida e volta pela rede, o gerenciamento de chaves de API e a etapa de download separada exigida pelo padrão de resposta baseado em URL do Api2pdf.
Conversão de URL para PDF
Implementação do Api2pdf:
// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;
class Program
{
static async Task Main(string[] args)
{
var client = new Api2Pdf("your-api-key");
var result = await client.Chrome.UrlToPdfAsync(new ChromeUrlToPdfRequest
{
Url = "https://www.example.com"
});
Console.WriteLine(result.FileUrl);
}
}
// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;
class Program
{
static async Task Main(string[] args)
{
var client = new Api2Pdf("your-api-key");
var result = await client.Chrome.UrlToPdfAsync(new ChromeUrlToPdfRequest
{
Url = "https://www.example.com"
});
Console.WriteLine(result.FileUrl);
}
}
Imports System
Imports System.Threading.Tasks
Imports Api2Pdf
Module Program
Async Function Main(args As String()) As Task
Dim client = New Api2Pdf("your-api-key")
Dim result = Await client.Chrome.UrlToPdfAsync(New ChromeUrlToPdfRequest With {
.Url = "https://www.example.com"
})
Console.WriteLine(result.FileUrl)
End Function
End Module
Implementação do IronPDF:
// NuGet: Install-Package IronPdf
using System;
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");
Console.WriteLine("PDF created from URL successfully");
}
}
// NuGet: Install-Package IronPdf
using System;
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");
Console.WriteLine("PDF created from URL successfully");
}
}
Imports System
Imports IronPdf
Module Program
Sub Main(args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
Console.WriteLine("PDF created from URL successfully")
End Sub
End Module
Converter arquivo HTML para PDF com opções
Implementação do Api2pdf:
// NuGet: Install-Package Api2Pdf
using System;
using System.IO;
using System.Threading.Tasks;
using Api2Pdf;
class Program
{
static async Task Main(string[] args)
{
var client = new Api2Pdf("your-api-key");
string html = File.ReadAllText("input.html");
var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = html,
Options = new ChromeHtmlToPdfOptions
{
Landscape = true,
PrintBackground = true
}
});
Console.WriteLine(result.FileUrl);
}
}
// NuGet: Install-Package Api2Pdf
using System;
using System.IO;
using System.Threading.Tasks;
using Api2Pdf;
class Program
{
static async Task Main(string[] args)
{
var client = new Api2Pdf("your-api-key");
string html = File.ReadAllText("input.html");
var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = html,
Options = new ChromeHtmlToPdfOptions
{
Landscape = true,
PrintBackground = true
}
});
Console.WriteLine(result.FileUrl);
}
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Api2Pdf
Module Program
Async Function Main(args As String()) As Task
Dim client = New Api2Pdf("your-api-key")
Dim html As String = File.ReadAllText("input.html")
Dim result = Await client.Chrome.HtmlToPdfAsync(New ChromeHtmlToPdfRequest With {
.Html = html,
.Options = New ChromeHtmlToPdfOptions With {
.Landscape = True,
.PrintBackground = True
}
})
Console.WriteLine(result.FileUrl)
End Function
End Module
Implementação do IronPDF:
// NuGet: Install-Package IronPdf
using System;
using System.IO;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape;
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
string html = File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created with options successfully");
}
}
// NuGet: Install-Package IronPdf
using System;
using System.IO;
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape;
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
string html = File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created with options successfully");
}
}
Imports System
Imports System.IO
Imports IronPdf
Module Program
Sub Main(args As String())
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
Dim html As String = File.ReadAllText("input.html")
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created with options successfully")
End Sub
End Module
O IronPDF configura as opções de renderização diretamente no objeto de renderização, em vez de passá-las como um parâmetro de opções separado para cada chamada de API.
Unir vários PDFs
Implementação do Api2pdf:
using Api2Pdf;
var client = new Api2Pdf("YOUR_API_KEY");
var pdfUrls = new List<string>
{
"https://example.com/pdf1.pdf",
"https://example.com/pdf2.pdf",
"https://example.com/pdf3.pdf"
};
var request = new PdfMergeRequest { Urls = pdfUrls };
var result = await client.PdfSharp.MergePdfsAsync(request);
if (result.Success)
{
// Download merged PDF from result.FileUrl
}
using Api2Pdf;
var client = new Api2Pdf("YOUR_API_KEY");
var pdfUrls = new List<string>
{
"https://example.com/pdf1.pdf",
"https://example.com/pdf2.pdf",
"https://example.com/pdf3.pdf"
};
var request = new PdfMergeRequest { Urls = pdfUrls };
var result = await client.PdfSharp.MergePdfsAsync(request);
if (result.Success)
{
// Download merged PDF from result.FileUrl
}
Imports Api2Pdf
Dim client As New Api2Pdf("YOUR_API_KEY")
Dim pdfUrls As New List(Of String) From {
"https://example.com/pdf1.pdf",
"https://example.com/pdf2.pdf",
"https://example.com/pdf3.pdf"
}
Dim request As New PdfMergeRequest With {.Urls = pdfUrls}
Dim result = Await client.PdfSharp.MergePdfsAsync(request)
If result.Success Then
' Download merged PDF from result.FileUrl
End If
Implementação do IronPDF:
using IronPdf;
// Load PDFs from files
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var pdf3 = PdfDocument.FromFile("document3.pdf");
// Merge all PDFs
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("merged.pdf");
using IronPdf;
// Load PDFs from files
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var pdf3 = PdfDocument.FromFile("document3.pdf");
// Merge all PDFs
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("merged.pdf");
Imports IronPdf
' Load PDFs from files
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim pdf3 = PdfDocument.FromFile("document3.pdf")
' Merge all PDFs
Dim merged = PdfDocument.Merge(pdf1, pdf2, pdf3)
merged.SaveAs("merged.pdf")
O método estático Merge do IronPDF aceita múltiplos documentos diretamente, eliminando o fluxo baseado em URL.
PDFs protegidos por senha
Implementação do Api2pdf:
using Api2Pdf;
var client = new Api2Pdf("YOUR_API_KEY");
// Generate PDF first
var pdfResult = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = "<h1>Confidential</h1>"
});
// Then add password protection in a second round-trip
var protectedResult = await client.PdfSharp.SetPasswordAsync(new PdfPasswordRequest
{
Url = pdfResult.FileUrl,
OwnerPassword = "secretpassword"
});
using Api2Pdf;
var client = new Api2Pdf("YOUR_API_KEY");
// Generate PDF first
var pdfResult = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = "<h1>Confidential</h1>"
});
// Then add password protection in a second round-trip
var protectedResult = await client.PdfSharp.SetPasswordAsync(new PdfPasswordRequest
{
Url = pdfResult.FileUrl,
OwnerPassword = "secretpassword"
});
Imports Api2Pdf
Dim client = New Api2Pdf("YOUR_API_KEY")
' Generate PDF first
Dim pdfResult = Await client.Chrome.HtmlToPdfAsync(New ChromeHtmlToPdfRequest With {
.Html = "<h1>Confidential</h1>"
})
' Then add password protection in a second round-trip
Dim protectedResult = Await client.PdfSharp.SetPasswordAsync(New PdfPasswordRequest With {
.Url = pdfResult.FileUrl,
.OwnerPassword = "secretpassword"
})
Implementação do IronPDF:
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");
// Set security in one step
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");
// Set security in one step
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>")
' Set security in one step
pdf.SecuritySettings.OwnerPassword = "owner123"
pdf.SecuritySettings.UserPassword = "user123"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit
pdf.SaveAs("protected.pdf")
O IronPDF oferece controle granular sobre as permissões de PDF através da propriedade SecuritySettings.
Cabeçalhos e rodapés
Implementação do Api2pdf:
using Api2Pdf;
var client = new Api2Pdf("YOUR_API_KEY");
var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = html,
Options = new ChromeHtmlToPdfOptions
{
DisplayHeaderFooter = true,
HeaderTemplate = "<div style='font-size:10px'>Company Header</div>",
FooterTemplate = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>"
}
});
using Api2Pdf;
var client = new Api2Pdf("YOUR_API_KEY");
var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = html,
Options = new ChromeHtmlToPdfOptions
{
DisplayHeaderFooter = true,
HeaderTemplate = "<div style='font-size:10px'>Company Header</div>",
FooterTemplate = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>"
}
});
Imports Api2Pdf
Dim client = New Api2Pdf("YOUR_API_KEY")
Dim result = Await client.Chrome.HtmlToPdfAsync(New ChromeHtmlToPdfRequest With {
.Html = html,
.Options = New ChromeHtmlToPdfOptions With {
.DisplayHeaderFooter = True,
.HeaderTemplate = "<div style='font-size:10px'>Company Header</div>",
.FooterTemplate = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>"
}
})
Implementação do IronPDF:
using IronPdf;
var renderer = new ChromePdfRenderer();
// HTML headers and footers with full styling
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>",
DrawDividerLine = true
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>",
DrawDividerLine = true
};
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("with-headers.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// HTML headers and footers with full styling
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>",
DrawDividerLine = true
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>",
DrawDividerLine = true
};
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("with-headers.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' HTML headers and footers with full styling
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>",
.DrawDividerLine = True
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>",
.DrawDividerLine = True
}
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("with-headers.pdf")
O IronPDF suporta tokens de espaço reservado como {page} e {total-pages} para numeração de páginas dinâmica. Para mais opções, consulte a documentação sobre cabeçalhos e rodapés .
Integração com ASP.NET Core
O padrão HTTP assíncrono doApi2pdfdifere significativamente da geração direta de PDFs do IronPDF.
Padrão Api2pdf:
[ApiController]
public class PdfController : ControllerBase
{
private readonly Api2Pdf _client;
public PdfController()
{
_client = new Api2Pdf("YOUR_API_KEY");
}
[HttpGet("generate")]
public async Task<IActionResult> GeneratePdf()
{
var result = await _client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = "<h1>Report</h1>"
});
if (!result.Success)
return BadRequest(result.Error);
// Redirect to download URL
return Redirect(result.FileUrl);
}
}
[ApiController]
public class PdfController : ControllerBase
{
private readonly Api2Pdf _client;
public PdfController()
{
_client = new Api2Pdf("YOUR_API_KEY");
}
[HttpGet("generate")]
public async Task<IActionResult> GeneratePdf()
{
var result = await _client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
Html = "<h1>Report</h1>"
});
if (!result.Success)
return BadRequest(result.Error);
// Redirect to download URL
return Redirect(result.FileUrl);
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
Public Class PdfController
Inherits ControllerBase
Private ReadOnly _client As Api2Pdf
Public Sub New()
_client = New Api2Pdf("YOUR_API_KEY")
End Sub
<HttpGet("generate")>
Public Async Function GeneratePdf() As Task(Of IActionResult)
Dim result = Await _client.Chrome.HtmlToPdfAsync(New ChromeHtmlToPdfRequest With {
.Html = "<h1>Report</h1>"
})
If Not result.Success Then
Return BadRequest(result.Error)
End If
' Redirect to download URL
Return Redirect(result.FileUrl)
End Function
End Class
Padrão IronPDF:
[ApiController]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
// Return PDF directly - no download step needed
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
}
[ApiController]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
// Return PDF directly - no download step needed
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
Public Class PdfController
Inherits ControllerBase
<HttpGet("generate")>
Public Function GeneratePdf() As IActionResult
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>")
' Return PDF directly - no download step needed
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Function
<HttpGet("generate-async")>
Public Async Function GeneratePdfAsync() As Task(Of IActionResult)
Dim renderer = New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>")
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Function
End Class
O IronPDF retorna o PDF diretamente via BinaryData ou Stream, eliminando o padrão de redirecionamento para download.
Configuração de Injeção de Dependência
// Program.cs or Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IPdfService, IronPdfService>();
}
// IPdfService.cs
public interface IPdfService
{
PdfDocument GenerateFromHtml(string html);
Task<PdfDocument> GenerateFromHtmlAsync(string html);
}
// IronPdfService.cs
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public PdfDocument GenerateFromHtml(string html) =>
_renderer.RenderHtmlAsPdf(html);
public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
_renderer.RenderHtmlAsPdfAsync(html);
}
// Program.cs or Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IPdfService, IronPdfService>();
}
// IPdfService.cs
public interface IPdfService
{
PdfDocument GenerateFromHtml(string html);
Task<PdfDocument> GenerateFromHtmlAsync(string html);
}
// IronPdfService.cs
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public PdfDocument GenerateFromHtml(string html) =>
_renderer.RenderHtmlAsPdf(html);
public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
_renderer.RenderHtmlAsPdfAsync(html);
}
' Program.vb or Startup.vb
Public Sub ConfigureServices(services As IServiceCollection)
services.AddScoped(Of IPdfService, IronPdfService)()
End Sub
' IPdfService.vb
Public Interface IPdfService
Function GenerateFromHtml(html As String) As PdfDocument
Function GenerateFromHtmlAsync(html As String) As Task(Of PdfDocument)
End Interface
' IronPdfService.vb
Public Class IronPdfService
Implements IPdfService
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
_renderer.RenderingOptions.PrintHtmlBackgrounds = True
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
End Sub
Public Function GenerateFromHtml(html As String) As PdfDocument Implements IPdfService.GenerateFromHtml
Return _renderer.RenderHtmlAsPdf(html)
End Function
Public Function GenerateFromHtmlAsync(html As String) As Task(Of PdfDocument) Implements IPdfService.GenerateFromHtmlAsync
Return _renderer.RenderHtmlAsPdfAsync(html)
End Function
End Class
Migração de tratamento de erros
AApi2pdfutiliza verificações no objeto de resposta. O IronPDF utiliza exceções padrão do .NET .
Padrão Api2pdf:
var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest { Html = html });
if (!result.Success)
{
Console.WriteLine($"Error: {result.Error}");
return;
}
var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest { Html = html });
if (!result.Success)
{
Console.WriteLine($"Error: {result.Error}");
return;
}
Imports System
Dim result = Await client.Chrome.HtmlToPdfAsync(New ChromeHtmlToPdfRequest With {.Html = html})
If Not result.Success Then
Console.WriteLine($"Error: {result.Error}")
Return
End If
Padrão IronPDF:
try
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
catch (IronPdf.Exceptions.IronPdfLicenseException ex)
{
Console.WriteLine($"License error: {ex.Message}");
}
catch (IronPdf.Exceptions.IronPdfRenderingException ex)
{
Console.WriteLine($"Rendering error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
try
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
catch (IronPdf.Exceptions.IronPdfLicenseException ex)
{
Console.WriteLine($"License error: {ex.Message}");
}
catch (IronPdf.Exceptions.IronPdfRenderingException ex)
{
Console.WriteLine($"Rendering error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
Imports IronPdf.Exceptions
Try
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Catch ex As IronPdfLicenseException
Console.WriteLine($"License error: {ex.Message}")
Catch ex As IronPdfRenderingException
Console.WriteLine($"Rendering error: {ex.Message}")
Catch ex As Exception
Console.WriteLine($"Error: {ex.Message}")
End Try
Comparação de desempenho
| Métrica | Api2pdf | IronPDF |
|---|---|---|
| HTML simples | 2-5 segundos (rede) | 100-500ms (local) |
| Página complexa | 5 a 10 segundos | 500ms-2s |
| Lote de 100 | Minutos (limites de taxa) | Segundos (paralelo) |
| Offline | Não disponível | Funciona perfeitamente |
| Partida a frio | None | ~2s (primeira renderização) |
Dicas de Otimização de Desempenho
// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();
public PdfDocument GeneratePdf(string html)
{
return SharedRenderer.RenderHtmlAsPdf(html);
}
// 2. Parallel generation
var tasks = htmlDocs.Select(html =>
Task.Run(() => SharedRenderer.RenderHtmlAsPdf(html)));
var results = await Task.WhenAll(tasks);
// 3. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay
// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();
public PdfDocument GeneratePdf(string html)
{
return SharedRenderer.RenderHtmlAsPdf(html);
}
// 2. Parallel generation
var tasks = htmlDocs.Select(html =>
Task.Run(() => SharedRenderer.RenderHtmlAsPdf(html)));
var results = await Task.WhenAll(tasks);
// 3. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay
Imports System.Threading.Tasks
' 1. Reuse renderer instance
Private Shared ReadOnly SharedRenderer As New ChromePdfRenderer()
Public Function GeneratePdf(html As String) As PdfDocument
Return SharedRenderer.RenderHtmlAsPdf(html)
End Function
' 2. Parallel generation
Dim tasks = htmlDocs.Select(Function(html) Task.Run(Function() SharedRenderer.RenderHtmlAsPdf(html)))
Dim results = Await Task.WhenAll(tasks)
' 3. Disable unnecessary features for speed
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = False ' If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0) ' No delay
Solução de problemas comuns de migração
Problema: O PDF tem aparência diferente da saída do Api2pdf
Adapte as configurações do Chrome sem interface gráfica do Api2pdf:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.ViewPortWidth = 1280;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1000);
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.ViewPortWidth = 1280;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1000);
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
renderer.RenderingOptions.PrintHtmlBackgrounds = True
renderer.RenderingOptions.ViewPortWidth = 1280
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.WaitFor.RenderDelay(1000)
Problema: Recursos externos não estão carregando
Configurar tempos limite de carregamento de recursos:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.AllFontsLoaded(timeout: 10000);
renderer.RenderingOptions.WaitFor.NetworkIdle(timeout: 10000);
// Or use base URL for relative paths
var pdf = renderer.RenderHtmlAsPdf(html, baseUrl: "https://example.com/");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.AllFontsLoaded(timeout: 10000);
renderer.RenderingOptions.WaitFor.NetworkIdle(timeout: 10000);
// Or use base URL for relative paths
var pdf = renderer.RenderHtmlAsPdf(html, baseUrl: "https://example.com/");
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.WaitFor.AllFontsLoaded(timeout:=10000)
renderer.RenderingOptions.WaitFor.NetworkIdle(timeout:=10000)
' Or use base URL for relative paths
Dim pdf = renderer.RenderHtmlAsPdf(html, baseUrl:="https://example.com/")
Problema: Tamanho grande dos arquivos PDF
Comprimir imagens após a geração:
renderer.RenderingOptions.ImageQuality = 80;
// Or compress after generation
pdf.CompressImages(quality: 75);
pdf.SaveAs("compressed.pdf");
renderer.RenderingOptions.ImageQuality = 80;
// Or compress after generation
pdf.CompressImages(quality: 75);
pdf.SaveAs("compressed.pdf");
renderer.RenderingOptions.ImageQuality = 80
' Or compress after generation
pdf.CompressImages(quality:=75)
pdf.SaveAs("compressed.pdf")
Lista de verificação pós-migração
Após concluir a migração do código, verifique o seguinte:
- Verificar se a qualidade do PDF gerado corresponde às expectativas.
- Testar todos os casos extremos (documentos grandes, caracteres especiais)
- Validar as métricas de desempenho (deve-se observar uma melhoria significativa)
- Atualize as configurações do Docker, se aplicável.
- Remover a conta do portalApi2pdfe as chaves de API
- Atualização do monitoramento (não é mais necessário rastrear a latência da API)
- Documente novos padrões para sua equipe
- Atualizar pipelines de CI/CD
Recursos adicionais
- Documentação do IronPDF
- Tutoriais de HTML para PDF
- Referência da API
- Pacote NuGet
- Opções de licenciamento
Migrar doApi2pdfpara o IronPDF transforma a geração de PDFs, passando de um modelo dependente da nuvem e com custo por conversão para um investimento local e único. Seus documentos confidenciais permanecem em sua infraestrutura, a latência cai de segundos para milissegundos e você elimina a dependência de fornecedores para essa funcionalidade crítica do aplicativo.

