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

Migrar de VectSharp a IronPDF: facturas VeriFactu, TicketBAI y LOPDGDD sin API de coordenadas

Para los ISVs y desarrolladores .NET en España, la elección de la biblioteca de generación de documentos tiene consecuencias regulatorias directas. VectSharp es una biblioteca de gráficos vectoriales diseñada para visualización científica — no para generación de facturas. No puede emitir la leyenda obligatoria VERI\*FACTU exigida por el Real Decreto-Ley 15/2025 (VeriFactu), incrustar el código QR de verificación de la AEAT ni renderizar documentos Facturae XML en PDF/A-3 para FACe. Los proveedores de software de facturación que no cumplan con VeriFactu se exponen a sanciones de hasta 150.000 €/año.

Adicionalmente, VectSharp se distribuye bajo licencia LGPL, una licencia copyleft que puede crear fricciones en revisiones de cumplimiento cuando el software está sujeto a las obligaciones del proveedor de software VeriFactu. IronPDF, con licencia comercial propietaria, elimina este riesgo — alternativa directa a iText AGPL en entornos donde la claridad de la licencia es un factor crítico para TicketBAI (Bizkaia, Gipuzkoa, Araba) y la LOPDGDD supervisada por la AEPD.

VectSharp es una potente biblioteca de gráficos vectoriales para el ecosistema .NET, especialmente valorada para visualización científica e ilustraciones técnicas. Sin embargo, cuando los equipos de desarrollo necesitan generar documentos comerciales, facturas electrónicas o cualquier contenido basado en HTML, el paradigma de VectSharp que da prioridad a los gráficos crea una fricción significativa.

Esta guía proporciona una ruta de migración completa de VectSharp a IronPDF, con instrucciones paso a paso, comparaciones de código y ejemplos prácticos para desarrolladores .NET que evalúan esta transición en el contexto de la normativa española de facturación electrónica.

Por qué migrar de VectSharp

VectSharp es una biblioteca de visualización científica y gráficos vectoriales diseñada para crear diagramas, gráficos e ilustraciones técnicas. No está diseñada para la generación de documentos, sino que es una biblioteca de dibujo que produce PDF. Entre las principales razones por las que los equipos de desarrollo se plantean la migración se incluyen:

Enfoque científico únicamente: VectSharp está diseñado para la visualización y el trazado de datos, no para documentos comerciales como facturas, informes o certificados.

Sin soporte HTML: VectSharp no puede convertir HTML o CSS a PDF. Cada elemento debe dibujarse manualmente utilizando comandos de gráficos vectoriales.

API basada en coordenadas: cada elemento debe estar posicionado con coordenadas X,Y exactas. No hay maquetación automática, flujo ni ajuste de texto.

Sin estilo CSS: todo el estilo es programático a través de llamadas a métodos. Los desarrolladores web no pueden aprovechar sus conocimientos de CSS.

Sin JavaScript: VectSharp no puede representar contenido web dinámico, gráficos interactivos o visualizaciones basadas en JavaScript.

Sin diseño de texto: el ajuste automático de texto, la paginación y el diseño de flujo no están disponibles. Los desarrolladores deben calcular manualmente las posiciones del texto y los saltos de página.

Paradigma Graphics-First: la biblioteca está diseñada para diagramas, no para informes o facturas. La generación de documentos requiere mucho trabajo manual.

El problema principal: biblioteca de gráficos frente a generador de documentos

VectSharp requiere el dibujo manual de vectores para cada elemento:

// VectSharp: Manual vector drawing for every element
Page page = new Page(595, 842);
Graphics graphics = page.Graphics;
graphics.FillRectangle(50, 50, 200, 100, Colour.FromRgb(0, 0, 255));
graphics.FillText(60, 70, "Invoice", new Font(new FontFamily("Arial"), 20), Colours.White);
// ... continue drawing every single element manually
// VectSharp: Manual vector drawing for every element
Page page = new Page(595, 842);
Graphics graphics = page.Graphics;
graphics.FillRectangle(50, 50, 200, 100, Colour.FromRgb(0, 0, 255));
graphics.FillText(60, 70, "Invoice", new Font(new FontFamily("Arial"), 20), Colours.White);
// ... continue drawing every single element manually
' VectSharp: Manual vector drawing for every element
Dim page As New Page(595, 842)
Dim graphics As Graphics = page.Graphics
graphics.FillRectangle(50, 50, 200, 100, Colour.FromRgb(0, 0, 255))
graphics.FillText(60, 70, "Invoice", New Font(New FontFamily("Arial"), 20), Colours.White)
' ... continue drawing every single element manually
$vbLabelText   $csharpLabel

IronPDF utiliza HTML, el formato de documento universal:

