Comparación APITemplate io e IronPDF para Bibliotecas PDF C#
Como desarrollador de C#, a menudo me he encontrado con desafíos al generar y manipular archivos PDF en mis proyectos. La necesidad de soluciones PDF eficientes, confiables y fáciles de integrar es un problema común en nuestro campo. Por eso decidí explorar APITemplate e IronPDF , dos herramientas populares que prometen simplificar las tareas relacionadas con PDF en aplicaciones C#.
En este artículo, compartiré mi experiencia práctica con ambos, APITemplate e IronPDF, comparando sus características, rendimiento y capacidades de integración. Mi objetivo es brindarle un análisis claro e imparcial para ayudarlo a tomar una decisión informada para su próximo proyecto. Cuando me encontré por primera vez con APITemplate e IronPDF, me intrigó su potencial para resolver desafíos relacionados con PDFs en el desarrollo con C#. Examinemos qué ofrece cada una de estas herramientas.
Plantilla API

APITemplate es un servicio basado en la nube que se centra en generar PDFs e imágenes a partir de plantillas. Proporciona una API que permite a los desarrolladores crear documentos y gráficos enviando datos JSON a plantillas predefinidas. En mis pruebas iniciales, encontré que APITemplate era sencillo de usar. Pude crear una plantilla utilizando su interfaz web y luego usar su API para completarla con datos de mi aplicación C#.
Características principales de APITemplate
Generación basada en plantillas
La mayor fortaleza de APITemplate es su enfoque basado en plantillas. Puedo crear plantillas reutilizables para documentos e imágenes, lo que me ahorra mucho tiempo en tareas repetitivas. También ofrece un editor de plantillas markdown para generar PDFs. Puedes generar PDF a partir de plantillas reutilizables integradas con Zapier y otros terceros.
Integración de datos JSON
La integración de datos JSON es una característica que uso frecuentemente. Te da la capacidad de poblar plantillas con datos JSON. Esto hace que sea increíblemente fácil integrarlo con mis aplicaciones C#, ya que puedo serializar mis objetos a JSON y enviarlos a la API.
Consola API
La función de consola API ha sido un gran ahorro de tiempo para mí. Con ella, puedo previsualizar y probar llamadas API directamente desde su sitio web, ayudándome a depurar y ajustar mis solicitudes antes de implementarlas en mi código C#.
Cabeceras y pies de página personalizables
La capacidad de agregar encabezados y pies de página personalizados a mis PDFs ha sido valiosa, especialmente al crear informes o facturas profesionales. Puedo fácilmente incluir números de página, fechas o logotipos de la empresa.
HierroPDF

