Comparação APITemplate io e IronPDF para bibliotecas PDF C#
Como desenvolvedor C#, frequentemente me deparo com desafios ao gerar e manipular PDFs em meus projetos. A necessidade de soluções de PDF eficientes, confiáveis e fáceis de integrar é um problema comum em nossa área. Por isso, decidi explorar o APITemplate e o IronPDF , duas ferramentas populares que prometem simplificar tarefas relacionadas a PDFs em aplicações C#.
Neste artigo, compartilharei minha experiência prática com o APITemplate e o IronPDF, comparando seus recursos, desempenho e capacidades de integração. Meu objetivo é fornecer uma análise clara e imparcial para ajudá-lo(a) a tomar uma decisão informada para o seu próximo projeto. Quando me deparei pela primeira vez com APITemplate e IronPDF, fiquei intrigado com o potencial que eles tinham para resolver desafios relacionados a PDFs no desenvolvimento em C#. Vamos examinar o que cada uma dessas ferramentas oferece.
Modelo de API

APITemplate é um serviço baseado em nuvem que se concentra na geração de PDFs e imagens a partir de modelos. Ela fornece uma API que permite aos desenvolvedores criar documentos e gráficos enviando dados JSON para modelos predefinidos. Nos meus testes iniciais, achei o APITemplate fácil de usar. Eu poderia criar um modelo usando a interface web deles e, em seguida, usar a API para preenchê-lo com dados do meu aplicativo C#.
Principais funcionalidades do APITemplate
Geração baseada em modelos
A principal vantagem do APITemplate reside em sua abordagem baseada em modelos. Posso criar modelos reutilizáveis para documentos e imagens, o que me poupa muito tempo em tarefas repetitivas. Ele também oferece um editor de modelos Markdown para gerar PDFs. Você pode gerar PDFs a partir de modelos reutilizáveis integrados ao Zapier e a outros serviços de terceiros.
Integração de dados JSON
A integração de dados JSON é um recurso que uso com frequência. Isso permite preencher modelos com dados JSON. Isso torna a integração com meus aplicativos C# incrivelmente fácil, pois posso serializar meus objetos em JSON e enviá-los para a API.
Console da API
O recurso de console da API tem me poupado muito tempo. Com ele, posso visualizar e testar chamadas de API diretamente do site deles, o que me ajuda a depurar e ajustar minhas solicitações antes de implementá-las no meu código C#.
Cabeçalhos e rodapés personalizáveis
A possibilidade de adicionar cabeçalhos e rodapés personalizados aos meus PDFs tem sido muito útil, principalmente na criação de relatórios ou faturas profissionais. Posso facilmente incluir números de página, datas ou logotipos da empresa.
IronPDF

IronPDF , por outro lado, é uma biblioteca .NET projetada especificamente para manipulação de PDFs em aplicações C#. Oferece uma ampla gama de funcionalidades, incluindo criação, edição e conversão de PDFs. Uma de suas características mais marcantes é a capacidade de gerar PDFs a partir de HTML, o que pode ser incrivelmente útil para aplicações baseadas na web.
Minha primeira experiência com o IronPDF envolveu instalá-lo via NuGet e integrá-lo diretamente ao meu projeto C#. O processo de integração da API é muito simples, o que me permitiu implementá-la em meus projetos rapidamente. Fiquei impressionado com a facilidade com que pude criar PDFs programaticamente, sem depender de serviços externos.
A principal diferença que notei é que o APITemplate se destaca na criação de documentos a partir de modelos predefinidos, enquanto o IronPDF oferece mais flexibilidade para manipulação personalizada de PDFs dentro do seu código C#. A natureza baseada em nuvem do APITemplate significa que você não precisa se preocupar com recursos de servidor para a geração de PDFs, mas requer uma conexão com a internet. O IronPDF, por ser uma biblioteca local, pode funcionar offline, mas utiliza os recursos do seu servidor.
Principais características do IronPDF
Criação de PDF a partir de HTML
O IronPDF se destaca na geração de PDFs a partir de conteúdo HTML . Utilizei bastante esse recurso para criar relatórios e documentos dinamicamente. É tão simples quanto passar strings HTML ou até mesmo URLs para a biblioteca. O amplo suporte do IronPDF aos padrões modernos da web significava que cada PDF que eu gerava a partir de conteúdo HTML resultava em um documento de alta qualidade.
Manipulação de PDF
Essa funcionalidade me permite editar PDFs existentes programaticamente. Posso adicionar texto, imagens ou até mesmo novas páginas a documentos PDF, o que é incrivelmente útil para atualizar relatórios ou formulários.
Fusão e divisão de PDFs
Achei essa funcionalidade particularmente útil ao trabalhar com documentos extensos. O IronPDF facilita a combinação de vários PDFs em um só ou a divisão de um único PDF em vários arquivos.
Extração de texto
Quando preciso extrair conteúdo de texto de PDFs para análise ou indexação, os recursos de extração de texto do IronPDF são muito úteis. Ele lida bem com diversos formatos de PDF, facilitando a extração de dados.
Preenchimento de formulários
Para projetos que envolvem o preenchimento automático de formulários, o recurso de preenchimento de formulários do IronPDF é muito útil. Posso preencher formulários PDF programaticamente e economizar tempo com a entrada manual de dados.
Assinaturas digitais
A segurança é crucial em muitos dos meus projetos. O IronPDF permite adicionar assinaturas digitais a PDFs, aumentando a autenticidade e a segurança dos documentos.
Proteção por senha
Ao lidar com documentos confidenciais, utilizo o IronPDF para adicionar proteção por senha aos PDFs. Isso é extremamente útil para garantir que minhas informações confidenciais permaneçam seguras.
Conversão de PDF para imagem
Às vezes preciso converter páginas de PDF em imagens para pré-visualizações ou miniaturas. O IronPDF simplifica esse processo, exigindo apenas algumas linhas de código da minha parte e suportando diversos formatos de imagem.
Compatibilidade entre plataformas
Como desenvolvedor .NET que trabalha em projetos multiplataforma, aprecio o fato de o IronPDF funcionar perfeitamente em diferentes sistemas operacionais, graças ao seu suporte ao .NET Standard .
Configure o IronPDF e o APITemplate para o seu projeto C#.
Configurar essas ferramentas em um projeto C# é bastante simples. Vou explicar o processo para o IronPDF e o APITemplate com base na minha experiência.
IronPDF
Para configurar o IronPDF em meus projetos C#, sigo estes passos:
- Abra meu projeto no Visual Studio.
2. Utilize o gerenciador de pacotes NuGet para instalar o IronPDF. Eu uso o Gerenciador de Pacotes NuGet ou o Console do Gerenciador de Pacotes.
-
No Gerenciador de Pacotes NuGet , procure por IronPDF e instale-o.

-
Alternativamente, no Console do Gerenciador de Pacotes, eu executo:
Install-Package IronPdf