// IronPDF: Declarative HTML for document creation
var html = "<h1>Invoice</h1><p>Customer: Acme Corp</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
// IronPDF: Declarative HTML for document creation
var html = "<h1>Invoice</h1><p>Customer: Acme Corp</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
' IronPDF: Declarative HTML for document creation
Dim html As String = "<h1>Invoice</h1><p>Customer: Acme Corp</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

IronPDF vs VectSharp: Comparación de características

Comprender las diferencias arquitectónicas ayuda a los responsables técnicos a evaluar la inversión en migración:

Característica VectSharp IronPDF
Uso principal Gráficos vectoriales Creación de documentos
Resultado PDF
Soporte HTML No
Licencias LGPL Comercial
Código abierto Parcialmente (características comerciales)
Mejor para Visualizaciones científicas Documentos PDF generales
Personalización Limitado a gráficos Amplia documentación
HTML a PDF No Chromium completo
URL a PDF No
Soporte CSS No CSS3 completo
JavaScript No ES2024 completo
Diseño automático No
Saltos de página automáticos No
Envoltura de texto Manual Automático
Fusionar PDF No
Dividir PDF No
Protección de contraseñas No
Firmas digitales No
Curva de aprendizaje Alto (coordenadas) Bajo (HTML/CSS)
Verbosidad del código Muy alto Bajo

Contexto regulatorio español: VeriFactu, TicketBAI, Facturae y LOPDGDD

Para los ISVs y desarrolladores españoles, la elección de la biblioteca PDF incide directamente en la conformidad regulatoria. VectSharp no puede satisfacer ninguno de los requisitos clave del marco de facturación electrónica español.

Obligaciones VeriFactu (Real Decreto-Ley 15/2025): los proveedores de software de facturación deben incluir la leyenda VERI\*FACTU o Factura verificable en la sede electrónica de la AEAT en las representaciones gráficas de las facturas verificadas. VectSharp, al carecer de soporte HTML/CSS, no puede generar estas leyendas dinámicamente. IronPDF renderiza plantillas HTML con todos los datos de la factura en formato peninsular (NIF/CIF, EUR 1.234,56 €, IVA 21%) y las leyendas obligatorias en un único paso:

using IronPdf;

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();

// Factura VeriFactu con datos peninsulares — imposible con VectSharp DrawString()
string html = @"
<html>
<body style='font-family: Arial; margin: 40px;'>
    <h1>FACTURA Nº 2026-0123</h1>
    <p>Emisor: Innovación Digital S.L. | NIF: B-65.432.109</p>
    <p>Receptor: Grupo Industrial S.A. | CIF: A-98.765.432</p>
    <table border='1' cellpadding='6' style='width:100%;'>
        <tr><th>Concepto</th><th>Base imponible</th><th>IVA 21%</th><th>Total</th></tr>
        <tr><td>Desarrollo software a medida</td>
            <td>5.000,00 €</td><td>1.050,00 €</td><td>6.050,00 €</td></tr>
    </table>
    <p style='border:2px solid #003366; padding:10px; font-weight:bold; margin-top:20px;'>
        VERI*FACTU — Factura verificable en la sede electrónica de la AEAT
    </p>
    <img src='qr-aeat.png' alt='QR verificación AEAT' width='80' height='80'/>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-2026-0123.pdf");
using IronPdf;

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();

// Factura VeriFactu con datos peninsulares — imposible con VectSharp DrawString()
string html = @"
<html>
<body style='font-family: Arial; margin: 40px;'>
    <h1>FACTURA Nº 2026-0123</h1>
    <p>Emisor: Innovación Digital S.L. | NIF: B-65.432.109</p>
    <p>Receptor: Grupo Industrial S.A. | CIF: A-98.765.432</p>
    <table border='1' cellpadding='6' style='width:100%;'>
        <tr><th>Concepto</th><th>Base imponible</th><th>IVA 21%</th><th>Total</th></tr>
        <tr><td>Desarrollo software a medida</td>
            <td>5.000,00 €</td><td>1.050,00 €</td><td>6.050,00 €</td></tr>
    </table>
    <p style='border:2px solid #003366; padding:10px; font-weight:bold; margin-top:20px;'>
        VERI*FACTU — Factura verificable en la sede electrónica de la AEAT
    </p>
    <img src='qr-aeat.png' alt='QR verificación AEAT' width='80' height='80'/>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-2026-0123.pdf");
Imports IronPdf

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()

