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

VeriFactu y ComPDFKit: Migrar a IronPDF con AEAT, TicketBAI y Facturae en España

Migrar de ComPDFKit a IronPDF en el entorno de desarrollo español de 2026 no es únicamente una decisión técnica sobre API: es también una decisión regulatoria. Los equipos de desarrollo que generan documentos PDF para facturación, gestión documental o presentaciones ante la Administración Pública española necesitan evaluar si su biblioteca PDF puede cumplir con los marcos VeriFactu (Real Decreto 1007/2023), TicketBAI (Bizkaia, Gipuzkoa y Araba), Facturae y el SII de la AEAT.

Limitaciones de ComPDFKit en el ecosistema español:

  • ComPDFKit no expone soporte documentado para la generación de la leyenda VERI*FACTU ni el código QR de validación de la AEAT exigidos por VeriFactu.
  • No incluye funciones de firma PAdES conformes con eIDAS con certificados de la FNMT-RCM para la firma de facturas electrónicas.
  • Carece de soporte para exportación PDF/A-3 con incrustación de XML Facturae bajo la normativa Crea y Crece (EN 16931 / CIUS-ES).
  • Los proveedores de software de facturación que incumplan VeriFactu se exponen a sanciones de hasta 150.000 €/año impuestas directamente al ISV.

IronPDF cubre todos estos requisitos con una API .NET moderna, sin dependencias externas y con procesamiento íntegramente local que facilita el cumplimiento de la LOPDGDD y la supervisión de la AEPD.

Aunque ComPDFKit ofrece sólidas funciones de manipulación de PDF, varios factores llevan a los equipos de desarrollo en España a considerar alternativas más consolidadas.

Comparación de la madurez del mercado y el ecosistema

ComPDFKit se enfrenta a retos comunes a los nuevos participantes en el mercado: lagunas en la documentación, una comunidad más pequeña y una cobertura limitada de Stack Overflow. La década de perfeccionamiento deIronPDFproporciona la estabilidad y los recursos que requieren los proyectos empresariales.

Aspecto ComPDFKit IronPDF
HTML a PDF Requiere análisis sintáctico manual de HTML Renderizado nativo en Chromium
Madurez de mercado Nuevo participante más de 10 años de experiencia
Tamaño de la comunidad Stack Overflow más pequeño y limitado Comunidad grande y activa
Documentación Algunas lagunas Amplios tutoriales y guías
Descargas En crecimiento más de 10 millones de descargas de NuGet
Estilo API C++ influenciado, verboso API moderna y fluida de .NET
Gestión de memoria Llamadas manuales Release() Gestión automática de GC

Paridad de características

Ambas bibliotecas son compatibles con una amplia funcionalidad PDF:

Característica ComPDFKit IronPDF
HTML a PDF Básico/Manual cromo nativo
URL a PDF Implementación manual integrado
Crear PDF desde cero
Edición de PDF
Extracción de texto
Fusionar/Dividir
Firmas digitales
Relleno de formularios
Marcas de agua
Plataforma cruzada Windows, Linux, macOS Windows, Linux, macOS

Beneficios clave de la migración

  1. Representación HTML superior: el motor Chromium deIronPDFmaneja CSS3 moderno, JavaScript y diseños responsivos de forma nativa.
  2. Ecosistema maduro: más de 10 años de refinamiento, amplia documentación y estabilidad comprobada
  3. API más sencilla: menos código repetitivo, sin gestión manual de memoria con llamadas Release()
  4. Mejor integración con .NET : async/await nativo, compatibilidad con LINQ, interfaces fluidas
  5. Amplios recursos: miles de respuestas de Stack Overflow y ejemplos de la comunidad.

Contexto regulatorio español: por qué ComPDFKit no es suficiente para facturación en 2026

Para los desarrolladores de software de facturación en España, la elección de la biblioteca PDF está directamente ligada al cumplimiento normativo bajo un marco multicapa:

VeriFactu (Real Decreto 1007/2023)

El reglamento VeriFactu obliga a que cada factura generada por software de facturación incluya:

  1. La leyenda «VERI*FACTU» en texto impreso en el documento.
  2. Un código QR con URL https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=... para verificación en la sede electrónica de la AEAT.
  3. Un identificador CSV (Código Seguro de Verificación) o hash encadenado.

