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

Cómo migrar de PrinceXML a IronPDF en C#

Migrar de PrinceXMLa IronPDF: Guía completa de migración a C

La migración de PrinceXMLaIronPDFtransforma su flujo de trabajo de generación de PDF de un proceso de línea de comandos externo a una biblioteca .NET nativa. Esta guía proporciona una ruta de migración completa, paso a paso, que elimina la sobrecarga de gestión de procesos, simplifica la implementación y proporciona amplias capacidades de manipulación de PDF más allá de la generación.

Por qué migrar de PrinceXMLa IronPDF

Entender PrinceXML

PrinceXML es una sofisticada herramienta diseñada para convertir contenidos HTML en documentos PDF perfectos para la impresión gracias a su compatibilidad con las especificaciones CSS Paged Media. Esta especialización permite a PrinceXMLrenderizar documentos con gran fidelidad a los diseños de impresión previstos, un atributo valioso para sectores que requieren un estilo de impresión detallado, como el editorial o la documentación jurídica.

Sin embargo, PrinceXMLno es una biblioteca .NET y funciona como una herramienta de línea de comandos independiente, lo que puede complicar la integración para entornos que prefieren soluciones .NET puras. Su dependencia de un proceso de servidor independiente implica una gestión adicional de los recursos del sistema y una complejidad potencialmente mayor para la implantación de los proyectos.

El problema del proceso externo

PrinceXML funciona como un ejecutable de línea de comandos independiente que crea importantes retos arquitectónicos para las aplicaciones .NET:

  1. Gestión de procesos: Debe generar, supervisar y finalizar procesos externos.

  2. Sin integración .NET nativa: Comunicarse a través de stdin/stdout o archivos temporales.

  3. Complejidad de despliegue: Requiere la instalación de Prince en cada servidor.

  4. Licencia por servidor: Cada implementación necesita una licencia independiente ($495+).

  5. Dificultad en el manejo de errores: Analizar la salida de texto para detectar errores.

  6. No Async/Await: Se requieren llamadas de bloqueo o envolturas async complejas.

  7. Dependencias de ruta: Debe localizar el ejecutable Prince en PATH o ruta absoluta.

Comparación entre PrinceXMLe IronPDF

AspectoPrinceXMLIronPDF
ArquitecturaProceso externoBiblioteca .NET nativa
IntegraciónLínea de comandosAPI directa
DespliegueInstalar en todos los servidoresPaquete NuGet único
Manejo de erroresAnálisis de textoexcepciones de .NET
Soporte AsyncEnvoltorios manualesAsync/await nativo
Manipulación de PDFSólo generaciónManipulación completa (combinar, dividir, editar)
LicenciasPor servidor ($495+)Por desarrollador
ActualizacionesReinstalación manualActualización de NuGet
DepuraciónDifícilCompatibilidad total con depuradores
Firmas digitalesNo
FormulariosNo
Soporte DockerComplejoSimple
Funciones en la nubeDifícilFácil

IronPDF ofrece una alternativa con sus capacidades nativas .NET, que van más allá de la mera conversión de HTML a PDF para incluir tareas avanzadas de manipulación de PDF, como edición, fusión y firmas digitales. La API deIronPDFestá diseñada para ofrecer simplicidad y facilidad de uso, permitiendo a los desarrolladores realizar conversiones y manipulaciones con un mínimo de código repetitivo.

Para los equipos que planifican la adopción de .NET 10 y C# 14 hasta 2025 y 2026, la perfecta implementación deIronPDFno requiere dependencias externas ni procesos de servidor, por lo que alivia la carga de la integración en .NET Framework.


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 IronPDF: Obtenga su clave de licencia en ironpdf.com

Cambios en el paquete NuGet

# Install IronPDF
dotnet add package IronPdf

# Remove Prince wrapper if using one
dotnet remove package PrinceXMLWrapper
# Install IronPDF
dotnet add package IronPdf

# Remove Prince wrapper if using one
dotnet remove package PrinceXMLWrapper
SHELL

Configuración de licencias

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Buscar uso de PrinceXML