' Factura VeriFactu con datos peninsulares — imposible con VectSharp DrawString()
Dim html As String = "
<html>
<body style='font-family: Arial; margin: 40px;'>
    <h1>FACTURA Nº 2026-0123</h1>
    <p>Emisor: Innovación Digital S.L. | NIF: B-65.432.109</p>
    <p>Receptor: Grupo Industrial S.A. | CIF: A-98.765.432</p>
    <table border='1' cellpadding='6' style='width:100%;'>
        <tr><th>Concepto</th><th>Base imponible</th><th>IVA 21%</th><th>Total</th></tr>
        <tr><td>Desarrollo software a medida</td>
            <td>5.000,00 €</td><td>1.050,00 €</td><td>6.050,00 €</td></tr>
    </table>
    <p style='border:2px solid #003366; padding:10px; font-weight:bold; margin-top:20px;'>
        VERI*FACTU — Factura verificable en la sede electrónica de la AEAT
    </p>
    <img src='qr-aeat.png' alt='QR verificación AEAT' width='80' height='80'/>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("factura-2026-0123.pdf")
$vbLabelText   $csharpLabel

TicketBAI (País Vasco): el formato TicketBAI exige la firma XAdES conforme a eIDAS con certificados FNMT-RCM y la generación de un QR específico por provincia (Bizkaia, Gipuzkoa, Araba). IronPDF genera el PDF de factura e incrusta el QR foral directamente desde HTML; la firma XAdES se gestiona en la capa del ISV.

Facturae XML (B2G / FACe) y Crea y Crece: para el sector público, IronPDF genera documentos PDF/A-3 con adjuntos Facturae XML para envío a través de FACe, cumpliendo el estándar EN 16931 y el perfil CIUS-ES. La Ley Crea y Crece extiende esta obligatoriedad al B2B desde 2027-2028.

LOPDGDD y posicionamiento de licencia: La LOPDGDD supervisada por la AEPD exige que los datos personales de las facturas no se transfieran a terceros. IronPDF procesa todo on-premise. Además, VectSharp (LGPL) puede plantear dudas en revisiones de cumplimiento bajo el régimen de sanciones VeriFactu (hasta 150.000 €/año). IronPDF, con licencia comercial propietaria, elimina este riesgo — alternativa directa a iText AGPL en entornos con escrutinio de licencias copyleft. El SII (Suministro Inmediato de Información) de la AEAT puede beneficiarse de la generación asíncrona nativa de IronPDF.

Inicio rápido: Migración de VectSharp a IronPDF

La migración puede comenzar inmediatamente con estos pasos básicos.

Paso 1: Sustituir paquetes NuGet

Eliminar todos los paquetes de VectSharp:

# Remove VectSharp packages
dotnet remove package VectSharp
dotnet remove package VectSharp.PDF
# Remove VectSharp packages
dotnet remove package VectSharp
dotnet remove package VectSharp.PDF
SHELL

Instalar IronPDF:

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

Paso 2: Actualizar los espacios de nombres

Sustituya los espacios de nombres VectSharp por el espacio de nombres IronPdf:

// Before (VectSharp)
using VectSharp;
using VectSharp.PDF;

// After (IronPDF)
using IronPdf;
// Before (VectSharp)
using VectSharp;
using VectSharp.PDF;

// After (IronPDF)
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

Paso 3: Inicializar licencia

Añadir inicialización de licencia al inicio de la aplicación:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Ejemplos de migración de código

Convertir HTML a PDF

VectSharp no admite la conversión de HTML a PDF. Esta diferencia fundamental de capacidades impulsa muchas decisiones de migración.

Enfoque de VectSharp:

// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using VectSharp.SVG;
using System.IO;

class Program
{
    static void Main()
    {
        // VectSharp doesn't directly support HTML to PDF
        // It requires manual creation of graphics objects
        Document doc = new Document();
        Page page = new Page(595, 842); // A4 size
        Graphics graphics = page.Graphics;

        graphics.FillText(100, 100, "Hello from VectSharp", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));

        doc.Pages.Add(page);
        doc.SaveAsPDF("output.pdf");
    }
}
// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using VectSharp.SVG;
using System.IO;

class Program
{
    static void Main()
    {
        // VectSharp doesn't directly support HTML to PDF
        // It requires manual creation of graphics objects
        Document doc = new Document();
        Page page = new Page(595, 842); // A4 size
        Graphics graphics = page.Graphics;

        graphics.FillText(100, 100, "Hello from VectSharp", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));

        doc.Pages.Add(page);
        doc.SaveAsPDF("output.pdf");
    }
}
Imports VectSharp
Imports VectSharp.PDF
Imports VectSharp.SVG
Imports System.IO