IronPDF, por otro lado, es una biblioteca .NET diseñada específicamente para la manipulación de PDF dentro de aplicaciones C#. Ofrece una amplia gama de funcionalidades, incluyendo creación, edición y conversión de PDFs. Una de sus características destacadas es la capacidad de generar PDFs a partir de HTML, lo que puede ser increíblemente útil para aplicaciones basadas en la web.
Mi primera experiencia con IronPDF consistió en instalarlo a través de NuGet e integrarlo directamente en mi proyecto de C#. Su proceso de integración API es muy fluido, lo que significa que pude tenerlo funcionando dentro de mis proyectos en poco tiempo. Me impresionó lo fácil que fue crear PDFs de forma programada, sin depender de servicios externos.
La principal diferencia que noté es que APITemplate sobresale en la creación de documentos a partir de plantillas predefinidas, mientras que IronPDF ofrece más flexibilidad para la manipulación de PDFs personalizados dentro de tu código C#. La naturaleza basada en la nube de APITemplate significa que no tienes que preocuparte por los recursos del servidor para la generación de PDFs, pero requiere conexión a internet. IronPDF, al ser una biblioteca local, puede trabajar sin conexión pero utiliza los recursos de tu servidor.
Características principales de IronPDF
Creación de PDF a partir de HTML
IronPDF sobresale en generar PDFs a partir de contenido HTML. He usado extensamente esta característica para crear informes y documentos de forma dinámica. Es tan simple como pasar cadenas de HTML o incluso URLs a la biblioteca. El amplio soporte de IronPDF para los estándares modernos de la web significó que cada PDF que generé a partir de contenido HTML salió como un documento de alta calidad.
Manipulación de PDF
Esta característica me permite editar PDFs existentes de forma programada. Puedo agregar texto, imágenes o incluso nuevas páginas a documentos PDF, lo que es increíblemente útil para actualizar informes o formularios.
Fusión y división de PDF
He encontrado esta característica particularmente útil cuando trabajo con documentos grandes. IronPDF facilita la combinación de múltiples PDFs en uno solo o la división de un PDF en varios archivos.
Extracción de texto
Cuando necesito extraer contenido de texto de PDFs para análisis o indexación, las capacidades de extracción de texto de IronPDF son muy útiles. Maneja bien varios formatos de PDF, haciendo que la extracción de datos sea fácil.
Relleno de formularios
Para proyectos que involucran el llenado automatizado de formularios, la característica de relleno de formularios de IronPDF es muy útil. Puedo completar formularios PDF de forma programada y ahorrar tiempo en la entrada manual de datos.
Firmas digitales
La seguridad es crucial en muchos de mis proyectos. IronPDF me permite agregar firmas digitales a PDFs, mejorando la autenticidad y seguridad del documento.
Protección de contraseñas
Cuando trabajo con documentos confidenciales, uso IronPDF para agregar protección con contraseña a PDFs. Esto es más que útil para asegurarme de que mi información confidencial se mantenga segura.
Conversión de PDF a imagen
Hay ocasiones en las que necesito convertir páginas de PDF a imágenes para vistas previas o miniaturas. IronPDF hace que este proceso sea sencillo, solo requiere unas pocas líneas de código de mi parte y soporta varios formatos de imagen.
Compatibilidad multiplataforma
Como desarrollador de .NET trabajando en proyectos multiplataforma, aprecio que IronPDF funcione sin problemas en diferentes sistemas operativos, gracias a su soporte para .NET Standard.
Cómo configurar IronPDF y APITemplate para su proyecto de C
Configurar estas herramientas en un proyecto C# es bastante sencillo. Te guiaré a través del proceso para ambos, IronPDF y APITemplate, basado en mi experiencia.
HierroPDF
Para configurar IronPDF en mis proyectos de C#, sigo estos pasos:
Abro mi proyecto en Visual Studio.
Uso el Administrador de Paquetes NuGet para instalar IronPDF. Usualmente utilizo el Administrador de paquetes NuGet o la Consola del Administrador de paquetes.**
- En el Administrador de Paquetes NuGet, busco IronPDF y lo instalo.

Alternativamente, en la Consola del Administrador de Paquetes, ejecuto:
Install-Package IronPdf


using IronPdf; using IronPdf;Después de la instalación, agrego la declaración using necesaria en la parte superior de mi archivo C#:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";$vbLabelText $csharpLabel
using IronPdf; Puedo usar IronPDF en mi código.
Plantilla API
¡Eso es todo!
- Primero, me registró para obtener una cuenta de APITemplate en su sitio web.
- Después de registrarme, navego a la sección de API para obtener mi clave API.
En mi proyecto de C#, no necesito instalar ningún paquete específico. 1. Primero, me registro en una cuenta de APITemplate en su sitio web.**
Después de registrarme, navego a la sección API para obtener mi clave API. 3. En mi proyecto C#, no necesito instalar ningún paquete específico.
dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE"dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE"SHELLEn mi código, configuro el HttpClient con la clave 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"]);$vbLabelText $csharpLabel- Almaceno la clave API de forma segura.
Para este proyecto, utilizaré el proyecto de muestra oficial de GitHub de APITemplate que ya está configurado y solo necesitas agregar la clave de la plantilla. "YOUR-API-KEY" 5. En mi código, configuro el HttpClient con la clave API:
Características avanzadas de IronPDF frente a APITemplate
Como desarrollador de C#, tuve la oportunidad de explorar IronPDF y APITemplate. Veamos algunas de sus características avanzadas que me han impresionado.
Características avanzadas de IronPDF
Conversión de HTML a PDF compatible con JavaScript
La conversión de HTML a PDF de IronPDF es impresionante. No solo procesa HTML estático, sino que también admite JavaScript. Esto ha sido una ventaja significativa para mí al trabajar con contenido web dinámico.
Funciones Avanzadas de IronPDF
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");Conversión de HTML a PDF con Soporte de JavaScript La conversión de HTML a PDF de IronPDF es bastante sorprendente. No solo renderiza HTML estático, también puede manejar JavaScript.