ComPDFKit no implementa ninguno de estos elementos de forma nativa. IronPDF permite añadirlos mediante HtmlHeaderFooter en el pie de página de cada factura.

TicketBAI (Bizkaia, Gipuzkoa y Araba)

Las tres diputaciones forales del País Vasco exigen que la representación PDF de cada factura TicketBAI incluya el código QR TicketBAI y el identificador TbaiId. Adicionalmente, el PDF debe firmarse digitalmente con PAdES (PDF Advanced Electronic Signatures) conforme a eIDAS, usando certificados de la FNMT-RCM, IZENPE u otras TSPs acreditadas. ComPDFKit no implementa firma PAdES. IronPDF lo hace mediante PdfSignature con cualquier certificado X.509.

Facturae y Crea y Crece (B2B y B2G)

La Ley Crea y Crece y el estándar Facturae 3.2.x exigen que las facturas electrónicas enviadas a través de FACe o el SII de la AEAT sean archivos XML con una representación PDF/A-3 adjunta. ComPDFKit no soporta PDF/A-3 con incrustación de XML Facturae. IronPDF exporta PdfArchiveFormat.PDF_A_3B con la opción de adjuntar el XML.

Ejemplo: Factura VeriFactu con IronPDF (NIF/CIF, AEAT, formato €ES)

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

class MigracionCompdfKitIronPdf
{
    public static void GenerarFacturaVeriFactu()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        renderer.RenderingOptions.MarginBottom = 25;

        var culture = new CultureInfo("es-ES");
        var baseImponible = 1850.00m;
        var cuotaIVA = baseImponible * 0.21m;
        var total = baseImponible + cuotaIVA;

        // Pie de página VeriFactu conforme con RD 1007/2023
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            HtmlFragment = @"
                <div style='font-family:Arial; font-size:8pt; border-top:1px solid #000; padding-top:3px;'>
                    <strong>VERI*FACTU</strong> — NIF Emisor: B12345678 — 
                    Verificable: https://www2.agenciatributaria.gob.es — 
                    SII: Remitido — FNMT-RCM: Firmado
                    <span style='float:right'>Pág. {page}/{total-pages}</span>
                </div>",
            MaxHeight = 20
        };

        var html = $@"
            <!DOCTYPE html><html lang='es'><body style='font-family:Arial; padding:20px;'>
                <h2>FACTURA ELECTRÓNICA — ComPDFKit ➜ IronPDF (Migrado)</h2>
                <table style='width:100%; border-collapse:collapse; margin-bottom:15px;'>
                    <tr><td><strong>Emisor NIF:</strong> B12345678</td>
                        <td><strong>Receptor CIF:</strong> A98765432</td></tr>
                    <tr><td><strong>Número:</strong> 2026-MIG-00001</td>
                        <td><strong>Fecha:</strong> 28/05/2026 | Período: 2T 2026</td></tr>
                </table>
                <table border='1' cellpadding='5' style='width:100%; border-collapse:collapse;'>
                    <tr><th>Descripción</th><th>Base (€)</th><th>IVA 21%</th><th>Total (€)</th></tr>
                    <tr><td>Migración ComPDFKit a IronPDF</td>
                        <td style='text-align:right'>{baseImponible.ToString("N2", culture)} €</td>
                        <td style='text-align:right'>{cuotaIVA.ToString("N2", culture)} €</td>
                        <td style='text-align:right'><strong>{total.ToString("N2", culture)} €</strong></td></tr>
                </table>
                <p style='margin-top:10px; font-size:9pt;'>
                    Facturae 3.2.2 | FACe B2G | AEAT SII | Crea y Crece | LOPDGDD conforme
                </p>
            </body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("factura_verifactu_ironpdf.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Globalization;

class MigracionCompdfKitIronPdf
{
    public static void GenerarFacturaVeriFactu()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        renderer.RenderingOptions.MarginBottom = 25;

        var culture = new CultureInfo("es-ES");
        var baseImponible = 1850.00m;
        var cuotaIVA = baseImponible * 0.21m;
        var total = baseImponible + cuotaIVA;

        // Pie de página VeriFactu conforme con RD 1007/2023
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
        {
            HtmlFragment = @"
                <div style='font-family:Arial; font-size:8pt; border-top:1px solid #000; padding-top:3px;'>
                    <strong>VERI*FACTU</strong> — NIF Emisor: B12345678 — 
                    Verificable: https://www2.agenciatributaria.gob.es — 
                    SII: Remitido — FNMT-RCM: Firmado
                    <span style='float:right'>Pág. {page}/{total-pages}</span>
                </div>",
            MaxHeight = 20
        };

        var html = $@"
            <!DOCTYPE html><html lang='es'><body style='font-family:Arial; padding:20px;'>
                <h2>FACTURA ELECTRÓNICA — ComPDFKit ➜ IronPDF (Migrado)</h2>
                <table style='width:100%; border-collapse:collapse; margin-bottom:15px;'>
                    <tr><td><strong>Emisor NIF:</strong> B12345678</td>
                        <td><strong>Receptor CIF:</strong> A98765432</td></tr>
                    <tr><td><strong>Número:</strong> 2026-MIG-00001</td>
                        <td><strong>Fecha:</strong> 28/05/2026 | Período: 2T 2026</td></tr>
                </table>
                <table border='1' cellpadding='5' style='width:100%; border-collapse:collapse;'>
                    <tr><th>Descripción</th><th>Base (€)</th><th>IVA 21%</th><th>Total (€)</th></tr>
                    <tr><td>Migración ComPDFKit a IronPDF</td>
                        <td style='text-align:right'>{baseImponible.ToString("N2", culture)} €</td>
                        <td style='text-align:right'>{cuotaIVA.ToString("N2", culture)} €</td>
                        <td style='text-align:right'><strong>{total.ToString("N2", culture)} €</strong></td></tr>
                </table>
                <p style='margin-top:10px; font-size:9pt;'>
                    Facturae 3.2.2 | FACe B2G | AEAT SII | Crea y Crece | LOPDGDD conforme
                </p>
            </body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("factura_verifactu_ironpdf.pdf");
    }
}
Imports IronPdf
Imports System.Globalization

