IRONSOFTWAREHOME
VIDEOS

Cómo insertar caracteres UTF-8 en archivos PDF usando C#

Curtis Chau
Curtis Chau
Updated: 19 de julio de 2026

La migración de PDF Duo .NETa IronPDF traslada su flujo de trabajo PDF .NET de una biblioteca oscura y mal documentada con un estado de mantenimiento poco claro a una solución estable, bien documentada y mantenida activamente. Para los ISVs españoles, esta migración es urgente: el régimen VeriFactu (Real Decreto-Ley 15/2025) exige que el software de facturación electrónica use motores PDF actualizados y sin vulnerabilidades conocidas. Una biblioteca con motor de renderizado desconocido y sin actualizaciones desde 2019 no puede garantizar la generación correcta de facturas con leyenda VERI*FACTU, CSS3 moderno para el QR de la AEAT ni firma TicketBAI XAdES. Las penalizaciones para proveedores de software no conformes alcanzan los 150.000 €/año.

Por qué migrar de PDF Duo a IronPDF

El problema del riesgo del dúo PDF

PDF Duo .NET es una biblioteca escurridiza y menos conocida del ecosistema .NET. Si bien puede haber atraído a los desarrolladores que buscan simplicidad, la oscuridad de la biblioteca presenta desafíos significativos para las aplicaciones de producción:

  1. Procedencia poco clara: Desarrollador desconocido sin respaldo empresarial verificable. No hay repositorio visible en GitHub ni código fuente, las estadísticas de descarga de NuGet son limitadas y las condiciones de licencia inciertas.

  2. Documentación faltante: es casi imposible encontrar información confiable. No existe ninguna referencia oficial de la API, los ejemplos de la comunidad son escasos y no hay tutoriales ni guías oficiales. Cualquier intento de utilizar PDF Duo se ve obstaculizado por la escasez de documentación fiable.

  3. Estado abandonado o inactivo: Los signos de negligencia son evidentes con actualizaciones esporádicas o nulas. Los foros de soporte muestran mensajes de 2019 sin respuesta. El riesgo muy real de abandono compromete su viabilidad para proyectos significativos.

  4. Funciones limitadas: solo funcionalidad básica: HTML simple a PDF y fusión básica de PDF sin funciones avanzadas como formularios, seguridad o marcas de agua.

  5. Motor de renderizado desconocido: no hay transparencia sobre lo que hay debajo del capó. Se desconoce la compatibilidad con CSS/JavaScript, la calidad de representación es impredecible y la compatibilidad con las funciones web modernas es incierta.

  6. Riesgo de soporte: No hay recurso cuando las cosas se rompen. No hay soporte profesional, ni comunidad que ayude, y el riesgo de abandono es total.

Comparación entre PDF Duo e IronPDF

AspectoPDF Duo .NETIronPDF
MantenimientoDesconocido/InactivoActualizaciones activas y regulares
DocumentaciónEscaso/faltaCompleto
SoporteNingunoEquipo de asistencia profesional
Comunidad~0 usuarios41M+ descargas de NuGet
TraducciónMotor desconocidoChromium moderno
CaracterísticasBásicoCon todas las funciones
EstabilidadDesconocidoProbado en producción
LicenciasPoco claroTransparente

Para los equipos que planean la adopción de .NET 10 y C# 14 hasta 2025 y 2026,IronPDF proporciona una base estable con un desarrollo activo y una documentación completa, eliminando las incertidumbres de depender de una biblioteca abandonada.


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 PDF Duo .NET(if you can find the correct package name)
dotnet remove package PDFDuo.NET
dotnet remove package PDFDuo
dotnet remove package PDF-Duo

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuración de licencias

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Identificar el uso de PDF Duo

# Find all PDF Duo references
grep -r "PDFDuo\|HtmlToPdfConverter\|PdfMerger" --include="*.cs" .
SHELL

Referencia completa de la API

Cambios en el espacio de nombres

PDF Duo .NETIronPDF
using PDFDuo;using IronPdf;
using PDFDuo.Document;using IronPdf;
using PDFDuo.Rendering;using IronPdf.Rendering;
using PDFDuo.Settings;using IronPdf;

Conversión de HTML a PDF