La capacidad de incluir scripts externos, como Chart.js en este ejemplo, significa que puedo usar potentes bibliotecas de JavaScript para crear contenido rico y dinámico en mis PDF. Este código genera un PDF con un gráfico dinámico usando Chart.js. El JavaScript se ejecuta durante el proceso de creación del PDF, produciendo un PDF que contiene el gráfico renderizado.
Encriptación y desencriptación de PDF
La seguridad es crucial en muchos de mis proyectos, especialmente cuando se trata de información confidencial. Las capacidades de cifrado y descifrado de IronPDF han sido esenciales en estos casos.
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");
Este código no solo cifra el PDF con una contraseña de usuario, sino que también establece una contraseña de propietario con control granular sobre permisos. #### Cifrado y Descifrado de PDF
La seguridad es primordial en muchos de mis proyectos, especialmente al tratar con información sensible.
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}");
}Las capacidades de cifrado y descifrado de IronPDF han sido invaluables en estos escenarios.
Este código no solo cifra el PDF con una contraseña de usuario, sino que también establece una contraseña de propietario con control granular sobre permisos.
Compresión de PDF
Para el descifrado, a menudo uso este enfoque: La función de compresión de IronPDF ha sido un salvavidas para gestionar restricciones de almacenamiento y ancho de banda.
Compresión de PDFs
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}%");Puedo definir lo que los usuarios pueden hacer con el PDF, como imprimir o copiar.

Al tratar con grandes cantidades de PDFs, el tamaño del archivo se convierte en un factor clave.
La función de compresión de IronPDF ha sido crucial en la gestión de almacenamiento y ancho de banda.
- Archivos adjuntos en correo electrónico: cuando envío archivos PDF por correo electrónico, los comprimo para asegurarme de que no excedan los límites de tamaño de los archivos adjuntos.
- Aplicaciones web: para los archivos PDF que los usuarios deben descargar, la compresión ayuda a reducir los tiempos de carga y el uso del ancho de banda.
- Archivado: al almacenar grandes cantidades de archivos PDF para su conservación a largo plazo, la compresión reduce significativamente los costos de almacenamiento.
En un proyecto, desarrollé un sistema de gestión de documentos para un bufete de abogados. He usado esta característica en varios escenarios: 1. Adjuntos de correo electrónico: Al enviar PDFs por correo electrónico, los comprimo para asegurarme de que no excedan los límites de tamaño de adjunto.
Firmas digitales
- Archivado: Al almacenar grandes cantidades de PDFs para retención a largo plazo, la compresión reduce significativamente los costos de almacenamiento. En un proyecto, trabajé en un sistema de gestión de documentos para un bufete de abogados. Esta combinación de técnicas ha reducido tamaños de archivo sin afectar la calidad.
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");Tenían miles de PDFs, muchos escaneados y con gran tamaño.
- Sistema de gestión de contratos: Implementamos esto para una empresa que necesitaba enviar y recibir contratos firmados electrónicamente.