# Find Prince process calls
grep -r "prince" --include="*.cs" .
grep -r "Process.Start" --include="*.cs" . | grep -i prince
grep -r "@page" --include="*.css" .
grep -r "prince-" --include="*.css" .
# Find Prince process calls
grep -r "prince" --include="*.cs" .
grep -r "Process.Start" --include="*.cs" . | grep -i prince
grep -r "@page" --include="*.css" .
grep -r "prince-" --include="*.css" .
SHELL

Referencia completa de la API

Cambios en el espacio de nombres

// Before: PrinceXML
using PrinceXMLWrapper;
using System.Diagnostics;
using System.IO;

// After: IronPDF
using IronPdf;
// Before: PrinceXML
using PrinceXMLWrapper;
using System.Diagnostics;
using System.IO;

// After: IronPDF
using IronPdf;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Mapeo de línea de comandos a método

Comando PrinceEquivalente de IronPDF
prince input.html -o output.pdfrenderer.RenderHtmlFileAsPdf("input.html").SaveAs("output.pdf")
prince --style=custom.css input.htmlIncluir CSS en HTML o utilizar RenderingOptions
prince --javascriptrenderer.RenderingOptions.EnableJavaScript = true
prince --no-javascriptrenderer.RenderingOptions.EnableJavaScript = false
prince --page-size=Carta<código>renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter</código
prince --page-margin=1inrenderer.RenderingOptions.MarginTop = 72 (72 puntos = 1 pulgada)
prince --encrypt<código>pdf.SecuritySettings.OwnerPassword = "..."</código
prince --user-password=pw<código>pdf.SecuritySettings.UserPassword = "pw"</código
prince --disallow-print<código>pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint</código
prince --disallow-copy<código>pdf.SecuritySettings.AllowUserCopyPasteContent = false</código
prince --baseurl=http://...renderer.RenderingOptions.BaseUrl = new Uri("http://...")
prince --media=printrenderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
prince --media=screenrenderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen

CSS @page a RenderingOptions Mapping

Propiedad CSS @pageEquivalente de IronPDF
<código>tamaño: A4<código>TamañoPapel = PdfPaperSize.A4</código
<código>tamaño: Carta<código>TamañoPapel = PdfPaperSize.Letter</código
<código>tamaño: A4apaisadoTamañoPapel = PdfPaperSize.A4 + OrientaciónPapel = Horizontal
margen: 2cmMargenTop/Bottom/Izquierda/Derecha = 56
margen superior: 1inMargenTop = 72
@top-center { content: "..." }HtmlHeader con div centrado
@bottom-right { content: counter(page) }HtmlFooter con marcador de posición {page}

Conversiones de tamaño de página

TamañoPuntosMilímetros
Carta612 x 792216 x 279
A4595 x 842210 x 297
Aviso legal612 x 1008216 x 356
2,5 cm7225.4
1 cm28.3510

Ejemplos de migración de código

Ejemplo 1: Conversión de un archivo HTML a PDF