Module Program
    Sub Main()
        ' VectSharp doesn't directly support HTML to PDF
        ' It requires manual creation of graphics objects
        Dim doc As New Document()
        Dim page As New Page(595, 842) ' A4 size
        Dim graphics As Graphics = page.Graphics

        graphics.FillText(100, 100, "Hello from VectSharp", 
            New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24))

        doc.Pages.Add(page)
        doc.SaveAsPDF("output.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

Enfoque IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

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

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

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

VectSharp requiere crear un objeto Document, Page y Graphics y luego posicionar manualmente el texto con coordenadas exactas y objetos de fuente. IronPDF renderiza HTML directamente con soporte completo de estilos CSS.

Para situaciones avanzadas de conversión de HTML a PDF, consulte la Guía de conversión de HTML a PDF.

Generación de facturas con leyenda VERI*FACTU

Un caso de uso habitual en el mercado español es generar la representación gráfica de una factura electrónica que incluya la leyenda VERI*FACTU y el QR de verificación de la AEAT. Con VectSharp, esto requeriría posicionar manualmente cada campo; con IronPDF, se logra con HTML/CSS estándar:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        var renderer = new ChromePdfRenderer();

        // Plantilla de factura con leyenda VERI*FACTU obligatoria
        string html = @"
        <html>
        <body style='font-family: Arial, sans-serif; padding: 20px;'>
            <h1>FACTURA Nº 2024-001</h1>
            <p>Emisor: Empresa Ejemplo S.L. | NIF: B12345678</p>
            <table border='1' cellpadding='5' style='width:100%;'>
                <tr><th>Concepto</th><th>Base</th><th>IVA 21%</th><th>Total</th></tr>
                <tr><td>Servicio profesional</td><td>1.000,00 €</td><td>210,00 €</td><td>1.210,00 €</td></tr>
            </table>
            <p style='margin-top:20px; font-weight:bold; border:1px solid #000; padding:5px;'>
                VERI*FACTU — Factura verificable en la sede electrónica de la AEAT
            </p>

            <img src='qr-aeat.png' alt='QR AEAT' width='80' height='80'/>
        </body>
        </html>";

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

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        var renderer = new ChromePdfRenderer();

        // Plantilla de factura con leyenda VERI*FACTU obligatoria
        string html = @"
        <html>
        <body style='font-family: Arial, sans-serif; padding: 20px;'>
            <h1>FACTURA Nº 2024-001</h1>
            <p>Emisor: Empresa Ejemplo S.L. | NIF: B12345678</p>
            <table border='1' cellpadding='5' style='width:100%;'>
                <tr><th>Concepto</th><th>Base</th><th>IVA 21%</th><th>Total</th></tr>
                <tr><td>Servicio profesional</td><td>1.000,00 €</td><td>210,00 €</td><td>1.210,00 €</td></tr>
            </table>
            <p style='margin-top:20px; font-weight:bold; border:1px solid #000; padding:5px;'>
                VERI*FACTU — Factura verificable en la sede electrónica de la AEAT
            </p>

            <img src='qr-aeat.png' alt='QR AEAT' width='80' height='80'/>
        </body>
        </html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("factura-verifactu.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
        Dim renderer As New ChromePdfRenderer()

        ' Plantilla de factura con leyenda VERI*FACTU obligatoria
        Dim html As String = "
        <html>
        <body style='font-family: Arial, sans-serif; padding: 20px;'>
            <h1>FACTURA Nº 2024-001</h1>
            <p>Emisor: Empresa Ejemplo S.L. | NIF: B12345678</p>
            <table border='1' cellpadding='5' style='width:100%;'>
                <tr><th>Concepto</th><th>Base</th><th>IVA 21%</th><th>Total</th></tr>
                <tr><td>Servicio profesional</td><td>1.000,00 €</td><td>210,00 €</td><td>1.210,00 €</td></tr>
            </table>
            <p style='margin-top:20px; font-weight:bold; border:1px solid #000; padding:5px;'>
                VERI*FACTU — Factura verificable en la sede electrónica de la AEAT
            </p>

            <img src='qr-aeat.png' alt='QR AEAT' width='80' height='80'/>
        </body>
        </html>"

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

Creación de documentos de varias páginas

Los documentos de varias páginas revelan las diferencias arquitectónicas entre estas bibliotecas .NET PDF.

Enfoque de VectSharp:

// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using System;

class Program
{
    static void Main()
    {
        Document doc = new Document();

        // Page 1
        Page page1 = new Page(595, 842);
        Graphics g1 = page1.Graphics;
        g1.FillText(50, 50, "Page 1", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));
        g1.FillText(50, 100, "First page content", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14));
        doc.Pages.Add(page1);

        // Page 2
        Page page2 = new Page(595, 842);
        Graphics g2 = page2.Graphics;
        g2.FillText(50, 50, "Page 2", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));
        g2.FillText(50, 100, "Second page content", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14));
        doc.Pages.Add(page2);

        doc.SaveAsPDF("multipage.pdf");
    }
}
// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using System;