- Sistema de registros médicos: En una aplicación de atención médica, utilizamos firmas digitales para permitir que los médicos firmen los registros y recetas de los pacientes.
- Procesamiento de documentos gubernamentales: Para una agencia gubernamental, implementamos un sistema donde los documentos oficiales pudieran firmarse digitalmente.
División y fusión de PDF
- Sistema de gestión de contratos: Lo implementamos para una empresa que necesitaba enviar y recibir contratos firmados electrónicamente. Las firmas digitales aseguraron la validez legal de los contratos. #### División y fusión 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();
}
}- Procesamiento de documentos gubernamentales: Para una agencia gubernamental, implementamos un sistema donde los documentos oficiales podrían ser firmados digitalmente.
División y Fusión de PDF
La capacidad de dividir y fusionar PDFs es una característica fundamental que uso frecuentemente en sistemas de gestión de documentos.
Relleno de formularios
Automatizar el llenado de formularios ha ahorrado mucho tiempo en muchos de mis proyectos.
Aquí está el documento fusionado que se genera por el código:
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");Tenían miles de PDFs, muchos escaneados y con gran tamaño.
- Sistema de incorporación de RRHH: Creamos un sistema que completaba automáticamente la documentación de nuevos empleados basándose en la información de la base de datos de RRHH, ahorrando horas de entrada de datos manual.
Automatizar el relleno de formularios ha sido un gran ahorro de tiempo en muchos de mis proyectos.
Sistema de solicitudes escolares: En un proyecto educativo, implementamos un sistema que completaba los formularios de solicitud escolar basándose en los datos de los estudiantes, facilitando el proceso de solicitud tanto para los estudiantes como para el personal administrativo.
- Generación de formularios fiscales: Para una firma de contabilidad, creamos un sistema que completaba automáticamente los formularios fiscales basándose en los datos financieros de los clientes, reduciendo errores y ahorrando tiempo durante la temporada de impuestos.
He usado esta característica en varias aplicaciones del mundo real:
Marcas de agua
- Sistema de RRHH: Creamos un sistema que llenaba automáticamente formularios de nuevos empleados, ahorrando horas de entrada manual. 1. Sistema de solicitudes escolares: En un proyecto educativo, implementamos un sistema que completaba formularios escolares según datos de estudiantes, facilitando el proceso para todos. 2. Generación de formularios de impuestos: Para una firma contable, creamos un sistema que llenaba formularios de impuestos automáticamente, reduciendo errores y ahorrando tiempo en la temporada de impuestos.
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");
Características avanzadas de APITemplate
Generación de plantillas dinámicas
IronPDF proporciona capacidades de marca de agua flexibles que he encontrado útiles en muchos proyectos. Aquí hay un ejemplo más detallado de cómo uso la marca de agua: 4. Puedes obtener salidas en PDF e imagen de tu código. ### Funciones Avanzadas de APITemplate
Exploremos cómo he utilizado esto en mis proyectos.
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'");
}
}
}
}
La API de APITemplate admite componentes dinámicos.

Generación de PDF a granel
La función de generación masiva de PDF de APITemplate es una ventaja significativa cuando se trata de crear múltiples documentos en una sola llamada API. 6. Aquí tienes un ejemplo más detallado de cómo lo he utilizado:
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}");
}
}
}
}
}Este es el documento PDF generado: 7. Cada tarjeta está personalizada con información individual. #### Generación de PDF en Masa