PDF Duo .NETIronPDF
new HtmlToPdfConverter()new ChromePdfRenderer()
converter.ConvertHtmlString(html, path)renderer.RenderHtmlAsPdf(html).SaveAs(path)
converter.ConvertUrl(url, path)renderer.RenderUrlAsPdf(url).SaveAs(path)
converter.ConvertFile(htmlPath, pdfPath)renderer.RenderHtmlFileAsPdf(htmlPath).SaveAs(pdfPath)

Configuración de páginas

PDF Duo .NETIronPDF
settings.PageSize = PageSize.A4RenderingOptions.PaperSize = PdfPaperSize.A4
settings.PageSize = PageSize.LetterRenderingOptions.PaperSize = PdfPaperSize.Letter
settings.Orientation = LandscapeRenderingOptions.PaperOrientation = Landscape
new Margins(top, right, bottom, left)Propiedades de los márgenes individuales

Marcadores

PDF Duo .NETIronPDF
new Margins(top, right, bottom, left)Propiedades individuales
margins.TopRenderingOptions.MarginTop
margins.RightRenderingOptions.MarginRight
margins.BottomRenderingOptions.MarginBottom
margins.LeftRenderingOptions.MarginLeft

Mapeo de operaciones documentales

PDF Duo .NETIronPDF
PDFDocument.Load(path)PdfDocument.FromFile(path)
document.Save(path)pdf.SaveAs(path)
document.ToBytes()pdf.BinaryData
new PdfMerger()PdfDocument.Merge()
merger.AddFile(path)PdfDocument.FromFile(path)
merger.Merge(output)merged.SaveAs(output)

Nuevas funciones no disponibles en PDF Duo

CaracterísticaIronPDF
Encabezados/pies de páginaRenderingOptions.HtmlHeader, HtmlFooter
Números de página{page}, {total-pages} marcadores de posición
Marcas de aguapdf.ApplyWatermark(html)
Protección mediante contraseñapdf.SecuritySettings
Relleno de formulariospdf.Form.Fields
Firmas digitalespdf.SignWithFile()
Extracción de textopdf.ExtractAllText()
PDF a imagenpdf.RasterizeToImageFiles()

Ejemplos de migración de código

Ejemplo 1: Conversión de HTML a PDF

Antes (PDF Duo):

// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
        converter.ConvertHtmlString(htmlContent, "output.pdf");
        Console.WriteLine("PDF created successfully!");
    }
}

Después (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully!");
    }
}

La diferencia fundamental en este caso es el modelo de API. HtmlToPdfConverter.ConvertHtmlString() de PDF Duo toma la ruta HTML y la ruta de salida en una sola llamada, manejando la conversión y el guardado juntos. ChromePdfRenderer.RenderHtmlAsPdf() de IronPDF devuelve primero un objeto PdfDocument, que luego se guarda con SaveAs().

Este enfoque orientado a objetos ofrece ventajas significativas: puede manipular el PDF (añadir marcas de agua, fusionar documentos, añadir seguridad, extraer texto) antes de guardarlo, nada de lo cual es posible con el enfoque directo a archivo de PDF Duo. Consulte la documentación HTML a PDF para obtener más opciones de conversión.

Ejemplo 2: Conversión de URL a PDF

Antes (PDF Duo):

// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.ConvertUrl("https://www.example.com", "webpage.pdf");
        Console.WriteLine("Webpage converted to PDF!");
    }
}

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");
        Console.WriteLine("Webpage converted to PDF!");
    }
}

PDF Duo utiliza la misma clase HtmlToPdfConverter para la conversión de URL con ConvertUrl(url, outputPath).IronPDF utiliza ChromePdfRenderer con el método dedicado RenderUrlAsPdf(url), devolviendo un objeto PdfDocument.

Una ventaja clave es que el motor de renderizado basado en Chromium de IronPDFproporciona compatibilidad moderna con CSS3 y JavaScript, mientras que el motor de renderizado desconocido de PDF Duo hace que la compatibilidad con CSS/JavaScript sea incierta y la calidad de renderizado impredecible. Más información sobre Conversión de URL a PDF.

Ejemplo 3: Fusión de PDF

Antes (PDF Duo):

// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;