-
Após a instalação, adicionei a instrução
usingnecessária no início do meu arquivo C#:using IronPdf;using IronPdf;Imports IronPdf$vbLabelText $csharpLabel -
Para ativar a licença, adiciono esta linha logo no início da inicialização do meu aplicativo:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"$vbLabelText $csharpLabel
É isso! Agora posso começar a usar o IronPDF no meu código.
Modelo de API
Para o APITemplate, o processo de configuração é um pouco diferente, já que se trata de uma API baseada na web:
- Primeiro, eu me inscrevo para uma conta APITemplate no site deles.
- Depois de me cadastrar, acessei a seção de API para obter minha chave de API. 3. No meu projeto em C#, não preciso instalar nenhum pacote específico. Normalmente, utilizo o HttpClient integrado para fazer chamadas à API.
4. Armazeno a chave da API em local seguro. Durante o desenvolvimento, posso usar segredos de usuário:
dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE"
dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE"
-
No meu código, configurei o HttpClient com a chave da API:
using System.Net.Http; using System.Net.Http.Headers; var client = new HttpClient(); client.DefaultRequestHeaders.Add("X-API-KEY", Configuration["APITemplate:ApiKey"]);using System.Net.Http; using System.Net.Http.Headers; var client = new HttpClient(); client.DefaultRequestHeaders.Add("X-API-KEY", Configuration["APITemplate:ApiKey"]);Imports System.Net.Http Imports System.Net.Http.Headers Private client = New HttpClient() client.DefaultRequestHeaders.Add("X-API-KEY", Configuration("APITemplate:ApiKey"))$vbLabelText $csharpLabel - Agora estou pronto para fazer chamadas de API para APITemplate.
Para este projeto, usarei o projeto de exemplo oficial do APITemplate no GitHub , que já está configurado, e você só precisa adicionar a chave do modelo. Com essas configurações concluídas, posso começar a usar o IronPDF e o APITemplate em meus projetos C#. O IronPDF funciona localmente dentro da minha aplicação, enquanto o APITemplate requer conexão com a internet para se comunicar com seus servidores.
Recursos avançados em IronPDF vs APITemplate
Como desenvolvedor C#, tive a oportunidade de explorar tanto o IronPDF quanto o APITemplate. Vamos analisar alguns dos seus recursos avançados que me impressionaram.
Recursos avançados do IronPDF
Conversão de HTML para PDF com suporte a JavaScript
A conversão de HTML para PDF do IronPDF é impressionante. Ele não apenas renderiza HTML estático, como também consegue lidar com JavaScript . Isso tem sido uma vantagem significativa para mim ao trabalhar com conteúdo web dinâmico.
Aqui está um exemplo rápido de como eu o utilizo:
var Renderer = new ChromePdfRenderer();
string htmlContent = @"
<html>
<body>
<h1>Dynamic Chart</h1>
<canvas id='myChart'></canvas>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<script>
var ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</body>
</html>";
var PDF = Renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs("dynamic_chart.pdf");
var Renderer = new ChromePdfRenderer();
string htmlContent = @"
<html>
<body>
<h1>Dynamic Chart</h1>
<canvas id='myChart'></canvas>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<script>
var ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</body>
</html>";
var PDF = Renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs("dynamic_chart.pdf");
Dim Renderer = New ChromePdfRenderer()
Dim htmlContent As String = "
<html>
<body>
<h1>Dynamic Chart</h1>
<canvas id='myChart'></canvas>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<script>
var ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</body>
</html>"
Dim PDF = Renderer.RenderHtmlAsPdf(htmlContent)
PDF.SaveAs("dynamic_chart.pdf")
Este código gera um PDF com um gráfico dinâmico usando Chart.js. O JavaScript é executado durante o processo de criação do PDF, resultando em um PDF que contém o gráfico renderizado. Utilizei essa ferramenta para criar relatórios dinâmicos com dados que mudam frequentemente, o que me poupa o trabalho de atualizar gráficos e tabelas manualmente.

A possibilidade de incluir scripts externos, como o Chart.js neste exemplo, significa que posso usar bibliotecas JavaScript poderosas para criar conteúdo rico e dinâmico em meus PDFs. Além disso, esse recurso me permite usar CSS e técnicas de design responsivo no meu HTML, garantindo que o PDF resultante tenha uma ótima aparência em diversos dispositivos e formatos de impressão. Eu até já usei media queries para criar PDFs otimizados para visualização em tela e impressão a partir da mesma fonte HTML.
Criptografia e descriptografia de PDF
A segurança é crucial em muitos dos meus projetos, especialmente quando se trata de informações sensíveis. Os recursos de criptografia e descriptografia do IronPDF têm sido inestimáveis nesses cenários.
var pdf = PdfDocument.FromFile("input.pdf");
// Set user password (for opening the document)
pdf.Password = "user_password";
// Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password";
// Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit;
pdf.SaveAs("highly_secured.pdf");
var pdf = PdfDocument.FromFile("input.pdf");
// Set user password (for opening the document)
pdf.Password = "user_password";
// Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password";
// Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit;
pdf.SaveAs("highly_secured.pdf");
Dim pdf = PdfDocument.FromFile("input.pdf")
' Set user password (for opening the document)
pdf.Password = "user_password"
' Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password"
' Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit
pdf.SaveAs("highly_secured.pdf")

Este código não só criptografa o PDF com uma senha de usuário, como também define uma senha de proprietário com controle granular sobre as permissões . Posso especificar exatamente o que os usuários podem e não podem fazer com o PDF, como imprimir ou copiar o conteúdo.
Para descriptografia, costumo usar esta abordagem:
try
{
var pdf = PdfDocument.FromFile("encrypted.pdf", "user_password");
pdf.SecuritySettings.RemovePasswordsAndEncryption();
pdf.SaveAs("decrypted.pdf");
Console.WriteLine("PDF decrypted successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Decryption failed: {ex.Message}");
}
try
{
var pdf = PdfDocument.FromFile("encrypted.pdf", "user_password");
pdf.SecuritySettings.RemovePasswordsAndEncryption();
pdf.SaveAs("decrypted.pdf");
Console.WriteLine("PDF decrypted successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Decryption failed: {ex.Message}");
}
Try
Dim pdf = PdfDocument.FromFile("encrypted.pdf", "user_password")
pdf.SecuritySettings.RemovePasswordsAndEncryption()
pdf.SaveAs("decrypted.pdf")
Console.WriteLine("PDF decrypted successfully!")
Catch ex As Exception
Console.WriteLine($"Decryption failed: {ex.Message}")
End Try
Este código tenta abrir um PDF criptografado com a senha do usuário, remove todas as restrições de segurança e o salva como um novo arquivo não criptografado. O bloco try-catch ajuda a lidar com casos em que a senha pode estar incorreta.
Utilizei esses recursos em diversos cenários, como na criação de sistemas seguros de gerenciamento de documentos, onde diferentes usuários têm diferentes níveis de acesso a PDFs. Por exemplo, em um sistema de registros médicos, eu garanti que as informações confidenciais dos pacientes fossem criptografadas e só pudessem ser acessadas por pessoal autorizado.
Compressão de PDF
Ao lidar com um grande número de PDFs, o tamanho do arquivo torna-se um fator crucial. O recurso de compressão do IronPDF tem sido uma salvação para lidar com as restrições de armazenamento e largura de banda.
Aqui está um exemplo mais avançado de como eu uso a compressão:
using IronPdf;
using System.IO;
using PdfDocument = IronPdf.PdfDocument;
var PDF = PdfDocument.FromFile(@"F:/Test.pdf");
// Compress images
PDF.CompressImages(80); // 80% quality
// Compress fonts
PDF.CompressStructTree();
// Save the compressed PDF
PDF.SaveAs(@"F:/highly_compressed.pdf");
// Compare file sizes
var originalSize = new FileInfo(@"F:/Test.pdf").Length;
var compressedSize = new FileInfo(@"F:/highly_compressed.pdf").Length;
var compressionRatio = (1 - (double)compressedSize / originalSize) * 100;
Console.WriteLine($"Original size: {originalSize / 1024} KB");
Console.WriteLine($"Compressed size: {compressedSize / 1024} KB");
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%");
using IronPdf;
using System.IO;
using PdfDocument = IronPdf.PdfDocument;
var PDF = PdfDocument.FromFile(@"F:/Test.pdf");
// Compress images
PDF.CompressImages(80); // 80% quality
// Compress fonts
PDF.CompressStructTree();
// Save the compressed PDF
PDF.SaveAs(@"F:/highly_compressed.pdf");
// Compare file sizes
var originalSize = new FileInfo(@"F:/Test.pdf").Length;
var compressedSize = new FileInfo(@"F:/highly_compressed.pdf").Length;
var compressionRatio = (1 - (double)compressedSize / originalSize) * 100;
Console.WriteLine($"Original size: {originalSize / 1024} KB");
Console.WriteLine($"Compressed size: {compressedSize / 1024} KB");
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%");
Imports IronPdf
Imports System.IO
Imports PdfDocument = IronPdf.PdfDocument
Private PDF = PdfDocument.FromFile("F:/Test.pdf")
' Compress images
PDF.CompressImages(80) ' 80% quality
' Compress fonts
PDF.CompressStructTree()
' Save the compressed PDF
PDF.SaveAs("F:/highly_compressed.pdf")
' Compare file sizes
Dim originalSize = (New FileInfo("F:/Test.pdf")).Length
Dim compressedSize = (New FileInfo("F:/highly_compressed.pdf")).Length
Dim compressionRatio = (1 - CDbl(compressedSize) / originalSize) * 100
Console.WriteLine($"Original size: {originalSize \ 1024} KB")
Console.WriteLine($"Compressed size: {compressedSize \ 1024} KB")
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%")
Eis o resultado:

Descobri que essa combinação de técnicas é altamente eficaz na redução do tamanho dos arquivos sem afetar significativamente a qualidade.
Já utilizei essa funcionalidade em diversos cenários:
- Anexos de e-mail: Ao enviar PDFs por e-mail, eu os comprimo para garantir que não excedam os limites de tamanho de anexos.
- Aplicações web: Para PDFs que precisam ser baixados pelos usuários, a compressão ajuda a reduzir os tempos de carregamento e o uso de largura de banda.
- Arquivamento: Ao armazenar um grande número de PDFs para retenção a longo prazo, a compressão reduz significativamente os custos de armazenamento.
Em um projeto, trabalhei em um sistema de gerenciamento de documentos para um escritório de advocacia. Eles tinham milhares de processos em formato PDF, muitos dos quais eram documentos digitalizados com arquivos de grande tamanho. Ao implementar essa técnica de compressão, reduzimos suas necessidades de armazenamento em mais de 60%, resultando em uma economia significativa em suas contas de armazenamento em nuvem.
Assinaturas digitais
Adicionar assinaturas digitais a PDFs é um recurso indispensável para muitos processos de negócios, garantindo a autenticidade e a não repudiação dos documentos. O IronPDF torna essa tarefa complexa surpreendentemente simples. Aqui está um exemplo mais detalhado de como eu implemento assinaturas digitais:
using IronPdf;
using IronPdf.Signing;
var renderer = new ChromePdfRenderer();
var pdf = PdfDocument.FromFile(@"F:/Contract.pdf");
var signature = new IronPdf.Signing.PdfSignature(@"F:/Iron.pfx", "123")
{
// Step 3. Optional signing options and a handwritten signature graphic
SigningContact = "support@ironsoftware.com",
SigningLocation = "New York, USA",
SigningReason = "Signing PDF"
};
pdf.Sign(signature);
pdf.SaveAs(@"F:/signed.pdf");
using IronPdf;
using IronPdf.Signing;
var renderer = new ChromePdfRenderer();
var pdf = PdfDocument.FromFile(@"F:/Contract.pdf");
var signature = new IronPdf.Signing.PdfSignature(@"F:/Iron.pfx", "123")
{
// Step 3. Optional signing options and a handwritten signature graphic
SigningContact = "support@ironsoftware.com",
SigningLocation = "New York, USA",
SigningReason = "Signing PDF"
};
pdf.Sign(signature);
pdf.SaveAs(@"F:/signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
Private renderer = New ChromePdfRenderer()
Private pdf = PdfDocument.FromFile("F:/Contract.pdf")
Private signature = New IronPdf.Signing.PdfSignature("F:/Iron.pfx", "123") With {
.SigningContact = "support@ironsoftware.com",
.SigningLocation = "New York, USA",
.SigningReason = "Signing PDF"
}
pdf.Sign(signature)
pdf.SaveAs("F:/signed.pdf")
Já utilizei essa funcionalidade em diversas aplicações práticas:
- Sistema de gestão de contratos: Implementamos este sistema para uma empresa que precisava enviar e receber contratos assinados eletronicamente. As assinaturas digitais garantiram a validade legal dos contratos.
- Sistema de registros médicos: Em uma aplicação na área da saúde, utilizamos assinaturas digitais para permitir que os médicos aprovassem os registros e as prescrições dos pacientes.
- Processamento de documentos governamentais: Para uma agência governamental, implementamos um sistema onde documentos oficiais podiam ser assinados digitalmente.
Divisão e fusão de PDFs
A capacidade de dividir e mesclar PDFs é um recurso fundamental que utilizo frequentemente em sistemas de gerenciamento de documentos. A implementação dessas funcionalidades pelo IronPDF é poderosa e flexível. Aqui está um exemplo mais avançado de divisão e fusão de PDFs:
using IronPdf;
class Program
{
static void Main(string[] args)
{
// Create first PDF with three pages
const string html_a = @"
<h1>Document A</h1>
<p>This is the first page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 2</h2>
<p>This is the second page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 3</h2>
<p>This is the third and final page of Document A.</p>";
// Create second PDF with two pages
const string html_b = @"
<h1>Document B</h1>
<p>Welcome to the first page of Document B.</p>
<div style='page-break-after: always;'></div>
<h2>Document B - Page 2</h2>
<p>This is the second and last page of Document B.</p>";
// Render HTML to PDF
var renderer = new ChromePdfRenderer();
var pdfdoc_a = renderer.RenderHtmlAsPdf(html_a);
var pdfdoc_b = renderer.RenderHtmlAsPdf(html_b);
// Merge PDFs
var merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b);
merged.SaveAs(@"F:/IronPdf/MergedDocument.pdf");
Console.WriteLine("Merged PDF created: MergedDocument.pdf");
// Load the merged PDF
var pdf = PdfDocument.FromFile(@"F:/IronPdf/MergedDocument.pdf");
// Extract the first page
var firstPage = pdf.CopyPage(0);
firstPage.SaveAs(@"F:/IronPdf/FirstPageOnly.pdf");
Console.WriteLine("First page extracted: FirstPageOnly.pdf");
// Extract pages 2 to 4 (note: index starts at 0)
var middlePages = pdf.CopyPages(1, 3);
middlePages.SaveAs(@"F:/IronPdf/Pages2to4.pdf");
Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf");
Console.WriteLine("Process completed. Press any key to exit.");
Console.ReadKey();
}
}
using IronPdf;
class Program
{
static void Main(string[] args)
{
// Create first PDF with three pages
const string html_a = @"
<h1>Document A</h1>
<p>This is the first page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 2</h2>
<p>This is the second page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 3</h2>
<p>This is the third and final page of Document A.</p>";
// Create second PDF with two pages
const string html_b = @"
<h1>Document B</h1>
<p>Welcome to the first page of Document B.</p>
<div style='page-break-after: always;'></div>
<h2>Document B - Page 2</h2>
<p>This is the second and last page of Document B.</p>";
// Render HTML to PDF
var renderer = new ChromePdfRenderer();
var pdfdoc_a = renderer.RenderHtmlAsPdf(html_a);
var pdfdoc_b = renderer.RenderHtmlAsPdf(html_b);
// Merge PDFs
var merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b);
merged.SaveAs(@"F:/IronPdf/MergedDocument.pdf");
Console.WriteLine("Merged PDF created: MergedDocument.pdf");
// Load the merged PDF
var pdf = PdfDocument.FromFile(@"F:/IronPdf/MergedDocument.pdf");
// Extract the first page
var firstPage = pdf.CopyPage(0);
firstPage.SaveAs(@"F:/IronPdf/FirstPageOnly.pdf");
Console.WriteLine("First page extracted: FirstPageOnly.pdf");
// Extract pages 2 to 4 (note: index starts at 0)
var middlePages = pdf.CopyPages(1, 3);
middlePages.SaveAs(@"F:/IronPdf/Pages2to4.pdf");
Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf");
Console.WriteLine("Process completed. Press any key to exit.");
Console.ReadKey();
}
}
Imports IronPdf
Friend Class Program
Shared Sub Main(ByVal args() As String)
' Create first PDF with three pages
Const html_a As String = "
<h1>Document A</h1>
<p>This is the first page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 2</h2>
<p>This is the second page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 3</h2>
<p>This is the third and final page of Document A.</p>"
' Create second PDF with two pages
Const html_b As String = "
<h1>Document B</h1>
<p>Welcome to the first page of Document B.</p>
<div style='page-break-after: always;'></div>
<h2>Document B - Page 2</h2>
<p>This is the second and last page of Document B.</p>"
' Render HTML to PDF
Dim renderer = New ChromePdfRenderer()
Dim pdfdoc_a = renderer.RenderHtmlAsPdf(html_a)
Dim pdfdoc_b = renderer.RenderHtmlAsPdf(html_b)
' Merge PDFs
Dim merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b)
merged.SaveAs("F:/IronPdf/MergedDocument.pdf")
Console.WriteLine("Merged PDF created: MergedDocument.pdf")
' Load the merged PDF
Dim pdf = PdfDocument.FromFile("F:/IronPdf/MergedDocument.pdf")
' Extract the first page
Dim firstPage = pdf.CopyPage(0)
firstPage.SaveAs("F:/IronPdf/FirstPageOnly.pdf")
Console.WriteLine("First page extracted: FirstPageOnly.pdf")
' Extract pages 2 to 4 (note: index starts at 0)
Dim middlePages = pdf.CopyPages(1, 3)
middlePages.SaveAs("F:/IronPdf/Pages2to4.pdf")
Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf")
Console.WriteLine("Process completed. Press any key to exit.")
Console.ReadKey()
End Sub
End Class

Segue o documento consolidado gerado pelo código:

Preenchimento de formulários
Automatizar o preenchimento de formulários tem sido uma enorme economia de tempo em muitos dos meus projetos. O IronPDF permite-me preencher formulários PDF programaticamente, o que é extremamente útil para processar grandes volumes de formulários ou criar documentos personalizados. Aqui está um exemplo mais completo de preenchimento de formulário:
using IronPdf;
using System;
// Load the combined form
PdfDocument pdf = PdfDocument.FromFile(@"F:/completeForm.pdf");
// Handle radio buttons
var radioForm = pdf.Form.FindFormField("traveltype");
radioForm.Value = "Airplane";
// Handle checkbox
var checkboxForm = pdf.Form.FindFormField("taskCompleted");
checkboxForm.Value = "Yes";
// Handle combobox
var comboboxForm = pdf.Form.FindFormField("priority");
comboboxForm.Value = "Low";
// Print out all the available choices for combobox
foreach (var choice in comboboxForm.Choices)
{
Console.WriteLine(choice);
}
// Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";
// Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software\r\n205 N. Michigan Ave.";
// Save the edited PDF
pdf.SaveAs(@"F:/completeFormEdited.pdf");
using IronPdf;
using System;
// Load the combined form
PdfDocument pdf = PdfDocument.FromFile(@"F:/completeForm.pdf");
// Handle radio buttons
var radioForm = pdf.Form.FindFormField("traveltype");
radioForm.Value = "Airplane";
// Handle checkbox
var checkboxForm = pdf.Form.FindFormField("taskCompleted");
checkboxForm.Value = "Yes";
// Handle combobox
var comboboxForm = pdf.Form.FindFormField("priority");
comboboxForm.Value = "Low";
// Print out all the available choices for combobox
foreach (var choice in comboboxForm.Choices)
{
Console.WriteLine(choice);
}
// Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";
// Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software\r\n205 N. Michigan Ave.";
// Save the edited PDF
pdf.SaveAs(@"F:/completeFormEdited.pdf");
Imports Microsoft.VisualBasic
Imports IronPdf
Imports System
' Load the combined form
Private pdf As PdfDocument = PdfDocument.FromFile("F:/completeForm.pdf")
' Handle radio buttons
Private radioForm = pdf.Form.FindFormField("traveltype")
radioForm.Value = "Airplane"
' Handle checkbox
Dim checkboxForm = pdf.Form.FindFormField("taskCompleted")
checkboxForm.Value = "Yes"
' Handle combobox
Dim comboboxForm = pdf.Form.FindFormField("priority")
comboboxForm.Value = "Low"
' Print out all the available choices for combobox
For Each choice In comboboxForm.Choices
Console.WriteLine(choice)
Next choice
' Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John"
pdf.Form.FindFormField("lastname").Value = "Smith"
' Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software" & vbCrLf & "205 N. Michigan Ave."
' Save the edited PDF
pdf.SaveAs("F:/completeFormEdited.pdf")
Já utilizei essa funcionalidade em diversas aplicações práticas:
-
Sistema de integração de RH: Criamos um sistema que preenche automaticamente a documentação de novos funcionários com base em informações do banco de dados de RH, economizando horas de entrada manual de dados.
-
Processamento de sinistros: Para uma seguradora, desenvolvemos um sistema que preenchia automaticamente os formulários de sinistro com as informações do segurado, agilizando significativamente o processo de submissão de sinistros.
-
Sistema de inscrição escolar: Em um projeto educacional, implementamos um sistema que preenchia formulários de inscrição escolar com base em dados dos alunos, facilitando o processo de inscrição tanto para os alunos quanto para a equipe administrativa.
- Geração de formulários fiscais: Para uma empresa de contabilidade, criamos um sistema que preenche automaticamente os formulários fiscais com base nos dados financeiros do cliente, reduzindo erros e economizando tempo durante a temporada de impostos.
A capacidade de preencher formulários programaticamente tem sido um fator chave na automatização de muitos processos empresariais, resultando em economias de tempo significativas e redução de erros decorrentes da entrada manual de dados.
Marca d'água
Adicionar marcas d'água a PDFs geralmente é necessário para fins de identidade visual, segurança ou indicação de status. O IronPDF oferece recursos flexíveis de marca d'água que considero úteis em muitos projetos. Aqui está um exemplo mais detalhado de como eu uso marcas d'água:
using IronPdf;
using IronSoftware.Drawing;
string watermarkHtml = @"
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>";
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>");
// Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation: 30, opacity: 90);
pdf.SaveAs("watermarkOpacity&Rotation.pdf");
using IronPdf;
using IronSoftware.Drawing;
string watermarkHtml = @"
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>";
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>");
// Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation: 30, opacity: 90);
pdf.SaveAs("watermarkOpacity&Rotation.pdf");
Imports IronPdf
Imports IronSoftware.Drawing
Dim watermarkHtml As String = "
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>"
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>")
' Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation:=30, opacity:=90)
pdf.SaveAs("watermarkOpacity&Rotation.pdf")

Recursos avançados do modelo de API
Geração dinâmica de modelos
A geração dinâmica de modelos do APITemplate é um recurso poderoso que permite a criação de documentos altamente personalizáveis usando dados JSON customizáveis. A API do APITemplate oferece suporte a componentes dinâmicos. Você pode obter resultados do seu código tanto em PDF quanto em imagem. Na consola da API, consegui utilizar o editor WYSIWYG para gerar documentos PDF com facilidade.
Vamos explorar como utilizei isso em meus projetos.
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "bf077b23b4a407ae";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
var data = new
{
date = "15/05/2022",
invoice_no = "435568799",
sender_address1 = "3244 Jurong Drive",
sender_address2 = "Falmouth Maine 1703",
sender_phone = "255-781-6789",
sender_email = "dev@ironsoftware.com",
rece_addess1 = "2354 Lakeside Drive",
rece_addess2 = "New York 234562 ",
rece_phone = "34333-84-223",
rece_email = "info@ironsoftware.com",
items = new[]
{
new { item_name = "Oil", unit = 1, unit_price = 100, total = 100 },
new { item_name = "Rice", unit = 2, unit_price = 200, total = 400 },
new { item_name = "Orange", unit = 7, unit_price = 20, total = 1400 }
},
total = "total",
footer_email = "info@ironsoftware.com"
};
var json_content = JsonSerializer.Serialize(data);
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo(@"F:/generated_document.pdf");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'");
}
}
}
}
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "bf077b23b4a407ae";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
var data = new
{
date = "15/05/2022",
invoice_no = "435568799",
sender_address1 = "3244 Jurong Drive",
sender_address2 = "Falmouth Maine 1703",
sender_phone = "255-781-6789",
sender_email = "dev@ironsoftware.com",
rece_addess1 = "2354 Lakeside Drive",
rece_addess2 = "New York 234562 ",
rece_phone = "34333-84-223",
rece_email = "info@ironsoftware.com",
items = new[]
{
new { item_name = "Oil", unit = 1, unit_price = 100, total = 100 },
new { item_name = "Rice", unit = 2, unit_price = 200, total = 400 },
new { item_name = "Orange", unit = 7, unit_price = 20, total = 1400 }
},
total = "total",
footer_email = "info@ironsoftware.com"
};
var json_content = JsonSerializer.Serialize(data);
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo(@"F:/generated_document.pdf");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'");
}
}
}
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text.Json
Imports System.Threading.Tasks
Namespace csharp
Friend Class ReturnContent
Public Property download_url() As String
Public Property status() As String
End Class
Friend Class Program
Shared Async Function Main(ByVal args() As String) As Task
Dim api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw="
Dim template_id = "bf077b23b4a407ae"
Dim url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}"
Dim data = New With {
Key .date = "15/05/2022",
Key .invoice_no = "435568799",
Key .sender_address1 = "3244 Jurong Drive",
Key .sender_address2 = "Falmouth Maine 1703",
Key .sender_phone = "255-781-6789",
Key .sender_email = "dev@ironsoftware.com",
Key .rece_addess1 = "2354 Lakeside Drive",
Key .rece_addess2 = "New York 234562 ",
Key .rece_phone = "34333-84-223",
Key .rece_email = "info@ironsoftware.com",
Key .items = {
New With {
Key .item_name = "Oil",
Key .unit = 1,
Key .unit_price = 100,
Key .total = 100
},
New With {
Key .item_name = "Rice",
Key .unit = 2,
Key .unit_price = 200,
Key .total = 400
},
New With {
Key .item_name = "Orange",
Key .unit = 7,
Key .unit_price = 20,
Key .total = 1400
}
},
Key .total = "total",
Key .footer_email = "info@ironsoftware.com"
}
Dim json_content = JsonSerializer.Serialize(data)
Dim buffer = System.Text.Encoding.UTF8.GetBytes(json_content)
Dim byteContent = New ByteArrayContent(buffer)
Console.WriteLine(json_content)
Dim client = New HttpClient()
client.DefaultRequestHeaders.Add("X-API-KEY", api_key)
Dim response = Await client.PostAsync(url, byteContent)
Dim ret = Await response.Content.ReadAsStringAsync()
Dim returnContent = JsonSerializer.Deserialize(Of ReturnContent)(ret)
If returnContent.status = "success" Then
Console.WriteLine($"Downloading {returnContent.download_url}...")
Dim download_response = Await client.GetAsync(returnContent.download_url)
Using stream = Await download_response.Content.ReadAsStreamAsync()
Dim fileInfo As New FileInfo("F:/generated_document.pdf")
Using fileStream = fileInfo.OpenWrite()
Await stream.CopyToAsync(fileStream)
End Using
End Using
Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'")
End If
End Function
End Class
End Namespace