Generación de imágenes
Este código genera múltiples tarjetas de membresía en una sola llamada API. Cada tarjeta se personaliza con información individual del miembro. 9. Aquí tienes un ejemplo más complejo de cómo lo he utilizado:
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);
}
}
}
}
}
}
Generación de Imágenes
Generación de código QR
También ofrece un recorte inteligente de imágenes responsivo. La API de generación de banners es la misma que la de imágenes. Aquí hay un ejemplo más complejo de cómo lo he utilizado: 9. Aquí tienes un ejemplo más complejo de cómo lo he utilizado:
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);
}
}
}
}
}
}
Documentación y soporte
La característica de generación de códigos QR incorporada en APITemplate ha añadido mucho a muchos de mis proyectos. Exploremos mis experiencias con la documentación y el soporte para IronPDF y APITemplate.
HierroPDF
Documentación
La documentación de IronPDF es completa y bien estructurada, lo que ha sido muy útil en mis proyectos. Aquí hay un desglose detallado de mi experiencia: La documentación de IronPDF está disponible en https://ironpdf.com/docs/, y es bastante extensa. Aquí hay algunos aspectos clave que he apreciado:
Guía para Comenzar: La documentación comienza con una guía clara y paso a paso sobre cómo instalar IronPDF a través de NuGet y crear tu primer PDF. 12. Esto me ayudó a iniciar rápidamente en mis proyectos iniciales.
Referencia de API: La referencia de API es exhaustiva, cubriendo todas las clases y métodos. La documentación de IronPDF es completa y bien estructurada, lo que ha sido una gran ayuda en mis proyectos.
- Ejemplos de código: La documentación incluye numerosos fragmentos de código y... 14. La documentación comienza con una guía clara para instalar IronPDF vía NuGet y crear tu primer PDF.
Tutoriales y Guías de Cómo Hacer: IronPDF proporciona tutoriales detallados para tareas comunes como crear PDFs desde HTML, agregar marcas de agua o trabajar con formularios. 2. Referencia de API: La referencia API es exhaustiva y cubre todas las clases y métodos.
- Sección de Solución de Problemas: La documentación incluye una sección de solución de problemas que aborda cuestiones comunes. 1. Esto me ha ahorrado tiempo con errores o comportamientos inesperados.
Apoyo
Tutoriales y Guías Prácticas: IronPDF proporciona tutoriales detallados para tareas comunes como crear PDFs a partir de HTML, agregar marcas de agua o trabajar con formularios.
Soporte por Correo Electrónico: Cuando he tenido problemas complejos, he utilizado su soporte por correo electrónico. 5. Sección de Solución de Problemas: La documentación incluye una sección de solución de problemas que aborda problemas comunes.
- Foro Comunitario: IronPDF mantiene un foro comunitario donde los desarrolladores pueden hacer preguntas y compartir soluciones. #### Soporte
El contacto de IronPDF ha sido receptivo y los canales de soporte han sido extremadamente útiles en mi experiencia: 2. Ejemplos de Código: Hay muchos fragmentos de código y ejemplos completos en la documentación.
Actualizaciones Regulares: IronPDF lanza actualizaciones con frecuencia que incluyen correcciones de errores y nuevas funciones. 3. He recibido respuestas útiles a mis preguntas allí.
- Guías de Migración: Cuando ha habido cambios drásticos entre versiones principales, IronPDF ha proporcionado guías de migración. 4. Soporte por Email: He utilizado su soporte por correo electrónico para problemas complejos.
Plantilla API
- Actualizaciones Regulares: IronPDF lanza frecuentemente actualizaciones con correcciones de errores y nuevas características.
Documentación
Guías de Migración: Cuando ha habido cambios de ruptura entre versiones principales, IronPDF ha proporcionado guías de migración. 5. El changelog es detallado y me ayuda a entender los cambios en cada versión.
Referencia de API: La documentación proporciona una referencia clara de API, detallando todos los puntos finales disponibles, los parámetros requeridos y los formatos de respuesta. 6. Foro de la Comunidad: IronPDF ofrece un foro donde los desarrolladores pueden preguntar y compartir soluciones.
- Autenticación: Hay una sección dedicada a la autenticación, que explica claramente cómo usar las claves de API. 7. Estas son clave para actualizar mis proyectos a nuevas versiones de la biblioteca.
Apoyo
Este recurso ha sido fundamental al integrar APITemplate en mis aplicaciones C#.
Soporte por Correo Electrónico: Cuando he tenido problemas o preguntas, he utilizado su soporte por correo electrónico. 9. Esto fue crucial al comenzar a usar el servicio.
- Sección de Preguntas Frecuentes: La documentación incluye una sección de FAQ que aborda preguntas comunes. #### Soporte
Uso de Bootstrap 5 con IronPDF para cuadros de mando analíticos
- Soporte por Email: Cuando he tenido problemas o preguntas, he utilizado su soporte por correo electrónico. Los tiempos de respuesta han sido generalmente de 1 a 2 días hábiles.
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");- Sección de Preguntas Frecuentes: La documentación incluye una sección de preguntas frecuentes que aborda preguntas comunes. Esta ha sido a menudo mi primera parada al encontrar problemas.
Uso de Bootstrap 5 con IronPDF para Tableros de Análisis
- Referencia de API: La documentación detalla todos los endpoints, parámetros y formatos de respuesta.
- Autenticación: Hay una sección que explica cómo usar las claves API.
Usando Bootstrap 5 con IronPDF para Dashboards de Análisis
- Renderizado HTML con soporte completo de Bootstrap.
Ventajas clave vs APITemplate:
Licencias
Precios y licencias de IronPDF