class Program
{
    static void Main()
    {
        var merger = new PdfMerger();
        merger.AddFile("document1.pdf");
        merger.AddFile("document2.pdf");
        merger.Merge("merged.pdf");
        Console.WriteLine("PDFs merged successfully!");
    }
}

Después (IronPDF):

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

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
        Console.WriteLine("PDFs merged successfully!");
    }
}

Este ejemplo muestra una diferencia arquitectónica fundamental. PDF Duo utiliza una clase dedicada PdfMerger con un método AddFile() para poner en cola los archivos y luego Merge() para combinarlos y guardarlos en un solo paso.

IronPDF utiliza un patrón diferente: carga cada PDF como un PdfDocument usando PdfDocument.FromFile(), luego usa el método estático PdfDocument.Merge() para combinarlos. Esto devuelve un nuevo objeto PdfDocument que se guarda por separado con SaveAs().

El enfoque de IronPDF ofrece más flexibilidad: puede manipular cualquiera de los PDF antes de fusionarlos, añadir marcas de agua al resultado fusionado, aplicar ajustes de seguridad, etc. Para fusionar muchos archivos, puede utilizar LINQ:

var paths = new[] { "document1.pdf", "document2.pdf", "document3.pdf" };
var pdfs = paths.Select(PdfDocument.FromFile).ToList();
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");

Más información sobre mezclar y dividir archivos PDF.


Nuevas capacidades tras la migración

Tras migrar a IronPDF, obtendrá funciones que PDF Duo sencillamente no puede ofrecerle:

Cabeceras y pies de página con números de página

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:10px;'>Company Report</div>",
    MaxHeight = 25
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");

PDF Duo no admite encabezados ni pies de página; no existe una funcionalidad equivalente.IronPDFes totalmente compatible con HTML/CSS e incorpora marcadores de posición para contenido dinámico, como números de página. Consulte la guía encabezados y pies de página.

Marcas de agua

using IronPdf;
using IronPdf.Editing;

var pdf = PdfDocument.FromFile("document.pdf");

pdf.ApplyWatermark(
    "<h1 style='color:red; opacity:0.3;'>CONFIDENTIAL</h1>",
    45,
    VerticalAlignment.Middle,
    HorizontalAlignment.Center);

pdf.SaveAs("watermarked.pdf");

PDF Duo no admite marcas de agua.IronPDF proporciona marcas de agua basadas en HTML con soporte completo de estilos CSS.

Protección con contraseña

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("secured.pdf");

PDF Duo no admite protección por contraseña ni ajustes de seguridad.

Extracción de texto

var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();

PDF Duo no admite la extracción de texto.


Notas de migración críticas

Objeto de los márgenes a las propiedades individuales

PDF Duo utiliza un único objeto Margins;IronPDF utiliza propiedades individuales:

// PDF Duo:
new Margins(top: 20, right: 15, bottom: 20, left: 15)

// IronPDF:
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginRight = 15;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 15;

Nombres de métodos de ahorro

Diferentes nombres de métodos para guardar:

// PDF Duo:
document.Save("output.pdf");

// IronPDF:
pdf.SaveAs("output.pdf");

Carga de PDF

Diferentes nombres de métodos de carga:

// PDF Duo:
PDFDocument.Load("document.pdf")

// IronPDF:
PdfDocument.FromFile("document.pdf")

Configuración de objetos a propiedades

PDF Duo utiliza objetos de configuración pasados al constructor;IronPDF utiliza propiedades:

// PDF Duo:
var settings = new PDFSettings { PageSize = PageSize.A4 };
var converter = new HtmlToPdfConverter(settings);

// IronPDF:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

Comparación de características

CaracterísticaPDF Duo .NETIronPDF
HTML a PDFBásicoCSS3 completo, JavaScript
URL a PDFBásicoCompleto con soporte auth
Fusión de PDF
Encabezados/pies de páginaNoCompatibilidad total con HTML
Números de páginaNoMarcadores de posición incorporados
Marcas de aguaNoBasado en HTML
Protección por contraseñaNoOpciones de seguridad completas
Relleno de formulariosNo
Firmas digitalesNo
Extracción de TextoNo
PDF a imágenesNo
Soporte de AsyncDesconocidoAsync/await completo
.NET Core/5+DesconocidoSe admite