class Program
{
    static void Main()
    {
        Document doc = new Document();

        // Page 1
        Page page1 = new Page(595, 842);
        Graphics g1 = page1.Graphics;
        g1.FillText(50, 50, "Page 1", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));
        g1.FillText(50, 100, "First page content", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14));
        doc.Pages.Add(page1);

        // Page 2
        Page page2 = new Page(595, 842);
        Graphics g2 = page2.Graphics;
        g2.FillText(50, 50, "Page 2", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));
        g2.FillText(50, 100, "Second page content", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14));
        doc.Pages.Add(page2);

        doc.SaveAsPDF("multipage.pdf");
    }
}
Imports VectSharp
Imports VectSharp.PDF
Imports System

Class Program
    Shared Sub Main()
        Dim doc As New Document()

        ' Page 1
        Dim page1 As New Page(595, 842)
        Dim g1 As Graphics = page1.Graphics
        g1.FillText(50, 50, "Page 1", New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24))
        g1.FillText(50, 100, "First page content", New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14))
        doc.Pages.Add(page1)

        ' Page 2
        Dim page2 As New Page(595, 842)
        Dim g2 As Graphics = page2.Graphics
        g2.FillText(50, 50, "Page 2", New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24))
        g2.FillText(50, 100, "Second page content", New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14))
        doc.Pages.Add(page2)

        doc.SaveAsPDF("multipage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Enfoque IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = @"
            <h1>Page 1</h1>
            <p>First page content</p>
            <div style='page-break-after: always;'></div>
            <h1>Page 2</h1>
            <p>Second page content</p>
        ";

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = @"
            <h1>Page 1</h1>
            <p>First page content</p>
            <div style='page-break-after: always;'></div>
            <h1>Page 2</h1>
            <p>Second page content</p>
        ";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("multipage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()

        Dim html As String = "
            <h1>Page 1</h1>
            <p>First page content</p>
            <div style='page-break-after: always;'></div>
            <h1>Page 2</h1>
            <p>Second page content</p>
        "

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

VectSharp requiere crear objetos Page separados, contextos Graphics separados y posicionar manualmente cada elemento de texto con coordenadas y objetos de fuente para cada página. IronPDF utiliza una única cadena HTML con CSS page-break-after: always para crear documentos de varias páginas automáticamente.

Dibujar formas y texto

Las capacidades gráficas muestran dónde sobresale VectSharp, pero también dónde los estándares web proporcionan una funcionalidad equivalente con menos código.

Enfoque de VectSharp:

// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using System;

class Program
{
    static void Main()
    {
        Document doc = new Document();
        Page page = new Page(595, 842);
        Graphics graphics = page.Graphics;

        // Draw rectangle
        graphics.FillRectangle(50, 50, 200, 100, Colour.FromRgb(0, 0, 255));

        // Draw circle
        GraphicsPath circle = new GraphicsPath();
        circle.Arc(400, 100, 50, 0, 2 * Math.PI);
        graphics.FillPath(circle, Colour.FromRgb(255, 0, 0));

        // Add text
        graphics.FillText(50, 200, "VectSharp Graphics", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 20));

        doc.Pages.Add(page);
        doc.SaveAsPDF("shapes.pdf");
    }
}
// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using System;

class Program
{
    static void Main()
    {
        Document doc = new Document();
        Page page = new Page(595, 842);
        Graphics graphics = page.Graphics;

        // Draw rectangle
        graphics.FillRectangle(50, 50, 200, 100, Colour.FromRgb(0, 0, 255));

        // Draw circle
        GraphicsPath circle = new GraphicsPath();
        circle.Arc(400, 100, 50, 0, 2 * Math.PI);
        graphics.FillPath(circle, Colour.FromRgb(255, 0, 0));

        // Add text
        graphics.FillText(50, 200, "VectSharp Graphics", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 20));

        doc.Pages.Add(page);
        doc.SaveAsPDF("shapes.pdf");
    }
}
Imports VectSharp
Imports VectSharp.PDF
Imports System