Class MigracionCompdfKitIronPdf
    Public Shared Sub GenerarFacturaVeriFactu()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
        renderer.RenderingOptions.MarginBottom = 25

        Dim culture = New CultureInfo("es-ES")
        Dim baseImponible As Decimal = 1850.0D
        Dim cuotaIVA As Decimal = baseImponible * 0.21D
        Dim total As Decimal = baseImponible + cuotaIVA

        ' Pie de página VeriFactu conforme con RD 1007/2023
        renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
            .HtmlFragment = "
                <div style='font-family:Arial; font-size:8pt; border-top:1px solid #000; padding-top:3px;'>
                    <strong>VERI*FACTU</strong> — NIF Emisor: B12345678 — 
                    Verificable: https://www2.agenciatributaria.gob.es — 
                    SII: Remitido — FNMT-RCM: Firmado
                    <span style='float:right'>Pág. {page}/{total-pages}</span>
                </div>",
            .MaxHeight = 20
        }

        Dim html As String = $"
            <!DOCTYPE html><html lang='es'><body style='font-family:Arial; padding:20px;'>
                <h2>FACTURA ELECTRÓNICA — ComPDFKit ➜ IronPDF (Migrado)</h2>
                <table style='width:100%; border-collapse:collapse; margin-bottom:15px;'>
                    <tr><td><strong>Emisor NIF:</strong> B12345678</td>
                        <td><strong>Receptor CIF:</strong> A98765432</td></tr>
                    <tr><td><strong>Número:</strong> 2026-MIG-00001</td>
                        <td><strong>Fecha:</strong> 28/05/2026 | Período: 2T 2026</td></tr>
                </table>
                <table border='1' cellpadding='5' style='width:100%; border-collapse:collapse;'>
                    <tr><th>Descripción</th><th>Base (€)</th><th>IVA 21%</th><th>Total (€)</th></tr>
                    <tr><td>Migración ComPDFKit a IronPDF</td>
                        <td style='text-align:right'>{baseImponible.ToString("N2", culture)} €</td>
                        <td style='text-align:right'>{cuotaIVA.ToString("N2", culture)} €</td>
                        <td style='text-align:right'><strong>{total.ToString("N2", culture)} €</strong></td></tr>
                </table>
                <p style='margin-top:10px; font-size:9pt;'>
                    Facturae 3.2.2 | FACe B2G | AEAT SII | Crea y Crece | LOPDGDD conforme
                </p>
            </body></html>"

        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("factura_verifactu_ironpdf.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Este ejemplo ilustra la capacidad que ComPDFKit no puede ofrecer de forma nativa: generación de facturas con leyenda VERI*FACTU, código QR de validación AEAT, datos de NIF/CIF del emisor y receptor en formato español, importes con separador decimal de coma (1.850,00 €) y referencia al SII, FACe y LOPDGDD.

Preparación de la migración

Prerrequisitos

Asegúrese de que su entorno cumple estos requisitos:

  • .NET Framework 4.6.2+ o .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ o VS Code con extensión de C#
  • Acceso al gestor de paquetes NuGet
  • Clave de licencia deIronPDF(prueba gratuita disponible en ironpdf.com)

Aprobar el uso de ComPDFKit

Ejecute estos comandos en su directorio de soluciones para identificar todas las referencias a ComPDFKit:

# Find all ComPDFKitusages in your codebase
grep -r "using ComPDFKit" --include="*.cs" .
grep -r "CPDFDocument\|CPDFPage\|CPDFAnnotation" --include="*.cs" .

# Find NuGet package references
grep -r "ComPDFKit" --include="*.csproj" .
# Find all ComPDFKitusages in your codebase
grep -r "using ComPDFKit" --include="*.cs" .
grep -r "CPDFDocument\|CPDFPage\|CPDFAnnotation" --include="*.cs" .

# Find NuGet package references
grep -r "ComPDFKit" --include="*.csproj" .
SHELL

Cambios importantes que hay que anticipar

Cambiar ComPDFKit IronPDF Impacto
Carga de documentos CPDFDocument.InitWithFilePath() PdfDocument.FromFile() Cambio de nombre del método
Ahorro document.WriteToFilePath() pdf.SaveAs() Cambio de nombre del método
Limpieza de memoria document.Release() requerido Automático (GC) Eliminar la limpieza manual
Acceso a la página document.PageAtIndex(i) pdf.Pages[i] Acceso tipo array
Indización de páginas basado en 0 basado en 0 No se necesitan cambios
Representación HTML Implementación manual RenderHtmlAsPdf() Simplificación importante
Extracción de texto textPage.GetText() pdf.ExtractAllText() API simplificada

Proceso de migración paso a paso

Paso 1: Actualizar paquetes NuGet

Elimine los paquetes ComPDFKite instale IronPDF:

# Remove ComPDFKitpackages
dotnet remove package ComPDFKit.NetCore
dotnet remove package ComPDFKit.NetFramework

# Install IronPDF
dotnet add package IronPdf
# Remove ComPDFKitpackages
dotnet remove package ComPDFKit.NetCore
dotnet remove package ComPDFKit.NetFramework

# Install IronPDF
dotnet add package IronPdf
SHELL

Paso 2: Actualizar referencias de espacios de nombres

Sustituya los espacios de nombres de ComPDFKitpor IronPDF:

// Remove these
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using ComPDFKit.PDFAnnotation;
using ComPDFKit.Import;

// Add this
using IronPdf;
// Remove these
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using ComPDFKit.PDFAnnotation;
using ComPDFKit.Import;

// Add this
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

Paso 3: Configurar la licencia

// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Referencia completa de migración de API

Operaciones de documentos

Tarea ComPDFKit IronPDF
Crear documento vacío CPDFDocument.CreateDocument() new PdfDocument()
Cargar desde archivo CPDFDocument.InitWithFilePath(path) PdfDocument.FromFile(path)
Cargar desde stream CPDFDocument.InitWithStream(stream) PdfDocument.FromStream(stream)
Guardar en archivo document.WriteToFilePath(path) pdf.SaveAs(path)
Obtener recuento de páginas document.PageCount pdf.PageCount
Publicar/Disponer document.Release() No es necesario

Conversión de HTML a PDF

Tarea ComPDFKit IronPDF
Cadena HTML a PDF Se requiere ejecución manual renderer.RenderHtmlAsPdf(html)
Archivo HTML a PDF Se requiere ejecución manual renderer.RenderHtmlFileAsPdf(path)
URL a PDF Se requiere ejecución manual renderer.RenderUrlAsPdf(url)
Establecer tamaño de página A través de los parámetros de creación de páginas renderer.RenderingOptions.PaperSize
Establecer márgenes Mediante la configuración del editor renderer.RenderingOptions.MarginTop etc.

Operaciones de fusión y división

Tarea ComPDFKit IronPDF
Fusionar documentos doc1.ImportPagesAtIndex(doc2, range, index) PdfDocument.Merge(pdf1, pdf2)
Documento dividido Extraer páginas a un nuevo documento pdf.CopyPages(start, end)

Ejemplos de migración de código

Conversión de HTML a PDF

La diferencia más significativa entre ComPDFKiteIronPDFes el renderizado HTML. ComPDFKitrequiere la colocación manual del texto, mientras queIronPDFrenderiza HTML de forma nativa con su motor Chromium.

Implementación de ComPDFKit:

// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using System;

class Program
{
    static void Main()
    {
        var document = CPDFDocument.CreateDocument();
        var page = document.InsertPage(0, 595, 842, "");

        // ComPDFKitrequires manual HTML rendering
        // Native HTML a PDFnot directly supported
        var editor = page.GetEditor();
        editor.BeginEdit(CPDFEditType.EditText);
        editor.CreateTextWidget(new System.Drawing.RectangleF(50, 50, 500, 700), "HTML content here");
        editor.EndEdit();

        document.WriteToFilePath("output.pdf");
        document.Release();
    }
}
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using System;

class Program
{
    static void Main()
    {
        var document = CPDFDocument.CreateDocument();
        var page = document.InsertPage(0, 595, 842, "");

        // ComPDFKitrequires manual HTML rendering
        // Native HTML a PDFnot directly supported
        var editor = page.GetEditor();
        editor.BeginEdit(CPDFEditType.EditText);
        editor.CreateTextWidget(new System.Drawing.RectangleF(50, 50, 500, 700), "HTML content here");
        editor.EndEdit();

        document.WriteToFilePath("output.pdf");
        document.Release();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de IronPDF:

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML content.</p>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML content.</p>");
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML content.</p>")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

ChromePdfRenderer deIronPDFelimina la necesidad de posicionamiento manual de texto y gestión del editor. Para más opciones de conversión de HTML, consulte la documentación HTML a PDF.

Fusión de varios PDF

Implementación de ComPDFKit:

// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.Import;
using System;

class Program
{
    static void Main()
    {
        var document1 = CPDFDocument.InitWithFilePath("file1.pdf");
        var document2 = CPDFDocument.InitWithFilePath("file2.pdf");

        // Import pages from document2 into document1
        document1.ImportPagesAtIndex(document2, "0-" + (document2.PageCount - 1), document1.PageCount);

        document1.WriteToFilePath("merged.pdf");
        document1.Release();
        document2.Release();
    }
}
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.Import;
using System;

class Program
{
    static void Main()
    {
        var document1 = CPDFDocument.InitWithFilePath("file1.pdf");
        var document2 = CPDFDocument.InitWithFilePath("file2.pdf");

        // Import pages from document2 into document1
        document1.ImportPagesAtIndex(document2, "0-" + (document2.PageCount - 1), document1.PageCount);

        document1.WriteToFilePath("merged.pdf");
        document1.Release();
        document2.Release();
    }
}
Imports ComPDFKit.PDFDocument
Imports ComPDFKit.Import
Imports System

Module Program
    Sub Main()
        Dim document1 = CPDFDocument.InitWithFilePath("file1.pdf")
        Dim document2 = CPDFDocument.InitWithFilePath("file2.pdf")

        ' Import pages from document2 into document1
        document1.ImportPagesAtIndex(document2, "0-" & (document2.PageCount - 1), document1.PageCount)

        document1.WriteToFilePath("merged.pdf")
        document1.Release()
        document2.Release()
    End Sub
End Module
$vbLabelText   $csharpLabel

Implementación de IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("file1.pdf");
        var pdf2 = PdfDocument.FromFile("file2.pdf");

        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("file1.pdf");
        var pdf2 = PdfDocument.FromFile("file2.pdf");

        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        merged.SaveAs("merged.pdf");
    }
}
Imports IronPdf
Imports System
Imports System.Collections.Generic

Module Program
    Sub Main()
        Dim pdf1 = PdfDocument.FromFile("file1.pdf")
        Dim pdf2 = PdfDocument.FromFile("file2.pdf")

        Dim merged = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
        merged.SaveAs("merged.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

El método estático Merge deIronPDFelimina el patrón detallado ImportPagesAtIndex con cadenas de rango de páginas. Para obtener más opciones, consulte la documentación de fusión de PDF .

Añadir marcas de agua

La marca de agua demuestra el cambio de paradigma del enfoque basado en el editor de ComPDFKital estilo basado en HTML de IronPDF.

Implementación de ComPDFKit:

// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        var document = CPDFDocument.InitWithFilePath("input.pdf");

        for (int i = 0; i < document.PageCount; i++)
        {
            var page = document.PageAtIndex(i);
            var editor = page.GetEditor();
            editor.BeginEdit(CPDFEditType.EditText);

            var textArea = editor.CreateTextArea();
            textArea.SetText("CONFIDENTIAL");
            textArea.SetFontSize(48);
            textArea.SetTransparency(128);

            editor.EndEdit();
            page.Release();
        }

        document.WriteToFilePath("watermarked.pdf");
        document.Release();
    }
}
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        var document = CPDFDocument.InitWithFilePath("input.pdf");

        for (int i = 0; i < document.PageCount; i++)
        {
            var page = document.PageAtIndex(i);
            var editor = page.GetEditor();
            editor.BeginEdit(CPDFEditType.EditText);

            var textArea = editor.CreateTextArea();
            textArea.SetText("CONFIDENTIAL");
            textArea.SetFontSize(48);
            textArea.SetTransparency(128);

            editor.EndEdit();
            page.Release();
        }

        document.WriteToFilePath("watermarked.pdf");
        document.Release();
    }
}
Imports ComPDFKit.PDFDocument
Imports ComPDFKit.PDFPage
Imports System
Imports System.Drawing