Lista de comprobación de la migración

Pre-Migración

  • Encuentra todas las referencias de PDF Duo en el código base
  • Configuraciones actuales del documento (tamaño de página, márgenes, etc.)
  • Enumere todas las operaciones PDF utilizadas
  • Identificar oportunidades para nuevas funciones (encabezados, marcas de agua, seguridad)
  • Obtener la clave de licencia de IronPDF

Cambios en el paquete

  • Eliminar el paquete NuGet PDFDuo.NET
  • Instalar IronPdf paquete NuGet : dotnet add package IronPdf
  • Actualizar las importaciones de espacios de nombres de using PDFDuo; a using IronPdf;

Cambios de código

  • Agregar configuración de clave de licencia al inicio
  • Reemplace HtmlToPdfConverter con ChromePdfRenderer
  • Reemplace ConvertHtmlString(html, path) con RenderHtmlAsPdf(html).SaveAs(path)
  • Reemplace ConvertUrl(url, path) con RenderUrlAsPdf(url).SaveAs(path)
  • Reemplace el patrón PdfMerger con el patrón PdfDocument.Merge()
  • Convertir el objeto Margins en propiedades de margen individuales
  • Reemplace Save() con SaveAs()
  • Reemplace Load() con FromFile()

Posmigración

  • Ejecutar pruebas de regresión comparando la salida PDF
  • Verificar que los tamaños de página y los márgenes coincidan
  • Pruebe con HTML/CSS complejo (el motor moderno de IronPDF debería manejarlo mejor)
  • Agregar nuevas funciones (encabezados, pies de página, marcas de agua, seguridad)
  • Actualización de la documentación

Contexto regulatorio español: riesgo de biblioteca abandonada en flujos VeriFactu

Para los ISVs españoles, utilizar PDF Duo .NET en sistemas de facturación electrónica en 2026 presenta riesgos regulatorios que van más allá del mantenimiento técnico. El régimen VeriFactu exige motores PDF actualizados con CSS3 moderno; una biblioteca sin actualizaciones desde 2019 no puede garantizar conformidad.

Por qué PDF Duo no es apto para VeriFactu

El régimen VeriFactu (Real Decreto-Ley 15/2025) requiere:

  1. Leyenda VERI*FACTU: La factura debe incluir el texto VERI*FACTU o Factura verificable en la sede electrónica de la AEAT con maquetación CSS3 (Flexbox/Grid). El motor desconocido de PDF Duo no garantiza este renderizado.
  2. QR de la AEAT: El código QR de verificación requiere renderizado preciso de imágenes. La calidad de renderizado de PDF Duo es impredecible.
  3. Firma TicketBAI: La firma digital XAdES para TicketBAI (Bizkaia, Gipuzkoa, Araba) requiere soporte explícito de firma PDF que PDF Duo no tiene.
  4. Auditabilidad: Usar una biblioteca sin soporte activo en una cadena regulada VeriFactu crea riesgo de auditoría ante la AEAT.

Generación de factura VeriFactu con IronPDF

using IronPdf;

var renderer = new ChromePdfRenderer();
var html = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .factura-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='factura-header'>
        <strong>FACTURA Nº 2026-0001</strong>
        <span>Fecha: 20/05/2026</span>
    </div>
    <table>
        <tr><th>Concepto</th><th>Total</th></tr>
        <tr><td>Servicio de desarrollo .NET</td><td>2.420,00 €</td></tr>
    </table>
    <!-- Leyenda obligatoria VeriFactu (RDL 15/2025) -->
    <div class='verifactu-legend'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT]
    </div>
</body>
</html>";

// Motor Chromium moderno — renderizado CSS3 garantizado
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0001.pdf");
C#

Lista de comprobación de conformidad VeriFactu post-migración

  • Eliminar dependencia de PDF Duo .NET del proyecto
  • Implementar leyenda VERI*FACTU en plantillas de facturas
  • Añadir QR de la AEAT con URL de verificación de la AEAT
  • Verificar renderizado CSS3 Flexbox de la cabecera de factura
  • Configurar firma TicketBAI XAdES si el cliente opera en País Vasco (Bizkaia, Gipuzkoa, Araba)
  • Integrar Facturae XML para envío a FACe si procede

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