Este é o documento PDF gerado:

Geração em massa de PDFs
O recurso de geração em lote de PDFs do APITemplate é uma vantagem significativa quando se trata de criar vários documentos em uma única chamada de API. Aqui está um exemplo mais detalhado de como eu o utilizei:
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "d4f77b23b4ab09fa";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
var membershipCards = new List<object>
{
new { name = "Iron Dev 1", email = "dev1@ironsoftware.com", membership_id = "M001", expiry_date = "2024-12-31" },
new { name = "Iron Dev 2", email = "dev2@ironsoftware.com", membership_id = "M002", expiry_date = "2025-06-30" },
new { name = "Iron Dev 3", email = "dev3@ironsoftware.com", membership_id = "M003", expiry_date = "2024-09-15" }
};
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
for (int i = 0; i < membershipCards.Count; i++)
{
var json_content = JsonSerializer.Serialize(membershipCards[i]);
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine($"Creating PDF for {((dynamic)membershipCards[i]).name}...");
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo($"F:/membership_card_{i + 1}.pdf");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'");
}
else
{
Console.WriteLine($"Failed to create PDF for {((dynamic)membershipCards[i]).name}. Status: {returnContent.status}");
}
}
}
}
}
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "d4f77b23b4ab09fa";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
var membershipCards = new List<object>
{
new { name = "Iron Dev 1", email = "dev1@ironsoftware.com", membership_id = "M001", expiry_date = "2024-12-31" },
new { name = "Iron Dev 2", email = "dev2@ironsoftware.com", membership_id = "M002", expiry_date = "2025-06-30" },
new { name = "Iron Dev 3", email = "dev3@ironsoftware.com", membership_id = "M003", expiry_date = "2024-09-15" }
};
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
for (int i = 0; i < membershipCards.Count; i++)
{
var json_content = JsonSerializer.Serialize(membershipCards[i]);
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine($"Creating PDF for {((dynamic)membershipCards[i]).name}...");
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo($"F:/membership_card_{i + 1}.pdf");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'");
}
else
{
Console.WriteLine($"Failed to create PDF for {((dynamic)membershipCards[i]).name}. Status: {returnContent.status}");
}
}
}
}
}
'INSTANT VB NOTE: 'Option Strict Off' is used here since dynamic typing is used:
Option Strict Off
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text.Json
Imports System.Threading.Tasks
Imports System.Collections.Generic
Namespace csharp
Friend Class ReturnContent
Public Property download_url() As String
Public Property status() As String
End Class
Friend Class Program
Shared Async Function Main(ByVal args() As String) As Task
Dim api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw="
Dim template_id = "d4f77b23b4ab09fa"
Dim url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}"
Dim membershipCards = New List(Of Object) From {
New With {
Key .name = "Iron Dev 1",
Key .email = "dev1@ironsoftware.com",
Key .membership_id = "M001",
Key .expiry_date = "2024-12-31"
},
New With {
Key .name = "Iron Dev 2",
Key .email = "dev2@ironsoftware.com",
Key .membership_id = "M002",
Key .expiry_date = "2025-06-30"
},
New With {
Key .name = "Iron Dev 3",
Key .email = "dev3@ironsoftware.com",
Key .membership_id = "M003",
Key .expiry_date = "2024-09-15"
}
}
Dim client = New HttpClient()
client.DefaultRequestHeaders.Add("X-API-KEY", api_key)
For i As Integer = 0 To membershipCards.Count - 1
Dim json_content = JsonSerializer.Serialize(membershipCards(i))
Dim buffer = System.Text.Encoding.UTF8.GetBytes(json_content)
Dim byteContent = New ByteArrayContent(buffer)
'INSTANT VB NOTE: In the following line, Instant VB substituted 'Object' for 'dynamic' - this will work in VB with Option Strict Off:
Console.WriteLine($"Creating PDF for {CType(membershipCards(i), Object).name}...")
Dim response = Await client.PostAsync(url, byteContent)
Dim ret = Await response.Content.ReadAsStringAsync()
Dim returnContent = JsonSerializer.Deserialize(Of ReturnContent)(ret)
If returnContent.status = "success" Then
Console.WriteLine($"Downloading {returnContent.download_url}...")
Dim download_response = Await client.GetAsync(returnContent.download_url)
Using stream = Await download_response.Content.ReadAsStreamAsync()
Dim fileInfo As New FileInfo($"F:/membership_card_{i + 1}.pdf")
Using fileStream = fileInfo.OpenWrite()
Await stream.CopyToAsync(fileStream)
End Using
End Using
Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'")
Else
'INSTANT VB NOTE: In the following line, Instant VB substituted 'Object' for 'dynamic' - this will work in VB with Option Strict Off:
Console.WriteLine($"Failed to create PDF for {CType(membershipCards(i), Object).name}. Status: {returnContent.status}")
End If
Next i
End Function
End Class
End Namespace
Este código gera vários cartões de membro em uma única chamada de API. Cada cartão é personalizado com as informações individuais de cada membro. Aqui está o cartão gerado por este código:

Geração de Imagens
Embora a geração de PDFs seja o foco principal do APITemplate, seus recursos de geração de imagens são igualmente impressionantes. Você pode gerar imagens para redes sociais usando modelos de imagem no console. Oferece também um recurso de recorte inteligente de imagens responsivas. A API para geração de banners é a mesma da API de imagens. Aqui está um exemplo mais complexo de como eu o utilizei:
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "f4377b23b4aeeed0";
var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
var json_content = @"{
""overrides"": [
{
""name"": ""rect_image_bg"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""rect_container"",
""stroke"": ""grey"",
""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
},
{
""name"": ""text_quote"",
""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest! #DesertAdventures #SaharaSkies"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#414141""
},
{
""name"": ""text_footer"",
""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#666666""
},
{
""name"": ""circle_profile"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""text_name"",
""text"": ""Sarah Wanderlust"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
},
{
""name"": ""text_twitter"",
""text"": ""@sarahexplores"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
}
]
}";
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo("image.jpeg");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
}
}
}
}
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "f4377b23b4aeeed0";
var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
var json_content = @"{
""overrides"": [
{
""name"": ""rect_image_bg"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""rect_container"",
""stroke"": ""grey"",
""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
},
{
""name"": ""text_quote"",
""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest! #DesertAdventures #SaharaSkies"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#414141""
},
{
""name"": ""text_footer"",
""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#666666""
},
{
""name"": ""circle_profile"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""text_name"",
""text"": ""Sarah Wanderlust"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
},
{
""name"": ""text_twitter"",
""text"": ""@sarahexplores"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
}
]
}";
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo("image.jpeg");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
}
}
}
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Namespace csharp
Friend Class ReturnContent
Public Property download_url() As String
Public Property status() As String
End Class
Friend Class Program
Shared Async Function Main(ByVal args() As String) As Task
Dim api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw="
Dim template_id = "f4377b23b4aeeed0"
Dim url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}"
Dim json_content = "{
""overrides"": [
{
""name"": ""rect_image_bg"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""rect_container"",
""stroke"": ""grey"",
""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
},
{
""name"": ""text_quote"",
""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest! #DesertAdventures #SaharaSkies"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#414141""
},
{
""name"": ""text_footer"",
""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#666666""
},
{
""name"": ""circle_profile"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""text_name"",
""text"": ""Sarah Wanderlust"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
},
{
""name"": ""text_twitter"",
""text"": ""@sarahexplores"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
}
]
}"
Dim buffer = System.Text.Encoding.UTF8.GetBytes(json_content)
Dim byteContent = New ByteArrayContent(buffer)
Console.WriteLine(json_content)
Dim client = New HttpClient()
client.DefaultRequestHeaders.Add("X-API-KEY", api_key)
Dim response = Await client.PostAsync(url, byteContent)
Dim ret = Await response.Content.ReadAsStringAsync()
Dim returnContent = JsonSerializer.Deserialize(Of ReturnContent)(ret)
If returnContent.status = "success" Then
Console.WriteLine($"Downloading {returnContent.download_url}...")
Dim download_response = Await client.GetAsync(returnContent.download_url)
Using stream = Await download_response.Content.ReadAsStreamAsync()
Dim fileInfo As New FileInfo("image.jpeg")
Using fileStream = fileInfo.OpenWrite()
Await stream.CopyToAsync(fileStream)
End Using
End Using
End If
End Function
End Class
End Namespace

