Cómo migrar de PDFreactor a IronPDF en C#
La migración de PDFreactoraIronPDFelimina las dependencias de Java y la infraestructura de servidor, al tiempo que proporciona capacidades equivalentes de conversión de HTML a PDF a través de una biblioteca .NET nativa. Esta guía proporciona una ruta de migración completa, paso a paso, que sustituye su arquitectura de servidor basada en Java por una biblioteca en proceso que se integra perfectamente en las aplicaciones .NET.
Por qué migrar de PDFreactora IronPDF
Entendiendo PDFreactor
PDFreactor es un potente servidor de conversión de HTML a PDF que se integra en varias plataformas. Como solución comercial, PDFreactoraprovecha su tecnología patentada para convertir contenido HTML y CSS en documentos PDF de alta calidad. Entre sus notables atributos, PDFreactores compatible con una amplia gama de propiedades CSS, lo que lo convierte en un firme candidato para la representación de diseños complejos.
Sin embargo, la dependencia de PDFreactorde Java presenta ciertos retos en entornos .NET, donde su naturaleza no nativa puede complicar el despliegue y la integración. Su dependencia de Java crea una sobrecarga adicional en las aplicaciones .NET, lo que a menudo requiere un trabajo de integración adicional.
El problema de la dependencia de Java
La arquitectura de PDFreactorplantea varios retos en entornos .NET:
Se requiere Java Runtime: requiere la instalación de JRE/JDK en todos los servidores.
Arquitectura del servidor: se ejecuta como un servicio separado que requiere infraestructura adicional. Como solución basada en servidor, PDFreactorrequiere llamadas a la API REST para cada conversión.
Implementación compleja: administrar dependencias de Java en un ecosistema principalmente .NET puede complicar la configuración y aumentar los costos de mantenimiento. Dos tiempos de ejecución (Java + .NET) para gestionar en pipelines CI/CD.
Comunicación entre procesos: la API REST o la comunicación por socket agregan latencia. Cada conversión de PDF requiere un viaje de ida y vuelta HTTP al servidor.
Gestión de licencias independiente: licencia vinculada a la instancia del servidor, no a la aplicación. Licencia por servidor vinculada a una instancia de servicio Java.
- Aislamiento de recursos: gestión separada de la memoria de proceso y la CPU. Servidor adicional para supervisar, escalar y mantener.
Comparación entre PDFreactore IronPDF
| Característica/Aspecto | PDFreactor | IronPDF |
|---|---|---|
| Librería .NET nativa | No (basado en Java) | Sí |
| Runtime | Java (servidor externo) | .NET nativo (en proceso) |
| Arquitectura | Servicio API REST | Biblioteca NuGet |
| Despliegue | Java + configuración del servidor | Paquete NuGet único |
| Dependencias | JRE + cliente HTTP | Autocontenido |
| Latencia | Red de ida y vuelta | Llamadas directas a métodos |
| Capacidad multiplataforma | Sí (depende de Java) | Sí (incluido Chromium) |
| Soporte CSS | Compatibilidad avanzada con CSS3, CSS Paged Media | Compatibilidad completa con HTML5/CSS3 |
| Complejidad de Implementación | Más complejo debido a Java | Sencillo, se integra directamente con .NET |
| Funciones de manipulación de PDF | Básico (sólo generación) | Extensa, incluyendo fusión, división, edición y anotación |
A diferencia de PDFreactor,IronPDFse presenta como una biblioteca .NET nativa, diseñada específicamente para integrarse a la perfección en proyectos .NET sin dependencias externas como Java.IronPDFutiliza un motor de renderizado Chromium integrado, lo que le permite convertir HTML a PDF con sólo unas pocas líneas de código.
Para los equipos que planifican la adopción de .NET 10 y C# 14 hasta 2025 y 2026,IronPDFproporciona una solución nativa .NET que elimina la complejidad del servidor Java a la vez que ofrece una gestión integral del ciclo de vida del PDF.
Antes de empezar
Prerrequisitos
- Entorno .NET: .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
- Acceso a NuGet: Capacidad para instalar paquetes NuGet
- Licencia de IronPDF: Obtenga su clave de licencia en ironpdf.com
Cambios en el paquete NuGet
# Remove PDFreactorNuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64
# Stop PDFreactorserver service (if running locally)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor
# Install IronPDF
dotnet add package IronPdf# Remove PDFreactorNuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64
# Stop PDFreactorserver service (if running locally)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor
# Install IronPDF
dotnet add package IronPdfConfiguración de licencias
PDFreactor (basado en servidor):
// License configured on server via config file or command line
// Client connects to licensed server
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423");// License configured on server via config file or command line
// Client connects to licensed server
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423");IronPDF (nivel de aplicación):
// One-time setup at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";// One-time setup at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";Identificar el uso de PDFreactor
# Find PDFreactorusage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .
# Find CSS Paged Mediarules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .# Find PDFreactorusage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .
# Find CSS Paged Mediarules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .Referencia completa de la API
Cambios en el espacio de nombres
// Before: PDFreactor
using RealObjects.PDFreactor;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;// Before: PDFreactor
using RealObjects.PDFreactor;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;Asignaciones de clases principales
| PDFreactor | IronPDF | Notas |
|---|---|---|
PDFreactor | <código>ChromePdfRenderer</código | Clase principal de conversión |
Configuración | <código>ChromePdfRenderOptions</código | Ajustes PDF |
Resultado | Documento PDF | Documento de salida |
config.Document = html | renderer.RenderHtmlAsPdf(html) | Entrada HTML |
resultado.Document (byte[]) | <código>pdf.BinaryData</código | Bytes en bruto |
Mapeo de propiedades de configuración
| Configuración de PDFreactor | Opciones de renderizado de IronPDF | Notas |
|---|---|---|
config.Document = html | renderer.RenderHtmlAsPdf(html) | Contenido HTML |
config.Document = url | <código>renderer.RenderUrlAsPdf(url)</código | Conversión de URL |
config.PageFormat = PageFormat.A4 | <código>RenderingOptions.PaperSize = PdfPaperSize.A4</código | Tamaño del papel |
| <código>config.PageOrientation</código | <código>RenderingOptions.PaperOrientation</código | Orientación |
| <código>config.PageMargins</código | <código>RenderingOptions.MarginTop/Bottom/Left/Right</código | Márgenes (mm) |
config.EnableJavaScript = true | <código>RenderingOptions.EnableJavaScript = true</código | Ejecución JS |
| <código>config.AddUserStyleSheet(css)</código | Insertar CSS en HTML | Inyección de CSS |
| <código>config.Title</código | <código>pdf.MetaData.Title</código | Metadatos |
| <código>config.Encryption</código | <código>pdf.SecuritySettings</código | Seguridad |
Nuevas funciones no disponibles en PDFreactor
| Características de IronPDF | Descripción |
|---|---|
PdfDocument.Merge() | Combinar varios PDF |
| <código>pdf.ApplyWatermark()</código | Añadir marcas de agua |
| <código>pdf.ExtractAllText()</código | Extracción de texto |
| <código>pdf.Form</código | Relleno de formularios |
| <código>pdf.Sign()</código | Firmas digitales |
Ejemplos de migración de código
Ejemplo 1: Conversión de cadenas HTML a PDF
Antes (PDFreactor):
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
string html = "<html><body><h1>Hello World</h1></body></html>";
Configuration config = new Configuration();
config.Document = html;
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("output.pdf", result.Document);
}
}// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
string html = "<html><body><h1>Hello World</h1></body></html>";
Configuration config = new Configuration();
config.Document = html;
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("output.pdf", result.Document);
}
}Después (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}La diferencia fundamental es el patrón arquitectónico. PDFreactorrequiere la creación de una instancia de PDFreactor(que se conecta al servidor Java), un objeto Configuraciónseparado para mantener la configuración y el contenido HTML, llamar a Convert() que devuelve un objeto Resultadoy, finalmente, escribir los bytes de result.Document en un archivo utilizando File.WriteAllBytes().
IronPDF simplifica esta tarea creando un ChromePdfRenderer, llamando a RenderHtmlAsPdf() directamente con la cadena HTML y utilizando el método incorporado SaveAs() en el Documento PDFdevuelto. Sin conexión al servidor, sin objeto de configuración, sin manejo manual de bytes. Consulte la documentación HTML a PDF para ver ejemplos completos.
Ejemplo 2: Conversión de URL a PDF
Antes (PDFreactor):
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
Configuration config = new Configuration();
config.Document = "https://www.example.com";
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("webpage.pdf", result.Document);
}
}// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
Configuration config = new Configuration();
config.Document = "https://www.example.com";
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("webpage.pdf", result.Document);
}
}Después (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}PDFreactor utiliza la misma propiedad config.Document tanto para cadenas HTML como para URLs, determinando el tipo automáticamente.IronPDFproporciona métodos explícitos: RenderHtmlAsPdf() para cadenas HTML y RenderUrlAsPdf() para URLs. Este enfoque explícito mejora la claridad del código y la compatibilidad con IntelliSense. Más información en nuestros tutoriales.
Ejemplo 3: Encabezados y pies de página con números de página
Antes (PDFreactor):
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";
Configuration config = new Configuration();
config.Document = html;
config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }");
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("document.pdf", result.Document);
}
}// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";
Configuration config = new Configuration();
config.Document = html;
config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }");
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("document.pdf", result.Document);
}
}Después (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Header Text"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("document.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Header Text"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("document.pdf");
}
}Este ejemplo muestra la diferencia sintáctica más significativa. PDFreactorutiliza la sintaxis CSS Paged Mediacon reglas @page, regiones @top-center/@bottom-center y counter(page) para los números de página inyectados mediante AddUserStyleSheet().
IronPDF utiliza una API .NET nativa con objetos TextHeaderFooter asignados a RenderingOptions.TextHeader y RenderingOptions.TextFooter. Los números de página utilizan el marcador de posición {page} en lugar de CSS counter(page). Tenga en cuenta queIronPDFtambién requiere la importación del espacio de nombres IronPdf.Rendering para las clases de encabezado/pie de página.
Notas de migración críticas
No requiere servidor
IronPDF se ejecuta en proceso, sin necesidad de configurar un servidor Java:
// PDFreactor: Requires server connection
var pdfReactor = new PDFreactor("http://localhost:9423");
// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();// PDFreactor: Requires server connection
var pdfReactor = new PDFreactor("http://localhost:9423");
// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();CSS Paged MediaaIronPDFAPI
Sustituir las reglas CSS @page por RenderingOptions:
// PDFreactorCSS: @page { @bottom-center { content: 'Page ' counter(page); } }
//IronPDFequivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};// PDFreactorCSS: @page { @bottom-center { content: 'Page ' counter(page); } }
//IronPDFequivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};Sintaxis del marcador de posición del número de página
// PDFreactorCSS: counter(page)
// IronPDF: {page}
// PDFreactorCSS: counter(pages)
// IronPDF: {total-pages}// PDFreactorCSS: counter(page)
// IronPDF: {page}
// PDFreactorCSS: counter(pages)
// IronPDF: {total-pages}Cambio en la gestión de resultados
El patrón Configuración + Resultado se convierte directamente en PdfDocument:
// PDFreactor: Configuration → Convert → Result → bytes
Result result = pdfReactor.Convert(config);
byte[] bytes = result.Document;
File.WriteAllBytes("output.pdf", bytes);
// IronPDF: Direct PdfDocument with built-in methods
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or: byte[] bytes = pdf.BinaryData;// PDFreactor: Configuration → Convert → Result → bytes
Result result = pdfReactor.Convert(config);
byte[] bytes = result.Document;
File.WriteAllBytes("output.pdf", bytes);
// IronPDF: Direct PdfDocument with built-in methods
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or: byte[] bytes = pdf.BinaryData;Cambio de unidades de margen
PDFreactor utiliza cadenas;IronPDFutiliza milímetros:
// PDFreactor: config.PageMargins.Top = "1in"
// IronPDF: renderer.RenderingOptions.MarginTop = 25.4 // 1 inch in mm// PDFreactor: config.PageMargins.Top = "1in"
// IronPDF: renderer.RenderingOptions.MarginTop = 25.4 // 1 inch in mmNuevas capacidades tras la migración
Después de migrar a IronPDF, obtendrá capacidades que PDFreactorno puede proporcionar:
Fusión de PDF
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");Marcas de agua
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");Extracción de texto
string text = pdf.ExtractAllText();string text = pdf.ExtractAllText();Protección con contraseña
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";Resumen comparativo de características
| Característica | PDFreactor | IronPDF |
|---|---|---|
| HTML a PDF | ✓ | ✓ |
| URL a PDF | ✓ | ✓ |
| Encabezados/pies de página | CSS Paged Media | API nativa |
| Configuración de la página | ✓ | ✓ |
| Soporte de JavaScript | ✓ | ✓ |
| .NET nativo | ✗ | ✓ |
| En proceso | ✗ | ✓ |
| Fusionar PDF | ✗ | ✓ |
| Dividir PDF | ✗ | ✓ |
| Marcas de agua | ✗ | ✓ |
| Extracción de Texto | ✗ | ✓ |
| Relleno de formularios | ✗ | ✓ |
| Firmas digitales | ✗ | ✓ |
Lista de comprobación de la migración
Pre-Migración
- Inventariar todo el uso de PDFreactoren el código base
- Documentar todas las reglas CSS Paged Mediautilizadas
- Tenga en cuenta todos los ajustes de configuración (márgenes, tamaño de página, JavaScript)
- Planifique el almacenamiento de la clave de licencia deIronPDF(se recomiendan variables de entorno)
- Pruebe primero con la licencia de prueba de IronPDF
Cambios en el paquete
- Eliminar el paquete NuGet de
PDFreactor.NET - Eliminar el paquete NuGet
PDFreactor.Native.Windows.x64 - Instalar el paquete NuGet
IronPdf:dotnet add package IronPdf
Cambios de código
- Actualizar las importaciones del espacio de nombres (
using RealObjects.PDFreactor;→using IronPdf;) - Agregar
using IronPdf.Rendering;para clases de encabezado/pie de página - Reemplazar la clase
PDFreactorconChromePdfRenderer - Convertir objetos
Configuraciónen propiedadesRenderingOptions - Reemplace
config.Document = htmlconrenderer.RenderHtmlAsPdf(html) - Reemplace
config.Document = urlconrenderer.RenderUrlAsPdf(url) - Reemplace
File.WriteAllBytes(path, result.Document)conpdf.SaveAs(path) - Convertir reglas CSS
@pageen objetosTextHeader/TextFooter - Actualizar los marcadores de posición de número de página (
counter(page)→{page}) - Convertir unidades de margen de cadenas a milímetros
Migración de infraestructuras
- Eliminar el requisito de tiempo de ejecución de Java
- Desmantelar el servidor PDFreactor
- Actualizar las configuraciones de implementación/Docker
- Actualizar los pipelines de CI/CD
Posmigración
- Comprobar que la calidad del PDF se ajusta a las expectativas
- Verificar la representación del encabezado/pie de página
- Verificar la ejecución de JavaScript si se utiliza
- Agregue nuevas capacidades (fusión, marcas de agua, seguridad) según sea necesario