- Procesamiento sin conexión sin dependencias externas
- Lite: con un precio de $799 , este nivel es adecuado para un solo desarrollador que trabaja en un solo proyecto. ## Licencias
- Profesional: en $1,199 , esta opción admite hasta 10 desarrolladores, 10 ubicaciones y 10 proyectos. 15. - No se requieren llamadas API ni configuración de plantillas.
- Ilimitado: para $2,399 , este nivel permite desarrolladores, ubicaciones y proyectos ilimitados. 1. Lite: Con $799, ideal para un desarrollador en un solo proyecto.
Es una tarifa única, lo que la hace una opción asequible para proyectos pequeños o desarrolladores individuales. 2. Profesional: A $1,199, admite hasta 10 desarrolladores, ubicaciones y proyectos.
Precios y licencias de APITemplate
Ilimitado: Por $2,399, este nivel permite desarrolladores, ubicaciones y proyectos ilimitados.
- Plan Básico: a menudo comienza con un precio más bajo con una cantidad limitada de llamadas API por mes. 4. Ideal para pequeños proyectos con mínimas necesidades de generación de PDF.
- Plan Estándar: Este plan incluye más llamadas API y funciones adicionales, dirigidas a empresas medianas.
Plan Enterprise: diseñado para usuarios de gran volumen, este plan ofrece la mayor cantidad de llamadas API y funciones premium como soporte prioritario e integraciones personalizadas.
- APITemplate usa un enfoque basado en la cantidad de llamadas a la API, brindando flexibilidad.
Diferencias clave
- Modelo de precios: IronPDF utiliza un modelo de tarifa única, que puede resultar rentable a largo plazo, especialmente para un uso continuo e intensivo. 2. Plan Estándar: Este plan incluye más llamadas API y características adicionales, atendiendo a negocios de tamaño mediano.
- Soporte y actualizaciones: IronPDF incluye un año de soporte y actualizaciones con su compra, con opciones para extender este período. La licencia de APITemplate es sencilla, generalmente vinculada a un modelo de suscripción mensual o anual.
¿Por qué elegir IronPDF?
- Modelo de Precios: IronPDF utiliza un modelo de tarifa única, que puede ser rentable a largo plazo, especialmente para uso continuo e intenso. 7. Comparativa: APITemplate usa un modelo de suscripción más flexible y escalable.
HierroPDF
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");Plantilla 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);Diferencias clave
- Compatibilidad con JavaScript: IronPDF admite totalmente la ejecución de JavaScript dentro del HTML, lo que permite la generación de contenido dinámico (como la fecha actual en el ejemplo). 8. IronPDF y APITemplate generan PDFs de HTML, pero IronPDF es más robusto.
- Flexibilidad CSS: con IronPDF, tienes control total sobre el estilo CSS directamente en tu HTML. ### Plantilla API
- Rendimiento: IronPDF procesa el HTML localmente, lo que resulta en una generación de PDF más rápida, especialmente para documentos complejos. 9. La nube de APITemplate puede introducir latencia.
- Capacidad sin conexión: IronPDF funciona sin conexión, lo que resulta útil para aplicaciones con conectividad a Internet limitada o requisitos de alta seguridad. 10. Soporte de JavaScript: IronPDF ejecuta JavaScript en HTML para contenido dinámico.
- Contenido dinámico: IronPDF permite la generación de contenido más dinámico sobre la marcha, mientras que APITemplate normalmente requiere una estructura de plantilla predefinida.
- Personalización: IronPDF ofrece un control más detallado sobre el proceso de generación de PDF, incluidas opciones de tamaño de página, márgenes y otras configuraciones específicas de PDF.
- Consistencia: IronPDF garantiza una representación consistente en diferentes entornos gracias a su motor de renderizado. La salida de APITemplate puede variar según la configuración del servidor.
Conclusión
Capacidad Sin Conexión: IronPDF funciona sin conexión, lo que es útil para aplicaciones con conectividad a internet limitada o requisitos de alta seguridad. APITemplate siempre requiere una conexión a internet.
- Contenido Dinámico: IronPDF permite una generación más dinámica de contenido sobre la marcha, mientras que APITemplate generalmente requiere una estructura de plantilla predefinida. 6. Personalización: IronPDF ofrece un control más detallado sobre el proceso de generación de PDF, incluidas opciones para el tamaño de página, márgenes y otras configuraciones específicas de PDF.
Preguntas Frecuentes
¿Cuáles son las diferencias clave entre las herramientas de generación de PDFs en la nube y basadas en bibliotecas?
Las herramientas basadas en la nube, como APITemplate, ofrecen generación de PDFs a través de llamadas API y requieren conectividad a internet. En contraste, las herramientas basadas en bibliotecas como IronPDF se integran dentro de tu aplicación de C#, permitiendo la manipulación de PDFs sin conexión y ofreciendo más control sobre la creación y personalización de PDFs.
¿Cómo maneja IronPDF las conversiones de HTML a PDF en aplicaciones C#?
IronPDF permite conversiones fluidas de HTML a PDF utilizando métodos como RenderHtmlAsPdf. Soporta completamente los estándares web modernos, incluyendo CSS y JavaScript, asegurando una renderización de alta calidad del contenido web en PDFs.
¿Puedo usar IronPDF para generación de contenido dinámico en PDFs?
Sí, IronPDF soporta la ejecución de JavaScript, lo que permite la generación de contenido dinámico en PDFs. Esto es particularmente útil para crear PDFs interactivos directamente desde páginas web con datos dinámicos.
¿Cuáles son las ventajas de usar IronPDF sobre un servicio basado en suscripción?
IronPDF ofrece una tarifa de licencia única, proporcionando una solución rentable para uso a largo plazo. Permite operaciones sin conexión y ofrece amplias características de manipulación de PDFs, que pueden ser más flexibles y robustas en comparación con servicios basados en suscripción como APITemplate.
¿Qué soporte está disponible para los desarrolladores que utilizan IronPDF?
IronPDF ofrece soporte integral a través de documentación detallada, incluyendo guías, referencias de API y ejemplos de código. Los desarrolladores también pueden buscar ayuda a través de soporte por correo electrónico, foros comunitarios y monitoreo en plataformas como Stack Overflow.
¿IronPDF soporta desarrollo multiplataforma?
Sí, IronPDF es compatible con .NET Standard, lo que soporta el desarrollo multiplataforma. Esto asegura que los desarrolladores puedan integrar IronPDF en proyectos que se ejecutan en diferentes sistemas operativos sin problemas.
¿Cómo asegura IronPDF la seguridad de los PDFs generados?
IronPDF incluye características para cifrado y descifrado de PDFs, permitiendo a los desarrolladores asegurar documentos con contraseñas y firmas digitales. Estas características ayudan a mantener la confidencialidad e integridad de los documentos PDF.
¿Cuáles son algunos consejos comunes para la solución de problemas al usar IronPDF?
Al encontrar problemas con IronPDF, asegúrate de que todas las dependencias estén correctamente instaladas y actualizadas. Consulta la documentación para compatibilidad y configuraciones, y revisa ejemplos de código para verificar prácticas de implementación. Si los problemas persisten, el equipo de soporte está disponible para ayudar.