Este exemplo gera uma imagem promocional de produto com conteúdo dinâmico, cor de fundo personalizada e uma imagem do produto incorporada.
Geração de código QR
O recurso integrado de geração de código QR do APITemplate agregou muito valor a vários dos meus projetos. Você pode inserir URLs de dados em vez de conteúdo para códigos QR. Aqui está um exemplo mais complexo de como eu o utilizei:
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "API-Key";
var template_id = "Template-Key";
var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
var json_content = @"{
""overrides"": [
{
""name"": ""background-color"",
""stroke"": ""grey"",
""backgroundColor"": ""#FFFFFF""
},
{
""name"": ""qr_1"",
""content"": ""http://ironpdf.com/"",
""backgroundColor"": ""white"",
""color"": ""#000000""
}
]
}";
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
//Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
Console.WriteLine(returnContent.status);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo(@"F:/QRimage.jpeg");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
}
}
}
}
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "API-Key";
var template_id = "Template-Key";
var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
var json_content = @"{
""overrides"": [
{
""name"": ""background-color"",
""stroke"": ""grey"",
""backgroundColor"": ""#FFFFFF""
},
{
""name"": ""qr_1"",
""content"": ""http://ironpdf.com/"",
""backgroundColor"": ""white"",
""color"": ""#000000""
}
]
}";
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
//Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
Console.WriteLine(returnContent.status);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo(@"F:/QRimage.jpeg");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
}
}
}
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Namespace csharp
Friend Class ReturnContent
Public Property download_url() As String
Public Property status() As String
End Class
Friend Class Program
Shared Async Function Main(ByVal args() As String) As Task
Dim api_key = "API-Key"
Dim template_id = "Template-Key"
Dim url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}"
Dim json_content = "{
""overrides"": [
{
""name"": ""background-color"",
""stroke"": ""grey"",
""backgroundColor"": ""#FFFFFF""
},
{
""name"": ""qr_1"",
""content"": ""http://ironpdf.com/"",
""backgroundColor"": ""white"",
""color"": ""#000000""
}
]
}"
Dim buffer = System.Text.Encoding.UTF8.GetBytes(json_content)
Dim byteContent = New ByteArrayContent(buffer)
'Console.WriteLine(json_content);
Dim client = New HttpClient()
client.DefaultRequestHeaders.Add("X-API-KEY", api_key)
Dim response = Await client.PostAsync(url, byteContent)
Dim ret = Await response.Content.ReadAsStringAsync()
Dim returnContent = JsonSerializer.Deserialize(Of ReturnContent)(ret)
Console.WriteLine(returnContent.status)
If returnContent.status = "success" Then
Console.WriteLine($"Downloading {returnContent.download_url}...")
Dim download_response = Await client.GetAsync(returnContent.download_url)
Using stream = Await download_response.Content.ReadAsStreamAsync()
Dim fileInfo As New FileInfo("F:/QRimage.jpeg")
Using fileStream = fileInfo.OpenWrite()
Await stream.CopyToAsync(fileStream)
End Using
End Using
End If
End Function
End Class
End Namespace