Module Program
    Sub Main()
        Dim doc As New Document()
        Dim page As New Page(595, 842)
        Dim graphics As Graphics = page.Graphics

        ' Draw rectangle
        graphics.FillRectangle(50, 50, 200, 100, Colour.FromRgb(0, 0, 255))

        ' Draw circle
        Dim circle As New GraphicsPath()
        circle.Arc(400, 100, 50, 0, 2 * Math.PI)
        graphics.FillPath(circle, Colour.FromRgb(255, 0, 0))

        ' Add text
        graphics.FillText(50, 200, "VectSharp Graphics", 
            New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 20))

        doc.Pages.Add(page)
        doc.SaveAsPDF("shapes.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

Enfoque IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = @"
            <div style='width: 200px; height: 100px; background-color: blue; margin: 50px;'></div>
            <div style='width: 100px; height: 100px; background-color: red; 
                        border-radius: 50%; margin-left: 350px; margin-top: -50px;'></div>
            <h2 style='margin-left: 50px;'>IronPDF Graphics</h2>
        ";

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = @"
            <div style='width: 200px; height: 100px; background-color: blue; margin: 50px;'></div>
            <div style='width: 100px; height: 100px; background-color: red; 
                        border-radius: 50%; margin-left: 350px; margin-top: -50px;'></div>
            <h2 style='margin-left: 50px;'>IronPDF Graphics</h2>
        ";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("shapes.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()

        Dim html As String = "
            <div style='width: 200px; height: 100px; background-color: blue; margin: 50px;'></div>
            <div style='width: 100px; height: 100px; background-color: red; 
                        border-radius: 50%; margin-left: 350px; margin-top: -50px;'></div>
            <h2 style='margin-left: 50px;'>IronPDF Graphics</h2>
        "

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

VectSharp requiere crear objetos GraphicsPath, llamar a Arc() con parámetros matemáticos precisos y administrar colores a través de Colour.FromRgb(). IronPDF utiliza propiedades CSS familiares: background-color, border-radius: 50% para círculos y márgenes estándar.

Referencia de la API de VectSharp a IronPDF

Este mapeo acelera la migración al mostrar los equivalentes directos de las API:

VectSharp IronPDF
Document ChromePdfRenderer
Page Automático
Graphics HTML/CSS
graphics.FillRectangle() CSS background-color en <div>
graphics.StrokeRectangle() CSS border en <div>
graphics.FillText() Elementos de texto HTML
graphics.StrokePath() Bordes SVG o CSS
GraphicsPath Elemento SVG <path>
Colour.FromRgb() Valores de color CSS
Font / FontFamily CSS font-family
doc.SaveAsPDF() pdf.SaveAs()
Tamaño de página manual RenderingOptions.PaperSize

Estrategias de migración

Estrategia 1: Convertir el código de dibujo a HTML/CSS

Sustituir el dibujo basado en coordenadas por elementos HTML:

// VectSharp
graphics.FillRectangle(100, 50, 300, 80, Colour.FromRgb(0, 102, 204));
graphics.FillText(110, 80, "Header", font, Colours.White);

// IronPDF HTML equivalent
<div style="
    position: absolute;
    left: 100px;
    top: 50px;
    width: 300px;
    height: 80px;
    background: rgb(0, 102, 204);
    color: white;
    padding: 10px;
">Header</div>
// VectSharp
graphics.FillRectangle(100, 50, 300, 80, Colour.FromRgb(0, 102, 204));
graphics.FillText(110, 80, "Header", font, Colours.White);

// IronPDF HTML equivalent
<div style="
    position: absolute;
    left: 100px;
    top: 50px;
    width: 300px;
    height: 80px;
    background: rgb(0, 102, 204);
    color: white;
    padding: 10px;
">Header</div>
' VectSharp
graphics.FillRectangle(100, 50, 300, 80, Colour.FromRgb(0, 102, 204))
graphics.FillText(110, 80, "Header", font, Colours.White)

' IronPDF HTML equivalent
<div style="
    position: absolute;
    left: 100px;
    top: 50px;
    width: 300px;
    height: 80px;
    background: rgb(0, 102, 204);
    color: white;
    padding: 10px;
">Header</div>
$vbLabelText   $csharpLabel

Estrategia 2: Utilizar SVG para gráficos vectoriales

Para formas complejas, utilice SVG en línea en su HTML:

// VectSharp path
GraphicsPath path = new GraphicsPath();
path.MoveTo(100, 100);
path.LineTo(200, 50);
path.LineTo(300, 100);
path.Close();
graphics.FillPath(path, Colours.Blue);

// IronPDF SVG equivalent
<svg><polygon points="100,100 200,50 300,100" fill="blue"/></svg>
// VectSharp path
GraphicsPath path = new GraphicsPath();
path.MoveTo(100, 100);
path.LineTo(200, 50);
path.LineTo(300, 100);
path.Close();
graphics.FillPath(path, Colours.Blue);

// IronPDF SVG equivalent
<svg><polygon points="100,100 200,50 300,100" fill="blue"/></svg>
' VectSharp path
Dim path As New GraphicsPath()
path.MoveTo(100, 100)
path.LineTo(200, 50)
path.LineTo(300, 100)
path.Close()
graphics.FillPath(path, Colours.Blue)

' IronPDF SVG equivalent
<svg><polygon points="100,100 200,50 300,100" fill="blue"/></svg>
$vbLabelText   $csharpLabel

Estrategia 3: Utilizar bibliotecas de gráficos JavaScript

Para las visualizaciones científicas, la especialidad de VectSharp, IronPDF puede aprovechar potentes bibliotecas de JavaScript como Chart.js, D3.js o Plotly:

var html = @"
<script src='https://cdn.plot.ly/plotly-latest.min.js'></script>
<div id='chart'></div>
<script>
    Plotly.newPlot('chart', [{
        x: [1, 2, 3, 4],
        y: [10, 15, 13, 17],
        type: 'scatter'
    }]);
</script>";

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
var pdf = renderer.RenderHtmlAsPdf(html);
var html = @"
<script src='https://cdn.plot.ly/plotly-latest.min.js'></script>
<div id='chart'></div>
<script>
    Plotly.newPlot('chart', [{
        x: [1, 2, 3, 4],
        y: [10, 15, 13, 17],
        type: 'scatter'
    }]);
</script>";

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
var pdf = renderer.RenderHtmlAsPdf(html);
Dim html As String = "
<script src='https://cdn.plot.ly/plotly-latest.min.js'></script>
<div id='chart'></div>
<script>
    Plotly.newPlot('chart', [{
        x: [1, 2, 3, 4],
        y: [10, 15, 13, 17],
        type: 'scatter'
    }]);
</script>"

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

Problemas comunes de migración y soluciones

Tema 1: Diferencias en los sistemas de coordenadas

VectSharp utiliza puntos desde el origen superior izquierdo con posicionamiento manual.

Solución: Utilizar posicionamiento CSS:

.element {
    position: absolute;
    top: 50px;
    left: 100px;
}

Número 2: Objetos de fuentes

VectSharp crea objetos Font y FontFamily mediante programación.

Solución: Utilizar CSS font-family:

<style>
    body { font-family: Arial, sans-serif; font-size: 12pt; }
</style>
<style>
    body { font-family: Arial, sans-serif; font-size: 12pt; }
</style>
HTML

Número 3: Manejo del color

VectSharp utiliza llamadas al método Colour.FromRgb().

Solución: Utilizar colores CSS:

.header { color: rgb(0, 102, 204); background-color: #f0f0f0; }

Número 4: Trayectorias gráficas

VectSharp utiliza una API compleja GraphicsPath con métodos MoveTo, LineTo, Arc.

Solución: Utilizar SVG para gráficos vectoriales:

<svg>
    <path d="M 100 100 L 200 50 L 300 100 Z" fill="blue"/>
</svg>
<svg>
    <path d="M 100 100 L 200 50 L 300 100 Z" fill="blue"/>
</svg>
HTML

Lista de comprobación de la migración a VectSharp

Tareas previas a la migración

Audite su código base para identificar todo el uso de VectSharp:

grep -r "using VectSharp" --include="*.cs" .
grep -r "Graphics\|FillRectangle\|FillText" --include="*.cs" .
grep -r "using VectSharp" --include="*.cs" .
grep -r "Graphics\|FillRectangle\|FillText" --include="*.cs" .
SHELL

Tamaños de página del documento (los patrones new Page(595, 842)). Tenga en cuenta los esquemas de color que utilizan Colour.FromRgb(). Identificar las configuraciones de fuentes. Mapee gráficos vectoriales complejos usando GraphicsPath para la conversión SVG.

Tareas de actualización de código

  1. Eliminar paquetes NuGet de VectSharp
  2. Instalación del paquete IronPdf NuGet
  3. Actualizar las declaraciones de uso de VectSharp a IronPdf
  4. Convierta las llamadas FillRectangle en cuadros CSS con background-color
  5. Convierte las llamadas FillText en elementos de texto HTML con estilo CSS
  6. Convertir operaciones GraphicsPath a elementos SVG <path>
  7. Reemplace la administración de páginas manuales con RenderingOptions.PaperSize
  8. Añadir inicialización de licencia al inicio
  9. Incorporar leyendas VERI*FACTU y QR de la AEAT si el software gestiona facturación española

Pruebas posteriores a la migración

Tras la migración, verifique estos aspectos:

  • Comparar el resultado visual entre las versiones de VectSharp y IronPDF
  • Verifique que los colores coincidan utilizando los equivalentes CSS de los valores Colour.FromRgb()
  • Comprobar la precisión de posicionamiento de los elementos convertidos a partir de la colocación basada en coordenadas
  • Prueba de saltos de página en documentos de varias páginas
  • Verificar que los gráficos vectoriales se renderizan correctamente mediante SVG
  • Para software de facturación español: validar que la leyenda VERI*FACTU se imprime en la posición correcta y que el QR de verificación de la AEAT es legible

Beneficios clave de migrar a IronPDF

El paso de VectSharp a IronPDF ofrece varias ventajas para la generación de documentos:

Contenido basado en HTML: los desarrolladores web pueden aprovechar las habilidades existentes en HTML y CSS. No es necesario aprender las API de dibujo basadas en coordenadas.

Diseño automático: el ajuste de texto, la paginación y el diseño de flujo se realizan automáticamente. Sin cálculo manual de las posiciones de los elementos.

Compatibilidad con CSS moderno: CSS3 completo, incluidos diseños Flexbox y Grid. Los diseños responsivos se traducen directamente a PDF.

Ejecución de JavaScript: los gráficos interactivos con Chart.js, D3.js o Plotly se representan correctamente. El contenido dinámico funciona como se espera.

URL a PDF: captura cualquier página web como PDF (funcionalidad que no es posible con VectSharp).

Operaciones PDF: fusionar, dividir, agregar marcas de agua, protección con contraseña y firmas digitales son funciones integradas.

Conformidad regulatoria española: generación de facturas con leyenda VERI*FACTU, QR de verificación de la AEAT, soporte para TicketBAI y documentos Facturae listos para FACe —todo desde plantillas HTML estándar.

Licencia comercial predecible: alternativa directa a iText AGPL y VectSharp LGPL. La licencia propietaria de IronPDF elimina incertidumbre en revisiones de cumplimiento bajo el régimen de sanciones VeriFactu (hasta 150.000 €/año para proveedores de software no conformes) y en procesos de compra con escrutinio de licencias copyleft.

Menor verbosidad de código: HTML/CSS es declarativo y legible. El mismo documento requiere mucho menos código que el enfoque de dibujo imperativo de VectSharp.

Desarrollo activo: a medida que aumenta la adopción de .NET 10 y C# 14 hasta 2026, las actualizaciones periódicas de IronPDF garantizan la compatibilidad con las versiones actuales y futuras de .NET.

Por favor notaVectSharp is a registered trademark of its respective owner. This site is not affiliated with, endorsed by, or sponsored by VectSharp. All product names, logos, and brands are property of their respective owners. Comparisons are for informational purposes only and reflect publicly available information at the time of writing.

Preguntas Frecuentes

¿Por qué VectSharp (LGPL) no es apto para software de facturación VeriFactu en España?

VectSharp carece de soporte HTML/CSS y de renderizado Chromium, lo que le impide generar la leyenda obligatoria VERI*FACTU, el QR verificable ante la AEAT ni documentos Facturae XML en PDF/A-3. Además, su licencia LGPL puede crear fricciones en revisiones de cumplimiento cuando el software de facturación está sujeto a las obligaciones VeriFactu (RDL 15/2025) con sanciones de hasta 150.000 €/año.

¿Cómo genera IronPDF facturas conforme a VeriFactu con datos en formato peninsular?

IronPDF renderiza plantillas HTML con datos en formato es-ES: NIF/CIF (B-65.432.109), importe en formato peninsular (5.000,00 €), IVA 21% y la leyenda obligatoria VERI*FACTU. El QR de verificación de la AEAT se incrusta como imagen. Todo desde HTML/CSS estándar — sin las coordenadas manuales de DrawString() que requiere VectSharp.

¿Soporta IronPDF TicketBAI en las tres provincias vascas?

Sí. TicketBAI es obligatorio en Bizkaia (bizkaia.eus), Gipuzkoa (gipuzkoa.eus) y Araba (araba.eus), cada una con especificaciones propias. IronPDF genera el PDF de factura con el QR foral incrustado desde HTML; la firma XAdES conforme a eIDAS con certificados FNMT-RCM se gestiona en la capa del ISV.

¿Cómo cubre IronPDF los requisitos de Facturae, FACe, Crea y Crece y LOPDGDD?

IronPDF genera documentos PDF/A-3 con adjuntos Facturae XML para envío a FACe bajo el estándar EN 16931 / CIUS-ES. La Ley Crea y Crece exige factura electrónica B2B desde 2027-2028. El procesamiento on-premise facilita el cumplimiento del LOPDGDD supervisado por la AEPD sin transferir datos personales a terceros.

¿Qué ventaja tiene IronPDF sobre iText AGPL para ISVs españoles con VeriFactu?

iText se distribuye bajo licencia AGPL, que obliga a publicar el código fuente del software que lo integra. Para ISVs con software propietario de facturación bajo el régimen VeriFactu, esto es incompatible. IronPDF, con licencia comercial propietaria, actúa como componente técnico dentro del software certificado sin imponer estas obligaciones, y el SII (Suministro Inmediato de Información) de la AEAT puede beneficiarse de la generación asíncrona nativa.

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