IronPDF vs PDFSharpCore: ¿Qué Biblioteca de PDF .NET Debe Elegir en 2025?
Al desarrollar aplicaciones modernas de .NET que requieren capacidades de generación y manipulación de PDF, elegir la biblioteca adecuada puede afectar significativamente el éxito de su proyecto. Dos opciones destacadas en el ecosistema .NET son IronPDF y PDFSharpCore, cada una de las cuales ofrece enfoques distintos para la gestión de PDF. Esta comparación exhaustiva le ayudará a tomar una decisión informada basada en sus requisitos específicos, presupuesto y necesidades técnicas.
Descripción rápida de la comparación
Antes de profundizar en los detalles técnicos, aquí hay una tabla de comparación exhaustiva que resume las principales diferencias entreIronPDFy PDFSharpCore:
| Categoría | Característica/Aspecto | IronPDF | PDFSharpCore | Ventajas clave |
|---|---|---|---|---|
| Arquitectura básica | Filosofía de diseño | Renderizado basado en Chrome, API intuitivas | Construcción ligera y manual del PDF | IronPDF: Desarrollo más rápido |
| Complejidad de la API | Métodos sencillos como RenderHtmlAsPdf() | Dibujo manual con XGraphics | IronPDF: 70% menos de código | |
| Curva de aprendizaje | 1-2 días típicos | 3-5 días típicos | IronPDF: Adopción más rápida | |
| Soporte de plataforma | Multiplataforma | Soporte nativo, sin paquetes adicionales | Soporte multiplataforma completo | Ambos: Implementación moderna |
| Versiones .NET | .NET 10, 9, 8, 7, 6, 5, Core 3.1+, Framework 4.6.2+ | .NET 6+, .NET Standard 2.0 | IronPDF: Mayor compatibilidad | |
| Sistemas Operativos | Windows, Linux, macOS, Docker, Azure, AWS | Windows, Linux, macOS | IronPDF: Optimizado para la nube | |
| HTML a PDF | Motor de renderizado | Motor Chrome V8 completo | Sin soporte HTML nativo | IronPDF: Capacidad HTML |
| Compatibilidad con CSS3/HTML5 | Asistencia completa | Requiere bibliotecas de terceros | IronPDF: Estándares web modernos | |
| Ejecución de JavaScript | Compatibilidad total con JavaScript | Iniciar suscripción | IronPDF: Contenido dinámico | |
| Características principales | Extracción de texto | Función ExtractAllText() incorporada | Asistencia limitada | IronPDF: Extracción superior |
| Marcado de agua | Basado en HTML/CSS, estilo completo | Se requiere dibujo manual | IronPDF: Marcas de agua enriquecidas | |
| Firmas Digitales | Firmas integradas y visuales | Not supported | IronPDF: Seguridad empresarial | |
| Encriptación | AES-256, gestores personalizados | Soporte básico de cifrado | IronPDF: Seguridad avanzada | |
| Encabezados/pies de página | Contenido dinámico basado en HTML | Posicionamiento manual | IronPDF: Cabeceras dinámicas | |
| Realización | Velocidad de renderizado HTML | 0.8-2s típico (motor Chrome) | Iniciar suscripción | IronPDF: Renderizado HTML |
| Procesamiento de documentos de gran tamaño | Optimizado para escalar | Memoria eficiente | PDFSharpCore: Menor memoria | |
| Soporte de Threading | Async/await nativo, procesamiento paralelo | Operaciones seguras | IronPDF: Mejor escalabilidad | |
| Experiencia del desarrollador | Documentación | Extensos tutoriales, documentos API, vídeos | Documentación básica | IronPDF: Mejores recursos |
| Ejemplos de Código | más de 100 ejemplos listos para usar | Ejemplos de la comunidad | IronPDF: Muestras exhaustivas | |
| Soporte de IntelliSense | IntelliSense completo, documentos XML | IntelliSense estándar | Ambos: Integración de IDE | |
| Licensing & Pricing | Tipo de licencia | Comercial, perpetuo | Licencia MIT (Libre) | PDFSharpCore: Sin coste |
| Precio de entrada | Lite: $799 (1 dev, 1 project) | Gratis | PDFSharpCore: Coste cero | |
| Soporte | soporte de ingeniería 24/5 incluido | Sólo apoyo comunitario | IronPDF: Soporte profesional | |
| Mejor para | Casos de Uso | Aplicaciones web, informes, empresa | PDF sencillos, proyectos presupuestarios | Depende del contexto |
Introducción aIronPDFy PDFSharpCore
¿Qué es IronPDF?
IronPDF es una biblioteca comercial integral de .NET diseñada para hacer que la generación, edición y manipulación de PDF sea sencilla para los desarrolladores. Construida sobre un motor de renderizado basado en Chrome, se destaca en la conversión de contenido HTML, CSS y JavaScript en PDFs perfectos. La biblioteca ofrece un conjunto de características extenso que incluye conversión de HTML a PDF, firmas digitales, marcado de agua, encriptación de PDFs y gestión de formularios.
IronPDF es compatible con versiones modernas de .NET, incluyendo .NET 10, 9, 8, 7, 6, 5, Core 3.1+ y Framework 4.6.2+, lo que lo hace versátil tanto para aplicaciones nuevas como heredadas. Su arquitectura optimizada para la nube asegura un despliegue sin problemas en entornos Azure, AWS y Docker.
¿Qué es PDFSharpCore?
PDFSharpCore es una biblioteca de código abierto que actúa como un puerto de .NET Core de la biblioteca original PDFsharp. Lanzada bajo la licencia MIT, se centra en la creación de PDFs programática y en la manipulación básica sin depender de bibliotecas específicas de Windows. Esto la convierte en una excelente opción para proyectos multiplataforma que se ejecutan en Linux, macOS y Windows.
Aunque PDFSharpCore no ofrece conversión de HTML a PDF de forma nativa, proporciona un control preciso sobre la creación de documentos PDF a través de su API de dibujo. Los desarrolladores pueden construir manualmente documentos PDF posicionando texto, imágenes y gráficos utilizando comandos de dibujo basados en coordenadas.
Instalación y configuración
Instalación de IronPDF
Para comenzar a usarIronPDFen su proyecto, puede instalarlo fácilmente a través del Administrador de Paquetes NuGet. Siga estos pasos:
- Abra su proyecto en Visual Studio.
- Navegue a Herramientas > Administrador de Paquetes NuGet > Administrar Paquetes NuGet para la Solución.
- Busque IronPdf en el Administrador de NuGet.
- Seleccione su proyecto y haga clic en Instalar para agregarIronPDFa su proyecto.
InstalandoIronPDFa través de la interfaz del Administrador de Paquetes NuGet de Visual Studio
Alternativamente, puede usar la Consola de Administrador de Paquetes para instalarIronPDFcon el siguiente comando:
Install-Package IronPdf
Instalación de PDFSharpCore
Para instalar PDFSharpCore usando NuGet, siga estas instrucciones:
- Asegúrese de que su proyecto de Visual Studio esté abierto.
- Vaya a Herramientas > Administrador de Paquetes NuGet > Administrar Paquetes NuGet para la Solución.
- En el Administrador de Paquetes NuGet, busque PDFSharpCore.
- Seleccione su proyecto y haga clic en Instalar para incorporar PDFSharpCore.
Instalación de PDFSharpCore a través del Administrador de Paquetes NuGet
Para los desarrolladores que prefieren la Consola de Administrador de Paquetes, PDFSharpCore se puede instalar con este comando:
Install-Package PdfSharpCore
Creación de archivos PDF:IronPDFfrente a PDFSharpCore
IronPDF: Enfoque moderno basado en HTML
IronPDF revoluciona la creación de PDFs aprovechando tecnologías web que los desarrolladores ya conocen. Su motor de renderizado basado en Chrome garantiza que su HTML, CSS y JavaScript se rendericen exactamente como aparecerían en un navegador moderno.
Cadena HTML a PDF con funciones avanzadas
Las capacidades de conversión de HTML a PDF deIronPDFvan mucho más allá del simple renderizado de texto. Aquí hay un ejemplo mejorado que demuestra su poder:
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main(string[] args)
{
// Apply your license key (required for production)
License.LicenseKey = "Your-License-Key";
// Create renderer with optimized settings
var renderer = new ChromePdfRenderer()
{
RenderingOptions = new ChromePdfRenderOptions()
{
// Set margins for professional appearance
MarginTop = 25,
MarginBottom = 25,
MarginLeft = 20,
MarginRight = 20,
// Enable JavaScript execution for dynamic content
EnableJavaScript = true,
// Wait for AJAX/animations to complete
RenderDelay = 500,
// Set paper orientation and size
PaperOrientation = PdfPaperOrientation.Portrait,
PaperSize = PdfPaperSize.A4,
// Enable printing of background colors and images
PrintHtmlBackgrounds = true
}
};
// HTML with Bootstrap styling and charts
string htmlContent = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css' rel='stylesheet'>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
.header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; }
.chart-container { width: 100%; height: 300px; margin: 20px 0; }
</style>
</head>
<body>
<div class='header text-center'>
<h1>2024 Sales Performance Report</h1>
<p class='lead'>Comprehensive Analysis & Insights</p>
</div>
<div class='container mt-4'>
<div class='row'>
<div class='col-md-6'>
<div class='card'>
<div class='card-body'>
<h5 class='card-title'>Q1 Performance Metrics</h5>
<table class='table table-striped'>
<thead>
<tr>
<th>Month</th>
<th>Revenue</th>
<th>Growth</th>
</tr>
</thead>
<tbody>
<tr>
<td>January</td>
<td>$50,000</td>
<td><span class='badge bg-success'>+12%</span></td>
</tr>
<tr>
<td>February</td>
<td>$55,000</td>
<td><span class='badge bg-success'>+10%</span></td>
</tr>
<tr>
<td>March</td>
<td>$60,000</td>
<td><span class='badge bg-success'>+9%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class='col-md-6'>
<div class='card'>
<div class='card-body'>
<h5 class='card-title'>Revenue Trend</h5>
<canvas id='revenueChart'></canvas>
</div>
</div>
</div>
</div>
<div class='alert alert-info mt-4'>
<strong>Key Insight:</strong> Q1 showed consistent growth across all months,
with total revenue reaching $165,000, representing a 31% increase YoY.
</div>
</div>
<script>
// Create an interactive chart
const ctx = document.getElementById('revenueChart').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: ['January', 'February', 'March'],
datasets: [{
label: 'Revenue',
data: [50000, 55000, 60000],
borderColor: '#667eea',
backgroundColor: 'rgba(102, 126, 234, 0.1)',
tension: 0.4
}]
},
options: {
responsive: true,
maintainAspectRatio: false
}
});
</script>
</body>
</html>";
// Render the HTML to PDF
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Add metadata for better document management
pdf.MetaData.Author = "Sales Department";
pdf.MetaData.Title = "Q1 2024 Sales Report";
pdf.MetaData.Subject = "Quarterly Performance Analysis";
pdf.MetaData.Keywords = "sales, performance, Q1, 2024";
pdf.MetaData.CreationDate = DateTime.Now;
// Save the PDF
pdf.SaveAs("sales-report-q1-2024.pdf");
Console.WriteLine("Professional sales report generated successfully!");
}
}using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main(string[] args)
{
// Apply your license key (required for production)
License.LicenseKey = "Your-License-Key";
// Create renderer with optimized settings
var renderer = new ChromePdfRenderer()
{
RenderingOptions = new ChromePdfRenderOptions()
{
// Set margins for professional appearance
MarginTop = 25,
MarginBottom = 25,
MarginLeft = 20,
MarginRight = 20,
// Enable JavaScript execution for dynamic content
EnableJavaScript = true,
// Wait for AJAX/animations to complete
RenderDelay = 500,
// Set paper orientation and size
PaperOrientation = PdfPaperOrientation.Portrait,
PaperSize = PdfPaperSize.A4,
// Enable printing of background colors and images
PrintHtmlBackgrounds = true
}
};
// HTML with Bootstrap styling and charts
string htmlContent = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css' rel='stylesheet'>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
.header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; }
.chart-container { width: 100%; height: 300px; margin: 20px 0; }
</style>
</head>
<body>
<div class='header text-center'>
<h1>2024 Sales Performance Report</h1>
<p class='lead'>Comprehensive Analysis & Insights</p>
</div>
<div class='container mt-4'>
<div class='row'>
<div class='col-md-6'>
<div class='card'>
<div class='card-body'>
<h5 class='card-title'>Q1 Performance Metrics</h5>
<table class='table table-striped'>
<thead>
<tr>
<th>Month</th>
<th>Revenue</th>
<th>Growth</th>
</tr>
</thead>
<tbody>
<tr>
<td>January</td>
<td>$50,000</td>
<td><span class='badge bg-success'>+12%</span></td>
</tr>
<tr>
<td>February</td>
<td>$55,000</td>
<td><span class='badge bg-success'>+10%</span></td>
</tr>
<tr>
<td>March</td>
<td>$60,000</td>
<td><span class='badge bg-success'>+9%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class='col-md-6'>
<div class='card'>
<div class='card-body'>
<h5 class='card-title'>Revenue Trend</h5>
<canvas id='revenueChart'></canvas>
</div>
</div>
</div>
</div>
<div class='alert alert-info mt-4'>
<strong>Key Insight:</strong> Q1 showed consistent growth across all months,
with total revenue reaching $165,000, representing a 31% increase YoY.
</div>
</div>
<script>
// Create an interactive chart
const ctx = document.getElementById('revenueChart').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: ['January', 'February', 'March'],
datasets: [{
label: 'Revenue',
data: [50000, 55000, 60000],
borderColor: '#667eea',
backgroundColor: 'rgba(102, 126, 234, 0.1)',
tension: 0.4
}]
},
options: {
responsive: true,
maintainAspectRatio: false
}
});
</script>
</body>
</html>";
// Render the HTML to PDF
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Add metadata for better document management
pdf.MetaData.Author = "Sales Department";
pdf.MetaData.Title = "Q1 2024 Sales Report";
pdf.MetaData.Subject = "Quarterly Performance Analysis";
pdf.MetaData.Keywords = "sales, performance, Q1, 2024";
pdf.MetaData.CreationDate = DateTime.Now;
// Save the PDF
pdf.SaveAs("sales-report-q1-2024.pdf");
Console.WriteLine("Professional sales report generated successfully!");
}
}Este ejemplo muestra varias características avanzadas de IronPDF:
- Integración con Bootstrap: aprovecha los marcos CSS más populares para lograr un estilo profesional.
- Gráficos de JavaScript: Representa visualizaciones dinámicas de Chart.js en formato PDF.
- Diseño responsivo: maneja diseños responsivos de forma inteligente
- Gestión de metadatos: añade metadatos que se pueden buscar para sistemas de gestión de documentos
- Retrasos de renderizado: garantiza que el contenido de JavaScript se cargue completamente antes de renderizarse
La clase ChromePdfRenderer ofrece un control extenso sobre el proceso de renderizado. Las opciones clave incluyen:
EnableJavaScript: Ejecuta el código JavaScript antes de renderizarRenderDelay: Espera a que el contenido asincrónico se carguePrintHtmlBackgrounds: Conserva colores de fondo e imágenesPaperOrientationyPaperSize: Controla el diseño de la página- Configuración de márgenes para una apariencia profesional del documento
Conversión de archivos HTML y URL
IronPDF también sobresale en la conversión de archivos HTML existentes y páginas web en vivo:
using IronPdf;
class Program
{
static async Task Main(string[] args)
{
License.LicenseKey = "Your-License-Key";
var renderer = new ChromePdfRenderer();
// Convert a local HTML file with external resources
var filePdf = renderer.RenderHtmlFileAsPdf(@"C:\Reports\template.html");
filePdf.SaveAs("from-file.pdf");
// Convert a URL with authentication
renderer.LoginCredentials = new ChromeHttpLoginCredentials()
{
Username = "user@example.com",
Password = "secure-password"
};
// Render a password-protected page
var urlPdf = await renderer.RenderUrlAsPdfAsync("https://secure.example.com/reports");
urlPdf.SaveAs("secure-report.pdf");
}
}using IronPdf;
class Program
{
static async Task Main(string[] args)
{
License.LicenseKey = "Your-License-Key";
var renderer = new ChromePdfRenderer();
// Convert a local HTML file with external resources
var filePdf = renderer.RenderHtmlFileAsPdf(@"C:\Reports\template.html");
filePdf.SaveAs("from-file.pdf");
// Convert a URL with authentication
renderer.LoginCredentials = new ChromeHttpLoginCredentials()
{
Username = "user@example.com",
Password = "secure-password"
};
// Render a password-protected page
var urlPdf = await renderer.RenderUrlAsPdfAsync("https://secure.example.com/reports");
urlPdf.SaveAs("secure-report.pdf");
}
}PDFSharpCore: Construcción manual de documentos
PDFSharpCore toma un enfoque fundamentalmente diferente, requiriendo que los desarrolladores construyan manualmente documentos PDF usando comandos de dibujo. Aunque esto proporciona un control preciso, requiere significativamente más código para diseños complejos.
using PdfSharpCore.Drawing;
using PdfSharpCore.Pdf;
using System;
class Program
{
static void Main()
{
// Create a new PDF document
var document = new PdfDocument();
document.Info.Title = "Sales Report Q1 2024";
document.Info.Author = "Sales Department";
// Add a page
var page = document.AddPage();
page.Size = PdfSharpCore.PageSize.A4;
// Create graphics object for drawing
var gfx = XGraphics.FromPdfPage(page);
// Define fonts
var titleFont = new XFont("Arial", 24, XFontStyle.Bold);
var headingFont = new XFont("Arial", 14, XFontStyle.Bold);
var normalFont = new XFont("Arial", 11, XFontStyle.Regular);
// Draw title with gradient-like effect (manual implementation)
var titleBrush = new XLinearGradientBrush(
new XPoint(0, 0),
new XPoint(page.Width, 0),
XColors.DarkBlue,
XColors.Purple
);
gfx.DrawRectangle(titleBrush, 0, 0, page.Width, 80);
gfx.DrawString("2024 Sales Performance Report",
titleFont, XBrushes.White,
new XRect(0, 20, page.Width, 40),
XStringFormats.TopCenter);
// Draw table manually
double yPosition = 120;
double margin = 50;
double columnWidth = (page.Width - 2 * margin) / 3;
// Table header
gfx.DrawRectangle(XBrushes.LightGray, margin, yPosition, page.Width - 2 * margin, 25);
gfx.DrawString("Month", headingFont, XBrushes.Black,
new XRect(margin, yPosition, columnWidth, 25),
XStringFormats.Center);
gfx.DrawString("Revenue", headingFont, XBrushes.Black,
new XRect(margin + columnWidth, yPosition, columnWidth, 25),
XStringFormats.Center);
gfx.DrawString("Growth", headingFont, XBrushes.Black,
new XRect(margin + 2 * columnWidth, yPosition, columnWidth, 25),
XStringFormats.Center);
// Table data
string[,] data = {
{ "January", "$50,000", "+12%" },
{ "February", "$55,000", "+10%" },
{ "March", "$60,000", "+9%" }
};
yPosition += 25;
for (int i = 0; i < 3; i++)
{
// Alternate row colors
if (i % 2 == 0)
{
gfx.DrawRectangle(XBrushes.WhiteSmoke, margin, yPosition, page.Width - 2 * margin, 20);
}
for (int j = 0; j < 3; j++)
{
gfx.DrawString(data[i, j], normalFont, XBrushes.Black,
new XRect(margin + j * columnWidth, yPosition, columnWidth, 20),
XStringFormats.Center);
}
yPosition += 20;
}
// Draw a simple line chart (very basic implementation)
yPosition += 40;
gfx.DrawString("Revenue Trend", headingFont, XBrushes.Black,
new XRect(margin, yPosition, page.Width - 2 * margin, 25),
XStringFormats.TopLeft);
// Chart area
yPosition += 30;
double chartHeight = 150;
double chartWidth = page.Width - 2 * margin;
// Draw axes
gfx.DrawLine(XPens.Black, margin, yPosition + chartHeight, margin + chartWidth, yPosition + chartHeight);
gfx.DrawLine(XPens.Black, margin, yPosition, margin, yPosition + chartHeight);
// Plot points (simplified)
double[] revenues = { 50000, 55000, 60000 };
double maxRevenue = 65000;
double xStep = chartWidth / 3;
for (int i = 0; i < revenues.Length; i++)
{
double x = margin + (i + 0.5) * xStep;
double y = yPosition + chartHeight - (revenues[i] / maxRevenue * chartHeight);
// Draw point
gfx.DrawEllipse(XBrushes.Blue, x - 3, y - 3, 6, 6);
// Draw connecting lines
if (i > 0)
{
double prevX = margin + (i - 0.5) * xStep;
double prevY = yPosition + chartHeight - (revenues[i - 1] / maxRevenue * chartHeight);
gfx.DrawLine(new XPen(XColors.Blue, 2), prevX, prevY, x, y);
}
// Labels
gfx.DrawString($"${revenues[i]:N0}", normalFont, XBrushes.Black,
new XRect(x - 30, y - 20, 60, 15),
XStringFormats.TopCenter);
}
// Save the document
document.Save("pdfsharp-sales-report.pdf");
Console.WriteLine("PDF created with PDFSharpCore");
}
}using PdfSharpCore.Drawing;
using PdfSharpCore.Pdf;
using System;
class Program
{
static void Main()
{
// Create a new PDF document
var document = new PdfDocument();
document.Info.Title = "Sales Report Q1 2024";
document.Info.Author = "Sales Department";
// Add a page
var page = document.AddPage();
page.Size = PdfSharpCore.PageSize.A4;
// Create graphics object for drawing
var gfx = XGraphics.FromPdfPage(page);
// Define fonts
var titleFont = new XFont("Arial", 24, XFontStyle.Bold);
var headingFont = new XFont("Arial", 14, XFontStyle.Bold);
var normalFont = new XFont("Arial", 11, XFontStyle.Regular);
// Draw title with gradient-like effect (manual implementation)
var titleBrush = new XLinearGradientBrush(
new XPoint(0, 0),
new XPoint(page.Width, 0),
XColors.DarkBlue,
XColors.Purple
);
gfx.DrawRectangle(titleBrush, 0, 0, page.Width, 80);
gfx.DrawString("2024 Sales Performance Report",
titleFont, XBrushes.White,
new XRect(0, 20, page.Width, 40),
XStringFormats.TopCenter);
// Draw table manually
double yPosition = 120;
double margin = 50;
double columnWidth = (page.Width - 2 * margin) / 3;
// Table header
gfx.DrawRectangle(XBrushes.LightGray, margin, yPosition, page.Width - 2 * margin, 25);
gfx.DrawString("Month", headingFont, XBrushes.Black,
new XRect(margin, yPosition, columnWidth, 25),
XStringFormats.Center);
gfx.DrawString("Revenue", headingFont, XBrushes.Black,
new XRect(margin + columnWidth, yPosition, columnWidth, 25),
XStringFormats.Center);
gfx.DrawString("Growth", headingFont, XBrushes.Black,
new XRect(margin + 2 * columnWidth, yPosition, columnWidth, 25),
XStringFormats.Center);
// Table data
string[,] data = {
{ "January", "$50,000", "+12%" },
{ "February", "$55,000", "+10%" },
{ "March", "$60,000", "+9%" }
};
yPosition += 25;
for (int i = 0; i < 3; i++)
{
// Alternate row colors
if (i % 2 == 0)
{
gfx.DrawRectangle(XBrushes.WhiteSmoke, margin, yPosition, page.Width - 2 * margin, 20);
}
for (int j = 0; j < 3; j++)
{
gfx.DrawString(data[i, j], normalFont, XBrushes.Black,
new XRect(margin + j * columnWidth, yPosition, columnWidth, 20),
XStringFormats.Center);
}
yPosition += 20;
}
// Draw a simple line chart (very basic implementation)
yPosition += 40;
gfx.DrawString("Revenue Trend", headingFont, XBrushes.Black,
new XRect(margin, yPosition, page.Width - 2 * margin, 25),
XStringFormats.TopLeft);
// Chart area
yPosition += 30;
double chartHeight = 150;
double chartWidth = page.Width - 2 * margin;
// Draw axes
gfx.DrawLine(XPens.Black, margin, yPosition + chartHeight, margin + chartWidth, yPosition + chartHeight);
gfx.DrawLine(XPens.Black, margin, yPosition, margin, yPosition + chartHeight);
// Plot points (simplified)
double[] revenues = { 50000, 55000, 60000 };
double maxRevenue = 65000;
double xStep = chartWidth / 3;
for (int i = 0; i < revenues.Length; i++)
{
double x = margin + (i + 0.5) * xStep;
double y = yPosition + chartHeight - (revenues[i] / maxRevenue * chartHeight);
// Draw point
gfx.DrawEllipse(XBrushes.Blue, x - 3, y - 3, 6, 6);
// Draw connecting lines
if (i > 0)
{
double prevX = margin + (i - 0.5) * xStep;
double prevY = yPosition + chartHeight - (revenues[i - 1] / maxRevenue * chartHeight);
gfx.DrawLine(new XPen(XColors.Blue, 2), prevX, prevY, x, y);
}
// Labels
gfx.DrawString($"${revenues[i]:N0}", normalFont, XBrushes.Black,
new XRect(x - 30, y - 20, 60, 15),
XStringFormats.TopCenter);
}
// Save the document
document.Save("pdfsharp-sales-report.pdf");
Console.WriteLine("PDF created with PDFSharpCore");
}
}Como puede ver, crear incluso un documento moderadamente complejo con PDFSharpCore requiere:
- Posicionamiento manual de cada elemento
- Cálculos complejos para los diseños
- Sin soporte integrado para HTML o CSS
- Implementación manual de gráficos y gráficos
- Código significativamente mayor para obtener el mismo resultado
HTML a PDF con PDFSharpCore
Dado que PDFSharpCore no admite nativamente la conversión de HTML a PDF, los desarrolladores deben usar bibliotecas de terceros. Una opción popular es combinar PDFSharpCore con HtmlRenderer:
using PdfSharpCore.Pdf;
using TheArtOfDev.HtmlRenderer.PdfSharp;
var document = new PdfDocument();
string htmlContent = File.ReadAllText("template.html");
// Note: HtmlRenderer has limited CSS support
PdfGenerator.AddPdfPages(document, htmlContent, PdfSharpCore.PageSize.A4);
document.Save("from-html.pdf");using PdfSharpCore.Pdf;
using TheArtOfDev.HtmlRenderer.PdfSharp;
var document = new PdfDocument();
string htmlContent = File.ReadAllText("template.html");
// Note: HtmlRenderer has limited CSS support
PdfGenerator.AddPdfPages(document, htmlContent, PdfSharpCore.PageSize.A4);
document.Save("from-html.pdf");Sin embargo, este enfoque tiene limitaciones significativas:
- Soporte limitado para CSS3 (aproximadamente 70-80% de compatibilidad)
- Sin ejecución de JavaScript
- Manejo deficiente de funciones web modernas
- Renderizado inconsistente en comparación con los navegadores
Soporte de marcos CSS modernos: Bootstrap y más allá
Cuando se desarrollan aplicaciones que requieren la generación de PDF a partir de contenido web, el soporte para Bootstrap y marcos CSS modernos es crítico. La mayoría de las aplicaciones web utilizan estos marcos para un diseño consistente, y la capacidad de convertir estas interfaces a PDF sin modificación reduce significativamente el tiempo de desarrollo.
IronPDF: Soporte completo de Bootstrap y CSS Framework
- Bootstrap 5: motor de diseño flexbox completo, CSS Grid, clases de utilidad y todos los sistemas de componentes
- Bootstrap 4: Componentes de tarjeta completos, navegación, utilidades flexibles y clases responsivas
- Tailwind CSS: Todas las clases de utilidad con representación precisa
- Fundación: Sistema de cuadrícula completo y biblioteca de componentes
- CSS3 moderno: Flexbox, CSS Grid, propiedades personalizadas, animaciones, transiciones y transformaciones
Prueba del mundo real:IronPDFrenderiza la página principal de Bootstrap y todas las plantillas oficiales con precisión píxel-perfecta.
Ejemplo de Código: Panel de Progreso de Proyecto
using IronPdf;
// Set yourIronPDFlicense key
IronPdf.License.LicenseKey = "License-Key goes here";
var renderer = new ChromePdfRenderer();
string bootstrapProgress = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.project-card {
transition: all 0.3s ease;
border-left: 4px solid transparent;
}
.project-card.active { border-left-color: #0d6efd; }
.progress-label { font-size: 0.75rem; font-weight: 600; }
</style>
</head>
<body>
<div class='container my-5'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<div>
<h1 class='display-6 mb-1'>Project Portfolio Status</h1>
<p class='text-muted mb-0'>Q1 2025 Development Pipeline</p>
</div>
<div>
<span class='badge bg-success fs-6'>8 Active Projects</span>
</div>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center shadow-sm'>
<div class='card-body'>
<div class='display-4 text-primary mb-2'>72%</div>
<h6 class='text-muted text-uppercase mb-0'>Overall Progress</h6>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm'>
<div class='card-body'>
<div class='display-4 text-success mb-2'>5</div>
<h6 class='text-muted text-uppercase mb-0'>On Track</h6>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm'>
<div class='card-body'>
<div class='display-4 text-warning mb-2'>2</div>
<h6 class='text-muted text-uppercase mb-0'>At Risk</h6>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm'>
<div class='card-body'>
<div class='display-4 text-danger mb-2'>1</div>
<h6 class='text-muted text-uppercase mb-0'>Delayed</h6>
</div>
</div>
</div>
</div>
<div class='card shadow-sm mb-4'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Active Projects</h5>
</div>
<div class='card-body p-0'>
<div class='list-group list-group-flush'>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-start mb-3'>
<div>
<h6 class='mb-1'>E-Commerce Platform Redesign</h6>
<small class='text-muted'>Lead: Sarah Chen | Due: Apr 15, 2025</small>
</div>
<span class='badge bg-success'>On Track</span>
</div>
<div class='mb-2'>
<div class='d-flex justify-content-between align-items-center mb-1'>
<span class='progress-label text-muted'>COMPLETION</span>
<span class='progress-label text-primary'>85%</span>
</div>
<div class='progress' style='height: 8px;'>
<div class='progress-bar bg-primary' role='progressbar' style='width: 85%'></div>
</div>
</div>
<div class='d-flex gap-2 flex-wrap'>
<span class='badge bg-light text-dark'>Frontend: 90%</span>
<span class='badge bg-light text-dark'>Backend: 80%</span>
<span class='badge bg-light text-dark'>Testing: 85%</span>
</div>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-start mb-3'>
<div>
<h6 class='mb-1'>Mobile App Integration</h6>
<small class='text-muted'>Lead: Marcus Johnson | Due: Mar 30, 2025</small>
</div>
<span class='badge bg-success'>On Track</span>
</div>
<div class='mb-2'>
<div class='d-flex justify-content-between align-items-center mb-1'>
<span class='progress-label text-muted'>COMPLETION</span>
<span class='progress-label text-success'>92%</span>
</div>
<div class='progress' style='height: 8px;'>
<div class='progress-bar bg-success' role='progressbar' style='width: 92%'></div>
</div>
</div>
<div class='d-flex gap-2 flex-wrap'>
<span class='badge bg-light text-dark'>iOS: 95%</span>
<span class='badge bg-light text-dark'>Android: 90%</span>
<span class='badge bg-light text-dark'>API: 100%</span>
</div>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-start mb-3'>
<div>
<h6 class='mb-1'>Customer Analytics Dashboard</h6>
<small class='text-muted'>Lead: Emily Rodriguez | Due: Apr 22, 2025</small>
</div>
<span class='badge bg-warning text-dark'>At Risk</span>
</div>
<div class='mb-2'>
<div class='d-flex justify-content-between align-items-center mb-1'>
<span class='progress-label text-muted'>COMPLETION</span>
<span class='progress-label text-warning'>58%</span>
</div>
<div class='progress' style='height: 8px;'>
<div class='progress-bar bg-warning' role='progressbar' style='width: 58%'></div>
</div>
</div>
<div class='d-flex gap-2 flex-wrap'>
<span class='badge bg-light text-dark'>Data Pipeline: 65%</span>
<span class='badge bg-light text-dark'>UI: 50%</span>
<span class='badge bg-light text-dark'>Reports: 45%</span>
</div>
<div class='alert alert-warning mt-2 mb-0 py-2'>
<small><strong>Issue:</strong> Resource constraints affecting timeline. Review scheduled for next week.</small>
</div>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-start mb-3'>
<div>
<h6 class='mb-1'>Security Infrastructure Upgrade</h6>
<small class='text-muted'>Lead: David Kim | Due: Mar 25, 2025</small>
</div>
<span class='badge bg-danger'>Delayed</span>
</div>
<div class='mb-2'>
<div class='d-flex justify-content-between align-items-center mb-1'>
<span class='progress-label text-muted'>COMPLETION</span>
<span class='progress-label text-danger'>42%</span>
</div>
<div class='progress' style='height: 8px;'>
<div class='progress-bar bg-danger' role='progressbar' style='width: 42%'></div>
</div>
</div>
<div class='d-flex gap-2 flex-wrap'>
<span class='badge bg-light text-dark'>Authentication: 60%</span>
<span class='badge bg-light text-dark'>Encriptación: 40%</span>
<span class='badge bg-light text-dark'>Audit Logs: 25%</span>
</div>
<div class='alert alert-danger mt-2 mb-0 py-2'>
<small><strong>Critical:</strong> 7 days behind schedule. Additional resources allocated. Daily standup required.</small>
</div>
</div>
</div>
</div>
</div>
<div class='row g-4'>
<div class='col-md-6'>
<div class='card shadow-sm'>
<div class='card-header bg-white'>
<h5 class='mb-0'>Sprint Velocity</h5>
</div>
<div class='card-body'>
<div class='mb-3'>
<div class='d-flex justify-content-between mb-1'>
<span class='text-muted'>Current Sprint</span>
<strong>42 Story Points</strong>
</div>
<div class='progress' style='height: 20px;'>
<div class='progress-bar bg-success' style='width: 84%'>84% Complete</div>
</div>
</div>
<div class='mb-3'>
<div class='d-flex justify-content-between mb-1'>
<span class='text-muted'>Previous Sprint</span>
<strong>38 Story Points</strong>
</div>
<div class='progress' style='height: 20px;'>
<div class='progress-bar bg-info' style='width: 100%'>Completed</div>
</div>
</div>
<div class='mb-0'>
<div class='d-flex justify-content-between mb-1'>
<span class='text-muted'>Average Velocity</span>
<strong>40 Story Points</strong>
</div>
<div class='progress' style='height: 20px;'>
<div class='progress-bar bg-primary' style='width: 100%'>Baseline</div>
</div>
</div>
</div>
</div>
</div>
<div class='col-md-6'>
<div class='card shadow-sm'>
<div class='card-header bg-white'>
<h5 class='mb-0'>Team Capacity</h5>
</div>
<div class='card-body'>
<div class='d-flex justify-content-between align-items-center mb-3'>
<div>
<h6 class='mb-0'>Frontend Team</h6>
<small class='text-muted'>6 developers</small>
</div>
<span class='badge bg-success'>92% Utilized</span>
</div>
<div class='d-flex justify-content-between align-items-center mb-3'>
<div>
<h6 class='mb-0'>Backend Team</h6>
<small class='text-muted'>5 developers</small>
</div>
<span class='badge bg-success'>88% Utilized</span>
</div>
<div class='d-flex justify-content-between align-items-center mb-3'>
<div>
<h6 class='mb-0'>QA Team</h6>
<small class='text-muted'>3 testers</small>
</div>
<span class='badge bg-warning text-dark'>105% Utilized</span>
</div>
<div class='d-flex justify-content-between align-items-center mb-0'>
<div>
<h6 class='mb-0'>DevOps Team</h6>
<small class='text-muted'>2 engineers</small>
</div>
<span class='badge bg-danger'>110% Utilized</span>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapProgress);
pdf.SaveAs("project-progress.pdf");using IronPdf;
// Set yourIronPDFlicense key
IronPdf.License.LicenseKey = "License-Key goes here";
var renderer = new ChromePdfRenderer();
string bootstrapProgress = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.project-card {
transition: all 0.3s ease;
border-left: 4px solid transparent;
}
.project-card.active { border-left-color: #0d6efd; }
.progress-label { font-size: 0.75rem; font-weight: 600; }
</style>
</head>
<body>
<div class='container my-5'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<div>
<h1 class='display-6 mb-1'>Project Portfolio Status</h1>
<p class='text-muted mb-0'>Q1 2025 Development Pipeline</p>
</div>
<div>
<span class='badge bg-success fs-6'>8 Active Projects</span>
</div>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center shadow-sm'>
<div class='card-body'>
<div class='display-4 text-primary mb-2'>72%</div>
<h6 class='text-muted text-uppercase mb-0'>Overall Progress</h6>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm'>
<div class='card-body'>
<div class='display-4 text-success mb-2'>5</div>
<h6 class='text-muted text-uppercase mb-0'>On Track</h6>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm'>
<div class='card-body'>
<div class='display-4 text-warning mb-2'>2</div>
<h6 class='text-muted text-uppercase mb-0'>At Risk</h6>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm'>
<div class='card-body'>
<div class='display-4 text-danger mb-2'>1</div>
<h6 class='text-muted text-uppercase mb-0'>Delayed</h6>
</div>
</div>
</div>
</div>
<div class='card shadow-sm mb-4'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Active Projects</h5>
</div>
<div class='card-body p-0'>
<div class='list-group list-group-flush'>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-start mb-3'>
<div>
<h6 class='mb-1'>E-Commerce Platform Redesign</h6>
<small class='text-muted'>Lead: Sarah Chen | Due: Apr 15, 2025</small>
</div>
<span class='badge bg-success'>On Track</span>
</div>
<div class='mb-2'>
<div class='d-flex justify-content-between align-items-center mb-1'>
<span class='progress-label text-muted'>COMPLETION</span>
<span class='progress-label text-primary'>85%</span>
</div>
<div class='progress' style='height: 8px;'>
<div class='progress-bar bg-primary' role='progressbar' style='width: 85%'></div>
</div>
</div>
<div class='d-flex gap-2 flex-wrap'>
<span class='badge bg-light text-dark'>Frontend: 90%</span>
<span class='badge bg-light text-dark'>Backend: 80%</span>
<span class='badge bg-light text-dark'>Testing: 85%</span>
</div>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-start mb-3'>
<div>
<h6 class='mb-1'>Mobile App Integration</h6>
<small class='text-muted'>Lead: Marcus Johnson | Due: Mar 30, 2025</small>
</div>
<span class='badge bg-success'>On Track</span>
</div>
<div class='mb-2'>
<div class='d-flex justify-content-between align-items-center mb-1'>
<span class='progress-label text-muted'>COMPLETION</span>
<span class='progress-label text-success'>92%</span>
</div>
<div class='progress' style='height: 8px;'>
<div class='progress-bar bg-success' role='progressbar' style='width: 92%'></div>
</div>
</div>
<div class='d-flex gap-2 flex-wrap'>
<span class='badge bg-light text-dark'>iOS: 95%</span>
<span class='badge bg-light text-dark'>Android: 90%</span>
<span class='badge bg-light text-dark'>API: 100%</span>
</div>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-start mb-3'>
<div>
<h6 class='mb-1'>Customer Analytics Dashboard</h6>
<small class='text-muted'>Lead: Emily Rodriguez | Due: Apr 22, 2025</small>
</div>
<span class='badge bg-warning text-dark'>At Risk</span>
</div>
<div class='mb-2'>
<div class='d-flex justify-content-between align-items-center mb-1'>
<span class='progress-label text-muted'>COMPLETION</span>
<span class='progress-label text-warning'>58%</span>
</div>
<div class='progress' style='height: 8px;'>
<div class='progress-bar bg-warning' role='progressbar' style='width: 58%'></div>
</div>
</div>
<div class='d-flex gap-2 flex-wrap'>
<span class='badge bg-light text-dark'>Data Pipeline: 65%</span>
<span class='badge bg-light text-dark'>UI: 50%</span>
<span class='badge bg-light text-dark'>Reports: 45%</span>
</div>
<div class='alert alert-warning mt-2 mb-0 py-2'>
<small><strong>Issue:</strong> Resource constraints affecting timeline. Review scheduled for next week.</small>
</div>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-start mb-3'>
<div>
<h6 class='mb-1'>Security Infrastructure Upgrade</h6>
<small class='text-muted'>Lead: David Kim | Due: Mar 25, 2025</small>
</div>
<span class='badge bg-danger'>Delayed</span>
</div>
<div class='mb-2'>
<div class='d-flex justify-content-between align-items-center mb-1'>
<span class='progress-label text-muted'>COMPLETION</span>
<span class='progress-label text-danger'>42%</span>
</div>
<div class='progress' style='height: 8px;'>
<div class='progress-bar bg-danger' role='progressbar' style='width: 42%'></div>
</div>
</div>
<div class='d-flex gap-2 flex-wrap'>
<span class='badge bg-light text-dark'>Authentication: 60%</span>
<span class='badge bg-light text-dark'>Encriptación: 40%</span>
<span class='badge bg-light text-dark'>Audit Logs: 25%</span>
</div>
<div class='alert alert-danger mt-2 mb-0 py-2'>
<small><strong>Critical:</strong> 7 days behind schedule. Additional resources allocated. Daily standup required.</small>
</div>
</div>
</div>
</div>
</div>
<div class='row g-4'>
<div class='col-md-6'>
<div class='card shadow-sm'>
<div class='card-header bg-white'>
<h5 class='mb-0'>Sprint Velocity</h5>
</div>
<div class='card-body'>
<div class='mb-3'>
<div class='d-flex justify-content-between mb-1'>
<span class='text-muted'>Current Sprint</span>
<strong>42 Story Points</strong>
</div>
<div class='progress' style='height: 20px;'>
<div class='progress-bar bg-success' style='width: 84%'>84% Complete</div>
</div>
</div>
<div class='mb-3'>
<div class='d-flex justify-content-between mb-1'>
<span class='text-muted'>Previous Sprint</span>
<strong>38 Story Points</strong>
</div>
<div class='progress' style='height: 20px;'>
<div class='progress-bar bg-info' style='width: 100%'>Completed</div>
</div>
</div>
<div class='mb-0'>
<div class='d-flex justify-content-between mb-1'>
<span class='text-muted'>Average Velocity</span>
<strong>40 Story Points</strong>
</div>
<div class='progress' style='height: 20px;'>
<div class='progress-bar bg-primary' style='width: 100%'>Baseline</div>
</div>
</div>
</div>
</div>
</div>
<div class='col-md-6'>
<div class='card shadow-sm'>
<div class='card-header bg-white'>
<h5 class='mb-0'>Team Capacity</h5>
</div>
<div class='card-body'>
<div class='d-flex justify-content-between align-items-center mb-3'>
<div>
<h6 class='mb-0'>Frontend Team</h6>
<small class='text-muted'>6 developers</small>
</div>
<span class='badge bg-success'>92% Utilized</span>
</div>
<div class='d-flex justify-content-between align-items-center mb-3'>
<div>
<h6 class='mb-0'>Backend Team</h6>
<small class='text-muted'>5 developers</small>
</div>
<span class='badge bg-success'>88% Utilized</span>
</div>
<div class='d-flex justify-content-between align-items-center mb-3'>
<div>
<h6 class='mb-0'>QA Team</h6>
<small class='text-muted'>3 testers</small>
</div>
<span class='badge bg-warning text-dark'>105% Utilized</span>
</div>
<div class='d-flex justify-content-between align-items-center mb-0'>
<div>
<h6 class='mb-0'>DevOps Team</h6>
<small class='text-muted'>2 engineers</small>
</div>
<span class='badge bg-danger'>110% Utilized</span>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapProgress);
pdf.SaveAs("project-progress.pdf");Salida: PDF de gestión de proyectos profesional con diseños basados en flexbox de Bootstrap 5, componentes de barra de progreso, utilidades de insignias, sistemas de tarjetas responsivas y componentes de alerta, todo renderizado con alineación, espaciado y precisión de color perfectos.
PDFSharpCore: Sin compatibilidad con HTML nativo
PDFSharpCore no tiene ningún motor de renderizado HTML nativo. La biblioteca está diseñada exclusivamente para manipulación de PDF a bajo nivel y operaciones de dibujo:
- Sin soporte de Bootstrap: no se pueden procesar marcos HTML/CSS en absoluto
- Sin flexbox ni CSS Grid: No hay ninguna capacidad de renderizado CSS
- Solo construcción manual: requiere dibujar texto, formas e imágenes mediante API basadas en coordenadas
- Se requieren herramientas externas: se deben utilizar renderizadores HTML o servicios de conversión de terceros
La integración de HtmlRenderer (tercero) solo proporciona soporte básico para HTML con limitaciones severas: aproximadamente 70-80% de compatibilidad con CSS3, sin flexbox, sin Grid CSS, y sin soporte para marcos modernos.
Impacto en el desarrollo: los equipos deben abandonar por completo los flujos de trabajo basados en HTML o integrar múltiples herramientas (PDFSharpCore + renderizador HTML externo), lo que agrega complejidad, carga de mantenimiento y posibles problemas de compatibilidad entre las versiones de la biblioteca.
Para obtener una compatibilidad detallada del marco Bootstrap y capacidades de renderizado CSS3, consulte la Guía de CSS Bootstrap & Flexbox.
Comparación de funciones avanzadas
Extracción de texto
Una de las operaciones PDF más comunes es la extracción de texto para indexación, análisis o conversión. Así es como ambas bibliotecas manejan esta tarea:
Extracción de texto de IronPDF
IronPDF proporciona capacidades robustas de extracción de texto con una API simple:
using IronPdf;
// Extract all text from a PDF
var pdf = PdfDocument.FromFile("report.pdf");
string allText = pdf.ExtractAllText();
// Extract text from specific pages
for (int i = 0; i < pdf.PageCount; i++)
{
string pageText = pdf.ExtractTextFromPage(i);
Console.WriteLine($"Page {i + 1}: {pageText.Substring(0, Math.Min(100, pageText.Length))}...");
}
// Extract text from a specific region
var pageIndex = 0;
var region = new Rectangle(50, 50, 200, 100); // x, y, width, height
string regionText = pdf.ExtractTextFromPage(pageIndex, region);using IronPdf;
// Extract all text from a PDF
var pdf = PdfDocument.FromFile("report.pdf");
string allText = pdf.ExtractAllText();
// Extract text from specific pages
for (int i = 0; i < pdf.PageCount; i++)
{
string pageText = pdf.ExtractTextFromPage(i);
Console.WriteLine($"Page {i + 1}: {pageText.Substring(0, Math.Min(100, pageText.Length))}...");
}
// Extract text from a specific region
var pageIndex = 0;
var region = new Rectangle(50, 50, 200, 100); // x, y, width, height
string regionText = pdf.ExtractTextFromPage(pageIndex, region);Extracción de texto con PDFSharpCore
PDFSharpCore tiene capacidades limitadas nativas de extracción de texto. Como se señala en los artículos de comparación, a menudo produce resultados fragmentados o incompletos:
// PDFSharpCore doesn't have reliable text extraction
// This is a significant limitation for many use cases// PDFSharpCore doesn't have reliable text extraction
// This is a significant limitation for many use casesMarcas de agua
Marcar PDFs es esencial para la marca y la seguridad de documentos.
Marcas de agua IronPDF
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// HTML-based watermark with full CSS support
string watermarkHtml = @"
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.3);
transform: rotate(-45deg);
text-align: center;
font-weight: bold;
'>
CONFIDENTIAL
</div>";
pdf.ApplyWatermark(watermarkHtml, 50, VerticalAlignment.Middle, HorizontalAlignment.Center);
// Image watermark
pdf.ApplyWatermark("logo.png", 30, VerticalAlignment.Bottom, HorizontalAlignment.Right);
pdf.SaveAs("watermarked.pdf");using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// HTML-based watermark with full CSS support
string watermarkHtml = @"
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.3);
transform: rotate(-45deg);
text-align: center;
font-weight: bold;
'>
CONFIDENTIAL
</div>";
pdf.ApplyWatermark(watermarkHtml, 50, VerticalAlignment.Middle, HorizontalAlignment.Center);
// Image watermark
pdf.ApplyWatermark("logo.png", 30, VerticalAlignment.Bottom, HorizontalAlignment.Right);
pdf.SaveAs("watermarked.pdf");Marcado de agua de PDFSharpCore
using PdfSharpCore.Drawing;
using PdfSharpCore.Pdf;
using PdfSharpCore.Pdf.IO;
var document = PdfReader.Open("document.pdf", PdfDocumentOpenMode.Modify);
foreach (var page in document.Pages)
{
var gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Append);
// Create watermark font
var font = new XFont("Arial", 48);
// Calculate rotation
gfx.TranslateTransform(page.Width / 2, page.Height / 2);
gfx.RotateTransform(-45);
// Draw watermark
var size = gfx.MeasureString("CONFIDENTIAL", font);
gfx.DrawString("CONFIDENTIAL", font,
new XSolidBrush(XColor.FromArgb(128, 255, 0, 0)),
new XRect(-size.Width / 2, -size.Height / 2, size.Width, size.Height),
XStringFormats.Center);
}
document.Save("watermarked-pdfsharp.pdf");using PdfSharpCore.Drawing;
using PdfSharpCore.Pdf;
using PdfSharpCore.Pdf.IO;
var document = PdfReader.Open("document.pdf", PdfDocumentOpenMode.Modify);
foreach (var page in document.Pages)
{
var gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Append);
// Create watermark font
var font = new XFont("Arial", 48);
// Calculate rotation
gfx.TranslateTransform(page.Width / 2, page.Height / 2);
gfx.RotateTransform(-45);
// Draw watermark
var size = gfx.MeasureString("CONFIDENTIAL", font);
gfx.DrawString("CONFIDENTIAL", font,
new XSolidBrush(XColor.FromArgb(128, 255, 0, 0)),
new XRect(-size.Width / 2, -size.Height / 2, size.Width, size.Height),
XStringFormats.Center);
}
document.Save("watermarked-pdfsharp.pdf");Firmas digitales
Las firmas digitales aseguran la autenticidad e integridad del documento.
Firmas digitales IronPDF
using IronPdf;
using IronPdf.Signing;
var pdf = PdfDocument.FromFile("contract.pdf");
// Create a signature with certificate
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningContact = "legal@company.com",
SigningLocation = "New York, NY",
SigningReason = "Contract Approval"
};
// Add visual signature
var signatureImage = new PdfSignature("certificate.pfx", "password")
{
SignatureImage = new PdfSignatureImage("signature.png", 0, 0, 200, 100)
};
// Apply signature to the last page
pdf.Sign(signature);
pdf.SaveAs("signed-contract.pdf");using IronPdf;
using IronPdf.Signing;
var pdf = PdfDocument.FromFile("contract.pdf");
// Create a signature with certificate
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningContact = "legal@company.com",
SigningLocation = "New York, NY",
SigningReason = "Contract Approval"
};
// Add visual signature
var signatureImage = new PdfSignature("certificate.pfx", "password")
{
SignatureImage = new PdfSignatureImage("signature.png", 0, 0, 200, 100)
};
// Apply signature to the last page
pdf.Sign(signature);
pdf.SaveAs("signed-contract.pdf");Firmas digitales de PDFSharpCore
PDFSharpCore no admite firmas digitales de forma nativa, lo cual es una limitación significativa para las aplicaciones empresariales que requieren seguridad documental.
Manejo de formularios
Trabajar con formularios PDF es crucial para documentos interactivos.
Manejo de formularios IronPDF
using IronPdf;
// Create a form from HTML
var html = @"
<form>
<label>Name: <input type='text' name='fullName' required></label><br>
<label>Email: <input type='email' name='email' required></label><br>
<label>Subscribe: <input type='checkbox' name='subscribe' value='yes'></label><br>
<label>
Plan:
<select name='plan'>
<option value='basic'>Basic</option>
<option value='pro'>Professional</option>
<option value='enterprise'>Enterprise</option>
</select>
</label>
</form>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Fill existing form
var filledPdf = PdfDocument.FromFile("application-form.pdf");
filledPdf.Form.FindFormField("fullName").Value = "John Doe";
filledPdf.Form.FindFormField("email").Value = "john@example.com";
filledPdf.Form.FindFormField("subscribe").Value = "yes";
filledPdf.SaveAs("completed-application.pdf");using IronPdf;
// Create a form from HTML
var html = @"
<form>
<label>Name: <input type='text' name='fullName' required></label><br>
<label>Email: <input type='email' name='email' required></label><br>
<label>Subscribe: <input type='checkbox' name='subscribe' value='yes'></label><br>
<label>
Plan:
<select name='plan'>
<option value='basic'>Basic</option>
<option value='pro'>Professional</option>
<option value='enterprise'>Enterprise</option>
</select>
</label>
</form>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Fill existing form
var filledPdf = PdfDocument.FromFile("application-form.pdf");
filledPdf.Form.FindFormField("fullName").Value = "John Doe";
filledPdf.Form.FindFormField("email").Value = "john@example.com";
filledPdf.Form.FindFormField("subscribe").Value = "yes";
filledPdf.SaveAs("completed-application.pdf");Parámetros de rendimiento
Basado en pruebas extensivas y retroalimentación de la comunidad, aquí están las comparaciones de rendimiento:
Traducción de HTML a PDF
| Caso de Prueba | IronPDF | PDFSharpCore (con HtmlRenderer) |
|---|---|---|
| HTML Simple (1 página) | 0.8-1.2s | 0.3-0.5s |
| HTML Complejo con CSS3 | 1.5-2s | A menudo falla o se renderiza incorrectamente |
| Gráficos JavaScript | 2-3s | No soportado |
| Informe de 100 páginas | 15-20s | 45-60s |
| Uso de Memoria | 150-200MB | 80-120 MB |
Precisiones clave sobre el rendimiento
IronPDF sobresale en:
- Renderizado HTML complejo con compatibilidad completa con navegadores
- Procesamiento paralelo para operaciones por lotes
- Rendimiento consistente a través de diferentes tipos de contenido
- Operaciones async para mejor escalabilidad
- PDFSharpCore se desempeña mejor para:
- Creación de PDF programática simple
- Menor uso de memoria
- Modificaciones básicas de documentos
Ejemplo de rendimiento en el mundo real
//IronPDF- Batch processing with parallel execution
using IronPdf;
using System.Threading.Tasks;
class BatchProcessor
{
public static async Task ProcessInvoicesAsync(List<string> htmlInvoices)
{
var renderer = new ChromePdfRenderer();
// Process multiple PDFs in parallel
var tasks = htmlInvoices.Select(async (html, index) =>
{
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
await pdf.SaveAsAsync($"invoice-{index}.pdf");
});
await Task.WhenAll(tasks);
}
}//IronPDF- Batch processing with parallel execution
using IronPdf;
using System.Threading.Tasks;
class BatchProcessor
{
public static async Task ProcessInvoicesAsync(List<string> htmlInvoices)
{
var renderer = new ChromePdfRenderer();
// Process multiple PDFs in parallel
var tasks = htmlInvoices.Select(async (html, index) =>
{
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
await pdf.SaveAsAsync($"invoice-{index}.pdf");
});
await Task.WhenAll(tasks);
}
}Casos de uso del mundo real
Cuándo elegir IronPDF
IronPDF es ideal para:
Integración de Aplicaciones Web
- Convertir contenido web dinámico a PDF
- Generar informes desde tableros web
- Crear facturas a partir de plantillas HTML
Gestión Documental Empresarial
- Implementar flujos de trabajo documentales con firmas digitales
- Creación de PDFs seguros y encriptados para datos sensibles
- Procesamiento por lotes de grandes volúmenes de documentos
Aplicaciones SaaS
- Generación de PDF multiinquilino
- Despliegues nativos en la nube en Azure/AWS
- Procesamiento async de alto rendimiento
- Informes Complejos
- Estados financieros con gráficos y tablas
- Materiales de marketing con multimedia rica
- Documentación técnica con resalte de código
Cuándo elegir PDFSharpCore
PDFSharpCore es adecuado para:
Proyectos Conscientes del Presupuesto
- Proyectos de código abierto sin presupuesto de licencias
- Necesidades simples de generación de PDF
- Proyectos académicos o personales
Operaciones Básicas de PDF
- Creación de PDFs simples basados en texto
- Fusión básica de documentos
- Adición de gráficos o formas simples
- Aplicaciones Ligeras
- Sistemas embebidos con limitaciones de memoria
- Herramientas de línea de comandos sencillas
- Microservicios con dependencias mínimas
Licencias y precios
Licencias de IronPDF
IronPDF ofrece opciones de licencias flexibles (precios a partir de 2025):
- Licencia Lite: $799 (1 desarrollador, 1 ubicación, 1 proyecto)
- Licencia Plus: $1,199 (3 desarrolladores, 3 ubicaciones, 3 proyectos)
- Licencia profesional: $2,399 (10 desarrolladores, 10 ubicaciones, 10 proyectos)
- Prueba gratuita : prueba totalmente funcional de 30 días
Beneficios adicionales:
- Licencia perpetua (compra única)
- Redistribución libre de royalties disponible
- Soporte de ingeniería 24/5 incluido
- Actualizaciones gratis por un año
- Paquete Iron Suite disponible para ahorros adicionales
Licencias de PDFSharpCore
PDFSharpCore es completamente gratis bajo la licencia MIT:
- Sin costos de licencia
- Sin restricciones en el uso comercial
- Solo soporte comunitario
- Sin garantías de actualizaciones o correcciones
Experiencia del desarrollador
Documentación y recursos
IronPDF proporciona:
- Documentación completa
- 100+ ejemplos de código
- Tutoriales en video
- Guías de solución de problemas
- Referencia de API
PDFSharpCore ofrece:
- Documentación básica en GitHub
- Ejemplos comunitarios
- Tutoriales oficiales limitados
Comparación de soportes
| Tipo de Soporte | IronPDF | PDFSharpCore |
|---|---|---|
| Soporte Profesional | 24/5 incluido | Ninguno |
| Tiempo de Respuesta | 24-48 horas | Dependiente de la comunidad |
| Acceso Directo a Ingeniería | Sí | No |
| Garantías de Corrección de Errores | Sí | No |
Conclusión
TantoIronPDFcomo PDFSharpCore desempeñan roles importantes en el ecosistema de PDF .NET, pero apuntan a diferentes necesidades y casos de uso.
ElijaIronPDFcuando:
- Necesite una conversión robusta de HTML a PDF con soporte completo para CSS3 y JavaScript
- Su proyecto requiera características avanzadas como firmas digitales, encriptación o manejo de formularios
- Esté construyendo aplicaciones empresariales o comerciales
- Valore la documentación completa y el soporte profesional
- El rendimiento y la fiabilidad sean críticos
- Necesite opciones de despliegue listos para la nube
Elija PDFSharpCore cuando:
- Esté trabajando en un proyecto con restricciones de presupuesto o de código abierto
- Sus necesidades de PDF sean simples y no requieran renderizado HTML
- Prefiera el control manual sobre la construcción de PDFs
- La huella de memoria sea una preocupación crítica
- Esté cómodo con el soporte comunitario
El enfoque moderno deIronPDFpara la generación de PDF, combinado con su extenso conjunto de características y excelente soporte, lo convierte en la mejor opción para la mayoría de las aplicaciones profesionales. Aunque requiere una inversión en licencia, el tiempo ahorrado en el desarrollo y la fiabilidad obtenida a menudo justifican el costo para proyectos comerciales.
¿Listo para experimentar la diferencia? Comience su prueba gratuita de 30 días de IronPDF y vea cómo puede transformar su flujo de trabajo de generación de PDF. Con documentación completa, soporte receptivo y una API rica en funciones,IronPDFempodera a los desarrolladores para crear PDFs profesionales con un esfuerzo mínimo.
Preguntas Frecuentes
¿Cómo puedo convertir HTML a PDF en C#?
Puedes usar el método RenderHtmlAsPdf de IronPDF para convertir cadenas de HTML en PDFs. Este método admite ejecución completa de CSS3 y JavaScript, asegurando una alta fidelidad de renderizado.
¿Cuáles son las diferencias clave entre IronPDF y PDFSharpCore?
IronPDF es una biblioteca comercial con características avanzadas como conversión de HTML a PDF, firmas digitales y optimización para plataformas en la nube. PDFSharpCore es de código abierto, centrándose en la creación básica de PDF a través de comandos de dibujo manuales y carece de conversión nativa de HTML a PDF.
¿Puedo extraer texto de PDFs usando estas bibliotecas?
IronPDF ofrece capacidades robustas de extracción de texto con métodos como ExtractAllText() y ExtractTextFromPage(), manteniendo la estructura del documento. PDFSharpCore tiene funciones de extracción de texto limitadas, a menudo resultando en salidas fragmentadas.
¿Cuál es la mejor manera de agregar firmas digitales a PDFs en C#?
IronPDF permite un soporte integral de firmas digitales, incluyendo firmas visuales y el uso de certificados. Ofrece opciones personalizables para firmar PDFs, haciéndola adecuada para flujos de trabajo de documentos seguros.
¿Cómo se desempeñan estas bibliotecas en términos de velocidad de renderizado de HTML?
IronPDF generalmente renderiza HTML complejo a PDF entre 0.8-2 segundos con soporte total para CSS3 y JavaScript. PDFSharpCore es más rápido para la creación programática simple de PDF, pero no admite tecnologías web modernas, afectando sus capacidades de renderizado.
¿Hay una prueba disponible para evaluar las bibliotecas de PDF?
IronPDF ofrece una prueba gratuita de 30 días, permitiéndote explorar todas las características incluyendo la conversión de HTML a PDF. PDFSharpCore es gratuito bajo la licencia MIT, ofreciendo funcionalidad básica sin periodo de prueba.
¿Qué biblioteca es más adecuada para manejar formularios PDF?
IronPDF se destaca en el manejo de formularios con la capacidad de crear y completar formularios desde HTML y extraer datos de formularios. PDFSharpCore soporta manejo básico de formularios pero requiere creación manual de campos y no ofrece el mismo nivel de automatización.
¿Cómo soporta cada biblioteca el desarrollo multiplataforma?
Tanto IronPDF como PDFSharpCore soportan Windows, Linux y macOS. IronPDF tiene configuraciones optimizadas para plataformas en la nube como Azure y AWS, mientras que PDFSharpCore puede necesitar configuraciones adicionales para entornos en la nube.
¿Qué tipo de soporte puedo esperar con estas bibliotecas?
IronPDF ofrece soporte de ingeniería profesional 24/5 con tiempos de respuesta de 24-48 horas, junto con documentación detallada. PDFSharpCore depende del soporte comunitario a través de foros y GitHub, sin tiempos de respuesta garantizados.
¿Cómo maneja cada biblioteca el rendimiento para operaciones complejas de PDF?
IronPDF se destaca en la renderización de HTML complejo y soporta procesamiento paralelo para operaciones por lote, proporcionando un rendimiento superior. PDFSharpCore muestra ventajas en eficiencia de memoria para documentos simples pero carece de capacidades avanzadas de renderizado.