Documentação e suporte
Como desenvolvedor C# que trabalha frequentemente com geração e manipulação de PDFs, descobri que a qualidade da documentação e do suporte pode determinar o sucesso ou o fracasso de um projeto. Vamos explorar minhas experiências com a documentação e o suporte do IronPDF e do APITemplate.
IronPDF
Documentação
A documentação do IronPDF é abrangente e bem estruturada, o que tem sido de grande ajuda nos meus projetos. Segue um relato detalhado da minha experiência: A documentação do IronPDF está disponível emhttps://ironpdf.com/docs/ E é bastante abrangente. Aqui estão alguns aspectos principais que eu apreciei:
-
Guia de Introdução: A documentação começa com um guia claro, passo a passo, sobre como instalar o IronPDF via NuGet e criar seu primeiro PDF. Isso me ajudou a começar a trabalhar rapidamente nos meus projetos iniciais.
-
Referência da API: A referência da API é completa, abrangendo todas as classes e métodos. Cada entrada inclui exemplos em C#, que considero extremamente úteis na implementação de funcionalidades específicas.
-
Exemplos de código: Ao longo da documentação, existem inúmeros trechos de código e exemplos completos. Essas ferramentas têm sido particularmente úteis quando preciso implementar operações mais complexas em PDFs.
-
Tutoriais e guias práticos: O IronPDF oferece tutoriais detalhados para tarefas comuns, como criar PDFs a partir de HTML, adicionar marcas d'água ou trabalhar com formulários. Esses recursos me guiaram por casos de uso mais avançados.
- Seção de Solução de Problemas: A documentação inclui uma seção de solução de problemas que aborda questões comuns. Isso me poupou tempo quando encontrei erros ou comportamentos inesperados.
Apoiar
O contato da IronPDF tem sido ágil e os canais de suporte têm sido extremamente úteis, na minha experiência:
-
Suporte por e-mail: Quando tive problemas complexos, utilizei o suporte por e-mail deles. Os tempos de resposta geralmente têm sido de até 24 horas, e a equipe de suporte demonstrou conhecimento sobre o produto.
-
Fórum da Comunidade: O IronPDF mantém um fórum da comunidade onde os desenvolvedores podem fazer perguntas e compartilhar soluções. Encontrei respostas para minhas perguntas e também contribuí com soluções baseadas em minhas experiências.
-
Stack Overflow: A equipe do IronPDF monitora ativamente a tag [[IronPDF]](https://stackoverflow.com/questions/tagged/ IronPDF) no Stack Overflow. Recebi respostas úteis para as perguntas que postei lá.
-
Atualizações regulares: O IronPDF lança atualizações frequentemente com correções de bugs e novos recursos. O changelog é detalhado, o que me ajuda a entender o que há de novo ou o que foi alterado em cada versão.
- Guias de Migração: Quando ocorreram alterações significativas entre versões principais, o IronPDF forneceu guias de migração. Essas ferramentas foram cruciais para atualizar meus projetos para versões mais recentes da biblioteca.
Modelo de API
A documentação e a estrutura de suporte do APITemplate são diferentes das do IronPDF, refletindo sua natureza como um serviço baseado em nuvem. Eis a minha experiência:
Documentação
A documentação do APITemplate está disponível emhttps://docs.apitemplate.io/reference/api-reference.html E está focada na utilização da API. Aqui estão os pontos principais:
-
Referência da API: A documentação fornece uma referência clara da API, detalhando todos os endpoints disponíveis, parâmetros obrigatórios e formatos de resposta. Este tem sido meu recurso de referência principal ao integrar o APITemplate em meus aplicativos C#.
- Autenticação: Há uma seção dedicada à autenticação, que explica claramente como usar as chaves de API. Isso foi crucial quando comecei a usar o serviço.
Apoiar
A estrutura de suporte do APITemplate está mais focada no suporte por e-mail:
-
Suporte por e-mail: Quando tive problemas ou dúvidas, utilizei o suporte por e-mail deles. Os tempos de resposta geralmente têm sido de 1 a 2 dias úteis.
- Seção de Perguntas Frequentes: A documentação inclui uma seção de perguntas frequentes que aborda as dúvidas mais comuns. Este costuma ser o meu primeiro ponto de contato quando encontro problemas.
Utilizando Bootstrap 5 com IronPDF para painéis de análise
O mecanismo de renderização Chrome V8 do IronPDF se destaca na renderização de layouts modernos do Bootstrap 5, tornando-o ideal para gerar relatórios em PDF com métricas de negócios e visualizações de dados. Diferentemente da abordagem baseada em API do APITemplate, o IronPDF processa o HTML diretamente com suporte completo a CSS3, incluindo flexbox, CSS Grid e propriedades personalizadas.
using IronPdf;
var renderer = new ChromePdfRenderer();
string analyticsDashboard = @"
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.metric-card {
transition: transform 0.2s;
border-left: 4px solid #0d6efd;
}
.metric-card:hover { transform: translateY(-5px); }
.trend-up { color: #198754; }
.trend-down { color: #dc3545; }
@media print {
.metric-card { page-break-inside: avoid; }
}
</style>
</head>
<body class='bg-light'>
<div class='container py-5'>
<div class='row mb-4'>
<div class='col-12'>
<div class='card shadow-sm'>
<div class='card-body'>
<h1 class='display-6 mb-0'>Performance Dashboard</h1>
<p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
</div>
</div>
</div>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
<h2 class='display-6 mb-3'>$2.4M</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 85%'></div>
</div>
<small class='trend-up'>↑ 18% from last quarter</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
<h2 class='display-6 mb-3'>48,592</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 72%'></div>
</div>
<small class='trend-up'>↑ 12% growth rate</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
<h2 class='display-6 mb-3'>3.8%</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 38%'></div>
</div>
<small class='trend-down'>↓ 2% needs attention</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
<h2 class='display-6 mb-3'>4.7/5</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 94%'></div>
</div>
<small class='trend-up'>↑ Excellent rating</small>
</div>
</div>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-body'>
<h5 class='card-title mb-3'>Top Performing Products</h5>
<div class='table-responsive'>
<table class='table table-hover'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Revenue</th>
<th>Units</th>
<th>Trend</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Enterprise Suite</strong></td>
<td>$1,240,000</td>
<td>2,150</td>
<td><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Professional Plan</strong></td>
<td>$820,000</td>
<td>4,890</td>
<td><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Starter Package</strong></td>
<td>$340,000</td>
<td>8,240</td>
<td><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(analyticsDashboard);
pdf.SaveAs("analytics-dashboard.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
string analyticsDashboard = @"
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.metric-card {
transition: transform 0.2s;
border-left: 4px solid #0d6efd;
}
.metric-card:hover { transform: translateY(-5px); }
.trend-up { color: #198754; }
.trend-down { color: #dc3545; }
@media print {
.metric-card { page-break-inside: avoid; }
}
</style>
</head>
<body class='bg-light'>
<div class='container py-5'>
<div class='row mb-4'>
<div class='col-12'>
<div class='card shadow-sm'>
<div class='card-body'>
<h1 class='display-6 mb-0'>Performance Dashboard</h1>
<p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
</div>
</div>
</div>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
<h2 class='display-6 mb-3'>$2.4M</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 85%'></div>
</div>
<small class='trend-up'>↑ 18% from last quarter</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
<h2 class='display-6 mb-3'>48,592</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 72%'></div>
</div>
<small class='trend-up'>↑ 12% growth rate</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
<h2 class='display-6 mb-3'>3.8%</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 38%'></div>
</div>
<small class='trend-down'>↓ 2% needs attention</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
<h2 class='display-6 mb-3'>4.7/5</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 94%'></div>
</div>
<small class='trend-up'>↑ Excellent rating</small>
</div>
</div>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-body'>
<h5 class='card-title mb-3'>Top Performing Products</h5>
<div class='table-responsive'>
<table class='table table-hover'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Revenue</th>
<th>Units</th>
<th>Trend</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Enterprise Suite</strong></td>
<td>$1,240,000</td>
<td>2,150</td>
<td><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Professional Plan</strong></td>
<td>$820,000</td>
<td>4,890</td>
<td><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Starter Package</strong></td>
<td>$340,000</td>
<td>8,240</td>
<td><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(analyticsDashboard);
pdf.SaveAs("analytics-dashboard.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim analyticsDashboard As String = "
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.metric-card {
transition: transform 0.2s;
border-left: 4px solid #0d6efd;
}
.metric-card:hover { transform: translateY(-5px); }
.trend-up { color: #198754; }
.trend-down { color: #dc3545; }
@media print {
.metric-card { page-break-inside: avoid; }
}
</style>
</head>
<body class='bg-light'>
<div class='container py-5'>
<div class='row mb-4'>
<div class='col-12'>
<div class='card shadow-sm'>
<div class='card-body'>
<h1 class='display-6 mb-0'>Performance Dashboard</h1>
<p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
</div>
</div>
</div>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
<h2 class='display-6 mb-3'>$2.4M</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 85%'></div>
</div>
<small class='trend-up'>↑ 18% from last quarter</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
<h2 class='display-6 mb-3'>48,592</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 72%'></div>
</div>
<small class='trend-up'>↑ 12% growth rate</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
<h2 class='display-6 mb-3'>3.8%</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 38%'></div>
</div>
<small class='trend-down'>↓ 2% needs attention</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
<h2 class='display-6 mb-3'>4.7/5</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 94%'></div>
</div>
<small class='trend-up'>↑ Excellent rating</small>
</div>
</div>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-body'>
<h5 class='card-title mb-3'>Top Performing Products</h5>
<div class='table-responsive'>
<table class='table table-hover'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Revenue</th>
<th>Units</th>
<th>Trend</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Enterprise Suite</strong></td>
<td>$1,240,000</td>
<td>2,150</td>
<td><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Professional Plan</strong></td>
<td>$820,000</td>
<td>4,890</td>
<td><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Starter Package</strong></td>
<td>$340,000</td>
<td>8,240</td>
<td><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(analyticsDashboard)
pdf.SaveAs("analytics-dashboard.pdf")
Este código gera um painel de análise profissional em PDF com cartões de métricas, barras de progresso e tabelas responsivas. O mecanismo do IronPDF para Chrome renderiza perfeitamente os layouts flexbox, sombras e efeitos de foco do Bootstrap — recursos que exigem um trabalho personalizado significativo com serviços baseados em API, como o APITemplate.
Principais vantagens em relação ao APITemplate:
- Renderização HTML direta com suporte completo ao Bootstrap
- Não são necessárias chamadas de API nem configuração de modelos.
- Compatibilidade total com CSS3, incluindo animações
- Processamento offline sem dependências externas
Para obter mais informações sobre a geração de PDFs com Bootstrap, consulte o Guia de HTML para PDF do Bootstrap .
Licenciamento
Preços e licenciamento do IronPDF

A IronPDF oferece vários planos de preços para atender a diferentes necessidades:
- Lite: Com preço de $799, este plano é adequado para um único desenvolvedor trabalhando em um único projeto. Trata-se de uma taxa única, o que a torna uma opção acessível para projetos de pequeno porte ou desenvolvedores individuais.
- Profissional: Na $1,199, esta opção suporta até 10 desenvolvedores, 10 locais e 10 projetos. Este plano também inclui uma taxa única e oferece mais flexibilidade para equipes de pequeno a médio porte.
- Ilimitado: Para $2,399, este nível permite desenvolvedores, locais e projetos ilimitados. Esta solução é ideal para equipes maiores e empresas que necessitam de uso extensivo sem restrições.
A IronPDF também oferece licenças de redistribuição corporativas e OEM para organizações maiores e para aquelas que precisam integrar funcionalidades de PDF em produtos comerciais. Também oferece um período de teste gratuito .
Preços e licenciamento do APITemplate
A APITemplate oferece uma abordagem diferente com seu serviço de geração de PDFs baseado em API. O preço geralmente é baseado no número de chamadas à API, o que a torna mais flexível para diversos padrões de uso:
- Plano Básico: Geralmente começa com um preço mais baixo e um número limitado de chamadas de API por mês. Esta opção é adequada para projetos pequenos ou empresas com necessidades mínimas de geração de PDFs.
- Plano Padrão: Este plano inclui mais chamadas de API e recursos adicionais, sendo ideal para empresas de médio porte.
- Plano Empresarial: Feito sob medida para usuários de alto volume, este plano oferece o maior número de chamadas de API e recursos premium, como suporte prioritário e integrações personalizadas.
O licenciamento do APITemplate é simples, geralmente vinculado a um modelo de assinatura mensal ou anual.
Principais diferenças
- Modelo de preços: O IronPDF utiliza um modelo de pagamento único, que pode ser economicamente vantajoso a longo prazo, especialmente para uso contínuo e intenso. O APITemplate, por outro lado, utiliza um modelo baseado em assinatura, que pode ser mais flexível e escalável conforme a utilização.
- Suporte e atualizações: O IronPDF inclui um ano de suporte e atualizações com a sua compra, com opções para estender esse período. Os planos de assinatura do APITemplate geralmente incluem suporte contínuo e atualizações como parte do pacote.
Por que escolher o IronPDF?
Tanto o IronPDF quanto o APITemplate oferecem a capacidade de gerar PDFs a partir de conteúdo HTML, mas a implementação do IronPDF é mais robusta e flexível. Eis uma comparação:
IronPDF
using IronPdf;
var renderer = new ChromePdfRenderer();
var html = @"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.header { color: #0066cc; font-size: 24px; }
.content { margin-top: 20px; }
</style>
</head>
<body>
<div class='header'>Dynamic Report</div>
<div class='content'>
<p>This report was generated on: <script>document.write(new Date().toLocaleString());</script></p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("IronPDF_report.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
var html = @"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.header { color: #0066cc; font-size: 24px; }
.content { margin-top: 20px; }
</style>
</head>
<body>
<div class='header'>Dynamic Report</div>
<div class='content'>
<p>This report was generated on: <script>document.write(new Date().toLocaleString());</script></p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("IronPDF_report.pdf");
Imports IronPdf
Private renderer = New ChromePdfRenderer()
Private html = "
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.header { color: #0066cc; font-size: 24px; }
.content { margin-top: 20px; }
</style>
</head>
<body>
<div class='header'>Dynamic Report</div>
<div class='content'>
<p>This report was generated on: <script>document.write(new Date().toLocaleString());</script></p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
</body>
</html>"
Private pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("IronPDF_report.pdf")
Modelo de API
using System.Net.Http;
using System.Text.Json;
var apiKey = "your_api_key";
var templateId = "your_template_id";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={templateId}";
var data = new
{
header = "Dynamic Report",
content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
date = DateTime.Now.ToShortDateString()
};
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", apiKey);
var response = await client.PostAsync(url, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("APITemplate_report.pdf", pdfBytes);
using System.Net.Http;
using System.Text.Json;
var apiKey = "your_api_key";
var templateId = "your_template_id";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={templateId}";
var data = new
{
header = "Dynamic Report",
content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
date = DateTime.Now.ToShortDateString()
};
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", apiKey);
var response = await client.PostAsync(url, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("APITemplate_report.pdf", pdfBytes);
Imports System.Net.Http
Imports System.Text.Json
Private apiKey = "your_api_key"
Private templateId = "your_template_id"
Private url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={templateId}"
Private data = New With {
Key .header = "Dynamic Report",
Key .content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
Key .date = DateTime.Now.ToShortDateString()
}
Private json = JsonSerializer.Serialize(data)
Private content = New StringContent(json, System.Text.Encoding.UTF8, "application/json")
Private client = New HttpClient()
client.DefaultRequestHeaders.Add("X-API-KEY", apiKey)
Dim response = Await client.PostAsync(url, content)
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("APITemplate_report.pdf", pdfBytes)
Principais diferenças
- Suporte a JavaScript : O IronPDF oferece suporte completo à execução de JavaScript dentro do HTML, permitindo a geração de conteúdo dinâmico (como a data atual no exemplo). Normalmente, o APITemplate exige que todos os dados sejam fornecidos antecipadamente.
- Flexibilidade de CSS: Com o IronPDF, você tem controle total sobre o estilo CSS diretamente no seu HTML. O APITemplate geralmente requer modelos predefinidos com opções de personalização limitadas.
- Desempenho: O IronPDF processa o HTML localmente, resultando em uma geração de PDF mais rápida, especialmente para documentos complexos. A abordagem baseada em nuvem do APITemplate pode introduzir latência.
- Funcionamento offline: O IronPDF funciona offline, o que é útil para aplicações com conectividade limitada à internet ou com requisitos de alta segurança. O APITemplate sempre requer uma conexão com a internet.
- Conteúdo dinâmico: O IronPDF permite a geração de conteúdo mais dinâmico em tempo real, enquanto o APITemplate normalmente requer uma estrutura de modelo predefinida.
- Personalização: O IronPDF oferece um controle mais preciso sobre o processo de geração de PDFs, incluindo opções para tamanho da página, margens e outras configurações específicas de PDF.
- Consistência: O IronPDF garante uma renderização consistente em diferentes ambientes, pois utiliza seu próprio mecanismo de renderização. A saída do APITemplate pode variar dependendo da configuração do servidor.
Conclusão
Após trabalhar extensivamente com IronPDF e APITemplate em vários projetos C#, passei a apreciar os pontos fortes exclusivos de cada ferramenta. No entanto, para a maioria das minhas tarefas relacionadas a PDFs, o IronPDF tem se mostrado consistentemente a melhor opção. Embora o APITemplate tenha seus méritos, principalmente para a geração de documentos simples baseados em modelos, descobri que a versatilidade do IronPDF permite que ele lide com essas tarefas com a mesma eficácia, além de oferecer a capacidade de lidar com operações de PDF mais complexas quando necessário.
Em conclusão, embora ambas as ferramentas tenham sua utilidade, o IronPDF tem se mostrado consistentemente a solução mais poderosa, flexível e econômica para manipulação de PDFs no desenvolvimento em C#. Seu conjunto robusto de recursos, excelente desempenho e suporte abrangente fazem dele minha escolha preferida para qualquer tarefa relacionada a PDF, desde a geração de documentos mais simples até as manipulações mais complexas de PDFs.
Perguntas frequentes
Quais são as principais diferenças entre ferramentas de geração de PDF baseadas na nuvem e ferramentas baseadas em bibliotecas?
Ferramentas baseadas na nuvem, como o APITemplate, oferecem geração de PDFs por meio de chamadas de API e exigem conexão com a internet. Em contrapartida, ferramentas baseadas em bibliotecas, como o IronPDF, são integradas ao seu aplicativo C#, permitindo a manipulação de PDFs offline e oferecendo maior controle sobre a criação e personalização de PDFs.
Como o IronPDF lida com conversões de HTML para PDF em aplicações C#?
O IronPDF permite conversões perfeitas de HTML para PDF usando métodos como RenderHtmlAsPdf . Ele oferece suporte completo aos padrões da web modernos, incluindo CSS e JavaScript, garantindo a renderização de alta qualidade do conteúdo da web em PDFs.
Posso usar o IronPDF para geração de conteúdo dinâmico em PDFs?
Sim, o IronPDF suporta a execução de JavaScript, o que permite a geração de conteúdo dinâmico em PDFs. Isso é particularmente útil para criar PDFs interativos diretamente de páginas da web com dados dinâmicos.
Quais são as vantagens de usar o IronPDF em vez de um serviço por assinatura?
O IronPDF oferece uma licença única, proporcionando uma solução econômica para uso a longo prazo. Ele permite operação offline e oferece amplos recursos de manipulação de PDFs, sendo mais flexível e robusto em comparação com serviços baseados em assinatura, como o APITemplate.
Que tipo de suporte está disponível para desenvolvedores que utilizam o IronPDF?
O IronPDF oferece suporte completo por meio de documentação detalhada, incluindo guias, referências de API e exemplos de código. Os desenvolvedores também podem buscar ajuda por meio de suporte por e-mail, fóruns da comunidade e monitoramento em plataformas como o Stack Overflow.
O IronPDF suporta desenvolvimento multiplataforma?
Sim, o IronPDF é compatível com o .NET Standard, que oferece suporte ao desenvolvimento multiplataforma. Isso garante que os desenvolvedores possam integrar o IronPDF a projetos executados em diferentes sistemas operacionais sem problemas.
Como o IronPDF garante a segurança dos PDFs gerados?
O IronPDF inclui recursos para criptografia e descriptografia de PDFs, permitindo que os desenvolvedores protejam documentos com senhas e assinaturas digitais. Esses recursos ajudam a manter a confidencialidade e a integridade dos documentos PDF.
Quais são algumas dicas comuns para solucionar problemas ao usar o IronPDF?
Ao encontrar problemas com o IronPDF, certifique-se de que todas as dependências estejam instaladas e atualizadas corretamente. Consulte a documentação para verificar a compatibilidade e as configurações, e revise o código de exemplo para confirmar as práticas de implementação. Se os problemas persistirem, a equipe de suporte está disponível para ajudar.