Antes (PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("input.html", "output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("input.html", "output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Este ejemplo demuestra la diferencia arquitectónica fundamental. PrinceXMLrequiere instanciar un objeto Prince con la ruta completa al ejecutable ("C:³³ Files³ Files³ Files³ Files.exe") y, a continuación, llamar a Convert() con las rutas de entrada y salida.

IronPDF elimina por completo las dependencias de rutas: cree un ChromePdfRenderer, llame a RenderHtmlFileAsPdf() con la ruta del archivo HTML y SaveAs() para escribir el resultado. No hay rutas ejecutables, ni gestión de procesos, ni dependencias de rutas. Consulte la documentación HTML a PDF para ver ejemplos completos.

Ejemplo 2: Conversión de URL a PDF con opciones

Antes (PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.SetJavaScript(true);
        prince.SetEncrypt(true);
        prince.SetPDFTitle("Website Export");
        prince.Convert("https://example.com", "webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.SetJavaScript(true);
        prince.SetEncrypt(true);
        prince.SetPDFTitle("Website Export");
        prince.Convert("https://example.com", "webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.PdfTitle = "Website Export";

        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.Encrypt("password");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.PdfTitle = "Website Export";

        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.Encrypt("password");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Este ejemplo muestra cómo las opciones de PrinceXMLse corresponden con las propiedades de IronPDF. PrinceXMLutiliza métodos setter (SetJavaScript(), SetEncrypt(), SetPDFTitle()) antes de la conversión.IronPDFutiliza propiedades RenderingOptions para la configuración previa al renderizado y métodos posteriores al renderizado como Encrypt() en el objeto PdfDocument.

Asignaciones clave:

  • prince.SetJavaScript(true)renderer.RenderingOptions.EnableJavaScript = true
  • prince.SetPDFTitle("...")renderer.RenderingOptions.PdfTitle = "..."
  • prince.SetEncrypt(true)pdf.Encrypt("password") (IronPDF requiere una contraseña)

Más información en nuestros tutoriales.

Ejemplo 3: Conversión de cadenas HTML a PDF

Antes (PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
        File.WriteAllText("temp.html", html);

        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("temp.html", "styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
        File.WriteAllText("temp.html", html);

        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("temp.html", "styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Este ejemplo pone de relieve una diferencia fundamental: PrinceXMLrequiere la entrada de archivos, por lo que debe crear un archivo temporal (File.WriteAllText("temp.html", html)) antes de la conversión. RenderHtmlAsPdf() deIronPDFacepta cadenas HTML directamente, sin archivos temporales, sin código de limpieza, sin sobrecarga de E/S de disco.


Migración de medios paginados CSS

Aunque la compatibilidad con CSS Paged Mediade PrinceXMLes potente, crea un bloqueo de proveedor con CSS específico de Prince que no funcionará en ningún otro sitio:

PrinceXML CSS:

@page {
    size: A4;
    margin: 2cm;
    @top-center {
        content: "Document Title";
    }
    @bottom-right {
        content: counter(page);
    }
}

/* Prince-specific extensions */
prince-pdf-page-label: "Chapter " counter(chapter);
prince-pdf-destination: attr(id);

IronPDF C# (equivalente):

renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 56;    // ~2cm
renderer.RenderingOptions.MarginBottom = 56;
renderer.RenderingOptions.MarginLeft = 56;
renderer.RenderingOptions.MarginRight = 56;

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
    MaxHeight = 40
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 56;    // ~2cm
renderer.RenderingOptions.MarginBottom = 56;
renderer.RenderingOptions.MarginLeft = 56;
renderer.RenderingOptions.MarginRight = 56;

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
    MaxHeight = 40
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Problemas comunes de migración de CSS

Cuestión 1: La @página CSS no funciona

IronPDF utiliza Chromium, que tiene una compatibilidad limitada con @page. Convertir reglas CSS en RenderingOptions.

Asunto 2: Faltan cuadros de margen de página

Los cuadros de margen CSS (@top-center, @bottom-right) son específicos de Prince. Utilice HtmlHeader/HtmlFooter en su lugar.

Asunto 3: string-set/content no funciona

La propiedad CSS string-set es específica de Prince. Utilice el marcador de posición {html-title} de la etiqueta <title>:

<title>Chapter 1: Introduction</title>
<title>Chapter 1: Introduction</title>
HTML
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div>{html-title}</div>"
};
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div>{html-title}</div>"
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Edición 4: contador (páginas) incorrecto

Utilice el marcador de posición {total-pages} deIronPDFen lugar de contadores CSS.


Comparación de prestaciones

OperaciónPrinceXMLIronPDFNotas
HTML sencillo~400ms~300msIronPDFen proceso
CSS complejo~600ms~400msSin sobrecarga de procesos
Páginas de JavaScriptLimitado~500msCompatibilidad total con JS
Documentos de gran tamaño~1500ms~1000msMejor memoria
Concurrente (10)~4000ms~1500msGrupo de hilos
Sobrecarga inicial~200ms~50msNo se genera ningún proceso

Nuevas capacidades tras la migración

Después de migrar a IronPDF, obtendrá capacidades que PrinceXMLno puede proporcionar:

Fusión de PDF

var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Marcas de agua

pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Firmas digitales

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Relleno de formularios

var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");
var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Resumen comparativo de características

CaracterísticaPrinceXMLIronPDF
.NET nativoNo
Proceso externoRequeridoNo
Soporte de AsyncEnvoltorio del manualAsync/await nativo
CSS Paged MediaSoporte completoA través de RenderingOptions
Rejilla CSS
Flexbox
JavaScriptLimitadoES2024 completo
Generación
CombinarNo
DividirNo
EditarNo
Marcas de aguaSólo CSSHTML/CSS + API
Firmas digitalesNo
PDF/A
Cifrado
FormulariosNo
Paquete NuGetNo
Instalación del servidorRequeridoNo

Lista de comprobación de la migración

Pre-Migración

  • [ ] Identificar todas las invocaciones a la línea de comandos de Prince
  • [ ] Reglas CSS @page utilizadas
  • [ ] Lista de propiedades CSS específicas de Prince (prince-*, string-set)
  • [ ] Anote cualquier función Prince JavaScript
  • [ ] Identificar las características de PDF utilizadas (cifrado, metadatos)
  • [ ] Obtenga la clave de licencia deIronPDFen ironpdf.com

Cambios de código

  • [ ] Eliminar el paquete NuGet PrinceXMLWrapper
  • [ ] Instalar IronPdf paquete NuGet
  • [ ] Actualizar las importaciones de espacios de nombres
  • [ ] Sustituir Prince por ChromePdfRenderer
  • [ ] Sustituya prince.Convert() por RenderHtmlFileAsPdf() o RenderHtmlAsPdf()
  • [Convertir métodos setter en propiedades RenderingOptions
  • [ ] Migrar CSS de @página a RenderingOptions
  • [ ] Sustituir los cuadros de margen por HtmlHeader/HtmlFooter
  • [Convertir contadores CSS en marcadores de posición {page}/{total-pages}
  • [ ] Eliminar la gestión de archivos temporales para cadenas HTML
  • [ ] Añadir inicialización de licencia al inicio de la aplicación

Posmigración

  • [ ] Prueba de conversión de archivos HTML
  • [ ] Prueba de conversión de cadenas HTML
  • [ ] Prueba de conversión de URL
  • [ ] Comprobar que el tamaño de las páginas coincide
  • [ ] Verificación de coincidencia de márgenes
  • [ ] Encabezados y pies de página de prueba
  • [ ] Verifique los números de página
  • [Prueba de cifrado/seguridad
  • [ ] Eliminar la instalación de Prince de los servidores
  • [ ] Actualización de scripts de despliegue

Conclusión

Para los desarrolladores que trabajan en el ecosistema .NET,IronPDFofrece una solución sólida y completa. Sus amplias capacidades de manipulación y su integración simplificada lo hacen sumamente práctico para una gran variedad de casos de uso. Por otro lado, si la precisión de impresión es primordial, especialmente aprovechando las funciones CSS Paged Media, PrinceXMLsigue siendo una opción potente.

Los cambios clave en esta migración son:

  1. Arquitectura: Proceso externo de línea de comandos → Biblioteca nativa .NET
  2. Instanciación: new Prince("path/to/exe")new ChromePdfRenderer()
  3. Conversión de archivos: prince.Convert(input, output)renderer.RenderHtmlFileAsPdf(input).SaveAs(output)
  4. Cadenas HTML: Se requiere archivo temporal → Directo RenderHtmlAsPdf(html)
  5. Opciones: Métodos Setter (SetJavaScript()) → Propiedades (RenderingOptions.EnableJavaScript)
  6. CSS @page: Soporte nativo → propiedades RenderingOptions
  7. Cabeceras/Pies de página: Cajas de margen CSS → objetos HtmlHeader/HtmlFooter
  8. Números de página: Contadores CSS → {page} y {total-pages} marcadores de posición
  9. Nuevas funciones: Fusión, división, edición, marcas de agua, firmas digitales, rellenado de formularios en PDF

Explore la documentación completa de IronPDF, tutoriales y referencia de API para acelerar su migración a PrinceXML.

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