IRONSOFTWAREHOME
VIDEOS

Cómo convertir SVGs en PDF usando C#

Curtis Chau
Curtis Chau
Updated: 19 de julio de 2026

La migración de PDFreactor a IronPDF elimina 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. Para los ISVs y desarrolladores españoles que generan facturas VeriFactu, documentos TicketBAI o PDFs Facturae para FACe, la arquitectura de servidor Java de PDFreactor introduce latencia adicional en flujos críticos de cumplimiento que IronPDF elimina al ejecutarse en proceso. 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.IronPDF utiliza 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, IronPDF proporciona 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.

Contexto regulatorio español: arquitectura Java y flujos VeriFactu

Para equipos españoles, la arquitectura de PDFreactor tiene implicaciones directas en flujos de cumplimiento regulatorio:

VeriFactu (Real Decreto-Ley 15/2025): los sistemas de facturación deben generar representaciones gráficas con la leyenda VERI*FACTU o Factura verificable en la sede electrónica de la AEAT y el QR de la AEAT. Con PDFreactor, cada conversión requiere un viaje de ida y vuelta HTTP al servidor Java. En flujos de alto volumen o de baja latencia, esta arquitectura puede ser problemática. IronPDF en proceso elimina esa capa.

TicketBAI (Bizkaia, Gipuzkoa, Araba): la firma XAdES requerida por TicketBAI debe coordinarse con la generación del PDF. Con PDFreactor (servidor Java separado), la orquestación de firma + PDF requiere más componentes de infraestructura. IronPDF incluye soporte nativo de firmas digitales en el mismo proceso .NET.

Facturae XML / FACe: los PDFs que acompañan a Facturae XML en envíos B2G requieren generación confiable. La dependencia de un servidor Java externo introduce puntos de fallo adicionales en flujos críticos de envío a FACe.

Penalización de hasta 150.000 €/año: el régimen VeriFactu sanciona a proveedores no conformes. Una arquitectura simplificada con IronPDF reduce los puntos de fallo en la cadena de generación de facturas y facilita la auditoría del cumplimiento.

Ejemplo: factura VeriFactu con IronPDF (en proceso, sin servidor Java)

using IronPdf;

// IronPDF: sin servidor Java, en proceso, leyenda VERI*FACTU con CSS3
var renderer = new ChromePdfRenderer();
var html = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { display: flex; justify-content: space-between; }
        .verifactu-legend {
            border: 2px solid #003366;
            padding: 8px 12px;
            font-size: 10px;
            text-align: center;
            margin-top: 20px;
        }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
        th { background-color: #003366; color: white; }
    </style>
</head>
<body>
    <div class='header'>
        <strong>FACTURA Nº 2026-0077</strong>
        <span>Fecha: 20/05/2026</span>
    </div>
    <table>
        <tr><th>Concepto</th><th>Total</th></tr>
        <tr><td>Consultoría técnica</td><td>950,00 €</td></tr>
    </table>
    <div class='verifactu-legend'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT placeholder]
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0077.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

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
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");

IronPDF (nivel de aplicación):

// 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" .
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;

Asignaciones de clases principales

PDFreactorIronPDF
PDFreactorChromePdfRenderer
ConfigurationChromePdfRenderOptions
ResultPdfDocument
config.Document = htmlrenderer.RenderHtmlAsPdf(html)
result.Document (byte[])pdf.BinaryData

Mapeo de propiedades de configuración

Configuración de PDFreactorOpciones de renderizado de IronPDF
config.Document = htmlrenderer.RenderHtmlAsPdf(html)
config.Document = urlrenderer.RenderUrlAsPdf(url)
config.PageFormat = PageFormat.A4RenderingOptions.PaperSize = PdfPaperSize.A4
config.PageOrientationRenderingOptions.PaperOrientation
config.PageMarginsRenderingOptions.MarginTop/Bottom/Left/Right
config.EnableJavaScript = trueRenderingOptions.EnableJavaScript = true
config.AddUserStyleSheet(css)Insertar CSS en HTML
config.Titlepdf.MetaData.Title
config.Encryptionpdf.SecuritySettings

Nuevas funciones no disponibles en PDFreactor

Características de IronPDFDescripción
PdfDocument.Merge()Combinar varios PDF
pdf.ApplyWatermark()Añadir marcas de agua
pdf.ExtractAllText()Extracción de texto
pdf.FormRelleno de formularios
pdf.Sign()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);
    }
}
C#

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

La diferencia fundamental es el patrón arquitectónico. PDFreactorrequiere crear una instancia PDFreactor (que se conecta al servidor Java), un objeto Configuration separado para almacenar configuraciones y contenido HTML, llamar a Convert() que devuelve un objeto Result y, finalmente, escribir los result.Document bytes en el archivo usando File.WriteAllBytes().

IronPDF simplifica esto creando un ChromePdfRenderer, llamando a RenderHtmlAsPdf() directamente con la cadena HTML y usando el método incorporado SaveAs() en el PdfDocument devuelto. 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);
    }
}
C#

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

PDFreactor utiliza la misma propiedad config.Document tanto para cadenas HTML como para URL, determinando el tipo automáticamente.IronPDF proporciona métodos explícitos: RenderHtmlAsPdf() para cadenas HTML y RenderUrlAsPdf() para URL. 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);
    }
}
C#

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

Este ejemplo muestra la diferencia sintáctica más significativa. PDFreactorutiliza la sintaxis CSS Paged Mediacon reglas @page, regiones @bottom-center y counter(page) para los números de página inyectados a través de 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 que IronPDF también requiere importar el 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();

CSS Paged Mediaa IronPDFAPI

Reemplace las reglas CSS @page con RenderingOptions:

// 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}

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;

Cambio de unidades de margen

PDFreactor utiliza cadenas;IronPDF utiliza milímetros:

// PDFreactor: config.PageMargins.Top = "1in"
// IronPDF: renderer.RenderingOptions.MarginTop = 25.4  // 1 inch in mm

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");

Marcas de agua

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

Extracción de texto

string text = pdf.ExtractAllText();

Protección con contraseña

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";

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 de IronPDF(se recomiendan variables de entorno)
  • Pruebe primero con la licencia de prueba de IronPDF

Cambios en el paquete

  • Eliminar el paquete NuGet PDFreactor.NET
  • Eliminar el paquete NuGet PDFreactor.Native.Windows.x64
  • Instalar IronPdf el paquete NuGet : 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 las clases de encabezado/pie de página
  • Reemplace la clase PDFreactor con ChromePdfRenderer
  • Convertir objetos Configuration en propiedades RenderingOptions
  • Reemplace config.Document = html con renderer.RenderHtmlAsPdf(html)
  • Reemplace config.Document = url con renderer.RenderUrlAsPdf(url)
  • Reemplace File.WriteAllBytes(path, result.Document) con pdf.SaveAs(path)
  • Convertir reglas CSS @page en objetos 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 estructurados y visualmente atractivos.

...
Leer más

Artículos Relacionados

Key in blue circle

Obtenga su clave de prueba gratuita de 30 días al instante.

Your trial license will be sent to your email address

Sin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.

bullet_checkedNo se requiere tarjeta de crédito ni creación de cuentaSin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Reserve su Demostración en Vivo gratuita
Booking Badge

Confiado por millones de ingenieros en todo el mundo

Logos de clientes de Iron Software
Obtén tu Consulta Sin Compromiso
Completa el formulario a continuación o envía un correo a sales@ironsoftware.com
Tus detalles siempre serán mantenidos confidenciales.
Confiado por millones de ingenieros en todo el mundo
Logos de clientes de Iron Software
Obtenga su Clave de Prueba de 30 días gratis al instante.
No se requiere tarjeta de crédito ni creación de cuenta