Saltar al pie de página
GUíAS DE MIGRACIóN

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:

  1. Se requiere Java Runtime: requiere la instalación de JRE/JDK en todos los servidores.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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/AspectoPDFreactorIronPDF
Librería .NET nativaNo (basado en Java)
RuntimeJava (servidor externo).NET nativo (en proceso)
ArquitecturaServicio API RESTBiblioteca NuGet
DespliegueJava + configuración del servidorPaquete NuGet único
DependenciasJRE + cliente HTTPAutocontenido
LatenciaRed de ida y vueltaLlamadas directas a métodos
Capacidad multiplataformaSí (depende de Java)Sí (incluido Chromium)
Soporte CSSCompatibilidad avanzada con CSS3, CSS Paged MediaCompatibilidad completa con HTML5/CSS3
Complejidad de ImplementaciónMás complejo debido a JavaSencillo, se integra directamente con .NET
Funciones de manipulación de PDFBá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

  1. Entorno .NET: .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acceso a NuGet: Capacidad para instalar paquetes NuGet
  3. 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 IronPdf
SHELL

Configuració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");
$vbLabelText   $csharpLabel

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";
$vbLabelText   $csharpLabel

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" .
SHELL

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;
$vbLabelText   $csharpLabel

Asignaciones de clases principales

PDFreactorIronPDFNotas
PDFreactor<código>ChromePdfRenderer</códigoClase principal de conversión
Configuración<código>ChromePdfRenderOptions</códigoAjustes PDF
ResultadoDocumento PDFDocumento de salida
config.Document = htmlrenderer.RenderHtmlAsPdf(html)Entrada HTML
resultado.Document (byte[])<código>pdf.BinaryData</códigoBytes en bruto

Mapeo de propiedades de configuración

Configuración de PDFreactorOpciones de renderizado de IronPDFNotas
config.Document = htmlrenderer.RenderHtmlAsPdf(html)Contenido HTML
config.Document = url<código>renderer.RenderUrlAsPdf(url)</códigoConversión de URL
config.PageFormat = PageFormat.A4<código>RenderingOptions.PaperSize = PdfPaperSize.A4</códigoTamaño del papel
<código>config.PageOrientation</código<código>RenderingOptions.PaperOrientation</códigoOrientación
<código>config.PageMargins</código<código>RenderingOptions.MarginTop/Bottom/Left/Right</códigoMárgenes (mm)
config.EnableJavaScript = true<código>RenderingOptions.EnableJavaScript = true</códigoEjecución JS
<código>config.AddUserStyleSheet(css)</códigoInsertar CSS en HTMLInyección de CSS
<código>config.Title</código<código>pdf.MetaData.Title</códigoMetadatos
<código>config.Encryption</código<código>pdf.SecuritySettings</códigoSeguridad

Nuevas funciones no disponibles en PDFreactor

Características de IronPDFDescripción
PdfDocument.Merge()Combinar varios PDF
<código>pdf.ApplyWatermark()</códigoAñadir marcas de agua
<código>pdf.ExtractAllText()</códigoExtracción de texto
<código>pdf.Form</códigoRelleno de formularios
<código>pdf.Sign()</códigoFirmas 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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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();
$vbLabelText   $csharpLabel

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}" 
};
$vbLabelText   $csharpLabel

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}
$vbLabelText   $csharpLabel

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;
$vbLabelText   $csharpLabel

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 mm
$vbLabelText   $csharpLabel

Nuevas 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");
$vbLabelText   $csharpLabel

Marcas de agua

pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
$vbLabelText   $csharpLabel

Extracción de texto

string text = pdf.ExtractAllText();
string text = pdf.ExtractAllText();
$vbLabelText   $csharpLabel

Protección con contraseña

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
$vbLabelText   $csharpLabel

Resumen comparativo de características

CaracterísticaPDFreactorIronPDF
HTML a PDF
URL a PDF
Encabezados/pies de páginaCSS Paged MediaAPI 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 PDFreactorcon ChromePdfRenderer
  • Convertir objetos Configuraciónen propiedades RenderingOptions
  • Reemplace config.Document = htmlcon renderer.RenderHtmlAsPdf(html)
  • Reemplace config.Document = urlcon renderer.RenderUrlAsPdf(url)
  • Reemplace File.WriteAllBytes(path, result.Document) con pdf.SaveAs(path)
  • Convertir reglas CSS @page en objetos TextHeader / 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

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más