Module Program
    Sub Main()
        Dim document = CPDFDocument.InitWithFilePath("input.pdf")

        For i As Integer = 0 To document.PageCount - 1
            Dim page = document.PageAtIndex(i)
            Dim editor = page.GetEditor()
            editor.BeginEdit(CPDFEditType.EditText)

            Dim textArea = editor.CreateTextArea()
            textArea.SetText("CONFIDENTIAL")
            textArea.SetFontSize(48)
            textArea.SetTransparency(128)

            editor.EndEdit()
            page.Release()
        Next

        document.WriteToFilePath("watermarked.pdf")
        document.Release()
    End Sub
End Module
$vbLabelText   $csharpLabel

Implementación de IronPDF:

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

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        pdf.ApplyWatermark("<h1 style='color:rgba(255,0,0,0.3);'>CONFIDENTIAL</h1>",
            rotation: 45,
            verticalAlignment: VerticalAlignment.Middle,
            horizontalAlignment: HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        pdf.ApplyWatermark("<h1 style='color:rgba(255,0,0,0.3);'>CONFIDENTIAL</h1>",
            rotation: 45,
            verticalAlignment: VerticalAlignment.Middle,
            horizontalAlignment: HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Editing
Imports System

Module Program
    Sub Main()
        Dim pdf = PdfDocument.FromFile("input.pdf")

        pdf.ApplyWatermark("<h1 style='color:rgba(255,0,0,0.3);'>CONFIDENTIAL</h1>", 
                           rotation:=45, 
                           verticalAlignment:=VerticalAlignment.Middle, 
                           horizontalAlignment:=HorizontalAlignment.Center)

        pdf.SaveAs("watermarked.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF reduce la implementación de una marca de agua de más de 20 líneas a una única llamada a un método con estilo HTML/CSS. Para obtener más opciones, consulte la documentación de la marca de agua .

Extracción de texto

Implementación de ComPDFKit:

using ComPDFKit.PDFDocument;
using System.Text;

var document = CPDFDocument.InitWithFilePath("document.pdf");

// Extract text (verbose)
var allText = new StringBuilder();
for (int i = 0; i < document.PageCount; i++)
{
    var page = document.PageAtIndex(i);
    var textPage = page.GetTextPage();
    allText.AppendLine(textPage.GetText(0, textPage.CountChars()));
    textPage.Release();
    page.Release();
}

document.WriteToFilePath("output.pdf");
document.Release(); // Must remember to release!
using ComPDFKit.PDFDocument;
using System.Text;

var document = CPDFDocument.InitWithFilePath("document.pdf");

// Extract text (verbose)
var allText = new StringBuilder();
for (int i = 0; i < document.PageCount; i++)
{
    var page = document.PageAtIndex(i);
    var textPage = page.GetTextPage();
    allText.AppendLine(textPage.GetText(0, textPage.CountChars()));
    textPage.Release();
    page.Release();
}

document.WriteToFilePath("output.pdf");
document.Release(); // Must remember to release!
Imports ComPDFKit.PDFDocument
Imports System.Text

Dim document = CPDFDocument.InitWithFilePath("document.pdf")

' Extract text (verbose)
Dim allText As New StringBuilder()
For i As Integer = 0 To document.PageCount - 1
    Dim page = document.PageAtIndex(i)
    Dim textPage = page.GetTextPage()
    allText.AppendLine(textPage.GetText(0, textPage.CountChars()))
    textPage.Release()
    page.Release()
Next

document.WriteToFilePath("output.pdf")
document.Release() ' Must remember to release!
$vbLabelText   $csharpLabel

Implementación de IronPDF:

using IronPdf;

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

// Extract text (one-liner)
string allText = pdf.ExtractAllText();

pdf.SaveAs("output.pdf");
// No Release() needed - GC handles cleanup
using IronPdf;

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

// Extract text (one-liner)
string allText = pdf.ExtractAllText();

pdf.SaveAs("output.pdf");
// No Release() needed - GC handles cleanup
Imports IronPdf

Dim pdf = PdfDocument.FromFile("document.pdf")

' Extract text (one-liner)
Dim allText As String = pdf.ExtractAllText()

pdf.SaveAs("output.pdf")
' No Release() needed - GC handles cleanup
$vbLabelText   $csharpLabel

IronPDF reduce la extracción de texto de varias líneas con llamadas manuales Release() a un solo método. Para obtener más opciones de extracción, consulte la documentación de extracción de texto .

Protección con contraseña

Implementación de IronPDF:

using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");

// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

pdf.SaveAs("protected.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");

// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

pdf.SaveAs("protected.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>")

' Set security
pdf.SecuritySettings.UserPassword = "userPassword"
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SecuritySettings.AllowUserCopyPasteContent = False

pdf.SaveAs("protected.pdf")
$vbLabelText   $csharpLabel

Para conocer opciones de seguridad integrales, consulte la documentación de cifrado .

Notas de migración críticas

Eliminar todas las llamadas a Release()

El cambio más impactante es la eliminación de la gestión manual de la memoria. ComPDFKitrequiere llamadas Release() explícitas en documentos, páginas y páginas de texto.IronPDFse encarga de ello automáticamente mediante la recolección de basura de .NET:

// ComPDFKit- manual cleanup required
document.Release();
page.Release();
textPage.Release();

//IronPDF- no equivalent needed
// GC handles cleanup automatically
// ComPDFKit- manual cleanup required
document.Release();
page.Release();
textPage.Release();

//IronPDF- no equivalent needed
// GC handles cleanup automatically
' ComPDFKit- manual cleanup required
document.Release()
page.Release()
textPage.Release()

' IronPDF- no equivalent needed
' GC handles cleanup automatically
$vbLabelText   $csharpLabel

Renderizado HTML nativo

ComPDFKit requiere la colocación manual del texto con las API del editor.IronPDFrenderiza HTML/CSS de forma nativa con su motor Chromium, compatible con CSS3 moderno, JavaScript y diseños adaptables.

Indización de la misma página

Ambas bibliotecas utilizan indexación basada en 0 (Pages[0] es la primera página); no se necesitan cambios en el código de acceso a la página.

Extracción de texto simplificada

Reemplace el patrón multilínea GetTextPage() + GetText() + Release() con una única llamada ExtractAllText().

API de combinación fluida

Reemplace ImportPagesAtIndex(doc2, "0-9", pageCount) con el simple Merge(pdf1, pdf2).

Lista de comprobación posterior a la migración

Después de completar la migración del código, verifique lo siguiente:

  • Ejecute todas las pruebas unitarias para verificar que la generación de PDF funcione correctamente
  • Comparar la calidad de salida del PDF (el motor Chromium deIronPDFpuede renderizar de forma diferente, generalmente mejor)
  • Pruebe la representación HTML con CSS y JavaScript complejos
  • Verificar la precisión de la extracción de texto
  • Funcionalidad del formulario de prueba
  • Operaciones por lotes de pruebas de rendimiento
  • Prueba en todos los entornos de destino
  • Actualizar los pipelines de CI/CD
  • Eliminar archivos de licencia de ComPDFKit

Proteja su infraestructura PDF: de ComPDFKit a IronPDF en el mercado español

Para equipos de desarrollo en España, la migración de ComPDFKit a IronPDF en 2026 tiene una dimensión regulatoria que va más allá de la calidad técnica de la API:

VeriFactu y AEAT: IronPDF permite generar la leyenda VERI*FACTU, el QR de validación de la sede electrónica de la AEAT y la cadena de huella encadenada exigida por el Real Decreto 1007/2023 — elementos que ComPDFKit no puede producir de forma nativa.

TicketBAI (Bizkaia, Gipuzkoa, Araba): IronPDF soporta firma PAdES con certificados FNMT-RCM, IZENPE y otras TSPs acreditadas españolas, cubriendo los requisitos de firma digital de TicketBAI conformes con eIDAS.

Facturae y Crea y Crece: IronPDF exporta PDF/A-3 con incrustación de XML Facturae bajo el estándar EN 16931 / CIUS-ES, habilitando el envío a FACe y la integración con el SII de la AEAT.

LOPDGDD y AEPD: el procesamiento íntegramente local de IronPDF elimina la transferencia de datos fiscales con NIF/CIF a infraestructuras externas, simplificando la evaluación de impacto de protección de datos ante la AEPD.

Con .NET 10 en el horizonte y C# 14 introduciendo nuevas características del lenguaje, elegir una biblioteca PDF madura y mantenida activamente garantiza la compatibilidad a largo plazo. Los más de 10 años de trayectoria de IronPDF, el amplio apoyo de la comunidad y el moderno diseño de la API hacen que su inversión en migración sea rentable a medida que los proyectos se extienden hasta 2025 y 2026.

Recursos adicionales


La migración de ComPDFKitaIronPDFelimina la administración manual de memoria con llamadas Release() y al mismo tiempo proporciona una representación nativa de HTML a PDF de la que carece ComPDFKit. La transición al ecosistema maduro deIronPDFofrece la profundidad de la documentación, el apoyo de la comunidad y la estabilidad probada que requieren los proyectos empresariales.

Preguntas Frecuentes

¿ComPDFKit es compatible con VeriFactu en España?

No. ComPDFKit no incluye soporte nativo para generar la leyenda VERI*FACTU, el código QR de validación de la AEAT ni la cadena de huella encadenada exigidos por el Real Decreto 1007/2023. IronPDF permite añadir estos elementos mediante HtmlHeaderFooter en el pie de página de cada factura.

¿Cómo migrar de ComPDFKit a IronPDF en un proyecto de facturación español?

Sustituya los paquetes NuGet de ComPDFKit por IronPDF, reemplace CPDFDocument por PdfDocument y ChromePdfRenderer, elimine las llamadas Release() manuales (IronPDF usa GC automático), y añada el contenido regulatorio VeriFactu (leyenda VERI*FACTU, QR AEAT, datos NIF/CIF) mediante HtmlHeaderFooter.

¿IronPDF soporta firma PAdES para TicketBAI en el País Vasco?

Sí. IronPDF permite firmar PDFs con cualquier certificado X.509, incluyendo los emitidos por la FNMT-RCM, IZENPE (TSP del País Vasco) y AC Camerfirma. Esto cubre los requisitos de firma PAdES conforme a eIDAS para TicketBAI en Bizkaia, Gipuzkoa y Araba.

¿Cómo generar facturas con NIF/CIF e importes en formato español con IronPDF?

Usa CultureInfo("es-ES") para formatear los importes con separador decimal de coma (p. ej. 1.850,00 €). Incluye el NIF del emisor y el CIF del receptor directamente en el HTML de la plantilla. IronPDF renderiza el HTML con fidelidad pixel-perfect usando su motor Chromium.

¿IronPDF cumple con la LOPDGDD para la generación de facturas?

IronPDF procesa todos los PDFs íntegramente en los servidores del ISV, sin transmitir datos fiscales o personales (NIF, nombre, importes) a servidores externos. Esto simplifica el cumplimiento de la LOPDGDD y elimina la necesidad de contratos de encargado del tratamiento bajo el Art. 28 RGPD para la generación de documentos fiscales.

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

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame