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

Migrar de pdforge a IronPDF: Soberanía de Datos VeriFactu, LOPDGDD y TicketBAI en .NET

Por qué migrar de pdforgea IronPDF

Para los ISVs españoles que desarrollan software de facturación, pdforge presenta un problema regulatorio fundamental: envía los datos de sus facturas a servidores externos en la nube. Con el régimen VeriFactu (Real Decreto-Ley 15/2025) exigiendo que los proveedores de software de facturación generen PDFs con leyenda VERI*FACTU o Factura verificable en la sede electrónica de la AEAT de forma local, y la LOPDGDD requiriendo que los datos fiscales de clientes se traten con las garantías adecuadas, enviar contenido de facturas a servidores externos de terceros es un riesgo regulatorio que IronPDF elimina por completo.

Entendiendo pdforge

pdforge es una API de generación de PDF basada en la nube, que ofrece una forma sencilla de producir archivos PDF mediante la integración con su aplicación a través de llamadas a la API. Al descargar la tarea de creación de PDF a una API externa, los desarrolladores pueden simplificar el proceso de desarrollo. Sin embargo, pdforgepresenta inconvenientes como dependencias externas, opciones de personalización limitadas y costes de suscripción continuos que los desarrolladores deben tener en cuenta.

El problema de la dependencia de la API de la nube

pdforge procesa todos los documentos en servidores externos en la nube. Esta arquitectura plantea problemas importantes para las aplicaciones de producción:

  1. Procesamiento de servidor externo: cada PDF que genera requiere enviar su HTML/datos a los servidores de pdforge; sus documentos salen de su infraestructura.

  2. Riesgos de privacidad y cumplimiento: los datos confidenciales viajan a través de Internet a servidores de terceros. Al utilizar pdforge, los desarrolladores deben tener en cuenta las cuestiones de seguridad relacionadas con el envío de datos a una API externa. Si el contenido del PDF incluye información sensible, esto podría ser una consideración crítica.

  3. Costos de suscripción continuos: las tarifas mensuales se acumulan indefinidamente sin propiedad de activos. El modelo SaaS de pdforgeintroduce gastos operativos continuos que pueden acumularse con el tiempo.

  4. Dependencia de Internet: no se genera PDF cuando la red no está disponible.

  5. Límites de velocidad: los límites de uso de la API pueden limitar las aplicaciones de gran volumen.

  6. Latencia de la red: el tiempo de ida y vuelta agrega segundos a cada generación de PDF.

Comparación entre PDForge e IronPDF

Característica pdforge IronPDF
Tipo de implementación API en la nube Biblioteca local
Dependencias Requiere internet y autenticación API Sin dependencias externas
Personalización Control limitado sobre la generación de PDF Control total sobre la personalización
Estructura de costes Suscripción continua Opción de compra única
Seguridad Posibles problemas con los datos enviados a través de la web Mantiene el procesamiento de datos totalmente dentro del entorno local
Complejidad de configuración Configuración inicial más sencilla gracias a la manipulación externa Requiere más configuración inicial

IronPDF se distingue por ofrecer una biblioteca totalmente local, que otorga a los desarrolladores un control total sobre el proceso de creación de PDF. Esto es especialmente ventajoso para aplicaciones en las que se prefiere el manejo interno de archivos, o en las que las llamadas a API externas introducen problemas de seguridad.IronPDFprocesa todo localmente, minimizando estos riesgos.

Para los equipos que planean la adopción de .NET 10 y C# 14 hasta 2025 y 2026,IronPDFproporciona una base de procesamiento local que elimina la dependencia de la nube a la vez que añade funciones completas de manipulación de PDF.


Antes de empezar

Prerrequisitos

  1. Entorno .NET : .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acceso a NuGet : Capacidad para instalar paquetes NuGet
  3. Licencia deIronPDF: Obtenga su clave de licencia en IronPDF

Cambios en el paquete NuGet

# Remove pdforgepackages
dotnet remove package pdforge
dotnet remove package PdfForge

# Install IronPDF
dotnet add package IronPdf
# Remove pdforgepackages
dotnet remove package pdforge
dotnet remove package PdfForge

# 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";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Identificar el uso de pdforge

# Find pdforgeusage
grep -r "PdForge\|PdfClient\|HtmlToPdfRequest\|HtmlToPdfConverter" --include="*.cs" .

# Find placeholder patterns to migrate
grep -r "{totalPages}" --include="*.cs" .
# Find pdforgeusage
grep -r "PdForge\|PdfClient\|HtmlToPdfRequest\|HtmlToPdfConverter" --include="*.cs" .

# Find placeholder patterns to migrate
grep -r "{totalPages}" --include="*.cs" .
SHELL

Referencia completa de la API

Cambios en el espacio de nombres

// Before: pdforge
using PdfForge;
using System.IO;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: pdforge
using PdfForge;
using System.IO;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: pdforge
Imports PdfForge
Imports System.IO

' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
$vbLabelText   $csharpLabel

Asignaciones de clases principales

pdforge IronPDF
HtmlToPdfConverter ChromePdfRenderer
PdfClient ChromePdfRenderer
PageSize.A4 PdfPaperSize.A4
PageOrientation.Landscape PdfPaperOrientation.Landscape
Tipo de retorno: byte[] PdfDocument

Métodos

pdforge IronPDF
converter.ConvertHtmlString(html) renderer.RenderHtmlAsPdf(html)
converter.ConvertUrl(url) renderer.RenderUrlAsPdf(url)
File.WriteAllBytes(path, bytes) pdf.SaveAs(path)
Tipo de retorno: byte[] pdf.BinaryData

Mapas de configuración

pdforge IronPDF(RenderingOptions)
converter.PageSize = PageSize.A4 renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
converter.Orientation = PageOrientation.Landscape renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
Footer = "Page {page} of {totalPages}" TextFooter = new TextHeaderFooter { CenterText = "Page {page} of {total-pages}" }

Nuevas funciones no disponibles en pdforge

Características de IronPDF Descripción
PdfDocument.Merge() Combinar varios PDF
pdf.ExtractAllText() Extraer texto de PDF
pdf.ApplyWatermark() Añadir marcas de agua
pdf.SecuritySettings Protección mediante contraseña
pdf.Form Relleno de formularios
pdf.SignWithDigitalSignature() Firmas digitales

Ejemplos de migración de código

Ejemplo 1: Conversión de cadenas HTML a PDF

Antes (pdforge):

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

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
Imports PdfForge
Imports System.IO

Class Program
    Shared Sub Main()
        Dim converter = New HtmlToPdfConverter()
        Dim html = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = converter.ConvertHtmlString(html)
        File.WriteAllBytes("output.pdf", pdf)
    End Sub
End Class
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

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

La diferencia fundamental en este caso es el modelo de procesamiento y el tipo de retorno. pdforgeusa HtmlToPdfConverter con ConvertHtmlString() que devuelve una matriz byte[]—luego debe usar File.WriteAllBytes() para guardar el resultado.

IronPDF utiliza ChromePdfRenderer con RenderHtmlAsPdf() que devuelve un objeto PdfDocument. Este objeto se puede guardar directamente con SaveAs(), o puede acceder a pdf.BinaryData si necesita los bytes sin procesar. El PdfDocument también permite la manipulación (agregar marcas de agua, fusionar con otros PDF, agregar seguridad) antes de guardar. Consulte la documentación HTML a PDF para ver ejemplos completos.

Ejemplo 2: Conversión de URL a PDF

Antes (pdforge):

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

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var pdf = converter.ConvertUrl("https://example.com");
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var pdf = converter.ConvertUrl("https://example.com");
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
Imports PdfForge
Imports System.IO

Class Program
    Shared Sub Main()
        Dim converter = New HtmlToPdfConverter()
        Dim pdf = converter.ConvertUrl("https://example.com")
        File.WriteAllBytes("webpage.pdf", pdf)
    End Sub
End Class
$vbLabelText   $csharpLabel

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

pdforge usa ConvertUrl() en la clase HtmlToPdfConverter, devolviendo bytes que escribe con File.WriteAllBytes().IronPDFusa RenderUrlAsPdf() en ChromePdfRenderer, devolviendo un PdfDocument con el método incorporado SaveAs().

La principal ventaja deIronPDFes que la URL se obtiene y se renderiza localmente mediante un motor Chromium, sin necesidad de enviar datos a servidores externos. IronPDF, al ser una biblioteca local, puede ofrecer un mejor rendimiento, ya que no hay tiempo de ida y vuelta en las solicitudes web. Más información sobre Conversión de URL a PDF.

Ejemplo 3: Archivo HTML a PDF con configuración personalizada

Antes (pdforge):

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

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.PageSize = PageSize.A4;
        converter.Orientation = PageOrientation.Landscape;
        var htmlContent = File.ReadAllText("input.html");
        var pdf = converter.ConvertHtmlString(htmlContent);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package PdfForge
using PdfForge;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.PageSize = PageSize.A4;
        converter.Orientation = PageOrientation.Landscape;
        var htmlContent = File.ReadAllText("input.html");
        var pdf = converter.ConvertHtmlString(htmlContent);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
Imports PdfForge
Imports System.IO

Class Program
    Shared Sub Main()
        Dim converter As New HtmlToPdfConverter()
        converter.PageSize = PageSize.A4
        converter.Orientation = PageOrientation.Landscape
        Dim htmlContent As String = File.ReadAllText("input.html")
        Dim pdf As Byte() = converter.ConvertHtmlString(htmlContent)
        File.WriteAllBytes("output.pdf", pdf)
    End Sub
End Class
$vbLabelText   $csharpLabel

Después (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        var htmlContent = System.IO.File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        var htmlContent = System.IO.File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
        Dim htmlContent = System.IO.File.ReadAllText("input.html")
        Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Este ejemplo muestra la diferencia de patrón de configuración. pdforgeestablece propiedades directamente en el objeto convertidor (converter.PageSize = PageSize.A4, converter.Orientation = PageOrientation.Landscape).

IronPDF utiliza la propiedad RenderingOptions con enumeraciones fuertemente tipadas: renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 y renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape. Esto proporciona compatibilidad con IntelliSense y seguridad de tipos en tiempo de compilación. Tenga en cuenta queIronPDFrequiere importar el espacio de nombres IronPdf.Rendering para las enumeraciones de tamaño y orientación del papel. Consulte los tutoriales para ver más ejemplos de configuración.


Notas de migración críticas

Cambio de tipo de retorno

pdforge devuelve byte[];IronPDFdevuelve PdfDocument:

// pdforge: Returns byte[]
byte[] pdfBytes = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Get bytes if needed
// pdforge: Returns byte[]
byte[] pdfBytes = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Get bytes if needed
' pdforge: Returns byte()
Dim pdfBytes As Byte() = converter.ConvertHtmlString(html)
File.WriteAllBytes("output.pdf", pdfBytes)

' IronPDF: Returns PdfDocument
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")           ' Direct save
Dim bytes As Byte() = pdf.BinaryData ' Get bytes if needed
$vbLabelText   $csharpLabel

Cambio de clase de conversor

// pdforge: HtmlToPdfConverter
var converter = new HtmlToPdfConverter();

// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
// pdforge: HtmlToPdfConverter
var converter = new HtmlToPdfConverter();

// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
' pdforge: HtmlToPdfConverter
Dim converter As New HtmlToPdfConverter()

' IronPDF: ChromePdfRenderer
Dim renderer As New ChromePdfRenderer()
$vbLabelText   $csharpLabel

Cambios en los nombres de los métodos

// pdforgemethods
converter.ConvertHtmlString(html)
converter.ConvertUrl(url)

//IronPDFmethods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
// pdforgemethods
converter.ConvertHtmlString(html)
converter.ConvertUrl(url)

//IronPDFmethods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
' pdforgemethods
converter.ConvertHtmlString(html)
converter.ConvertUrl(url)

' IronPDFmethods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
$vbLabelText   $csharpLabel

Cambio de método de guardado

// pdforge: Manual file write
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
// pdforge: Manual file write
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
' pdforge: Manual file write
File.WriteAllBytes("output.pdf", pdfBytes)

' IronPDF: Built-in save method
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Cambio de ubicación de la configuración

pdforge utiliza propiedades del conversor;IronPDFutiliza RenderingOptions:

// pdforge: Properties on converter
converter.PageSize = PageSize.A4;
converter.Orientation = PageOrientation.Landscape;

// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// pdforge: Properties on converter
converter.PageSize = PageSize.A4;
converter.Orientation = PageOrientation.Landscape;

// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
' pdforge: Properties on converter
converter.PageSize = PageSize.A4
converter.Orientation = PageOrientation.Landscape

' IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
$vbLabelText   $csharpLabel

Sintaxis del marcador de posición de encabezado/pie

Si utiliza números de página en encabezados o pies de página, la sintaxis del marcador de posición es diferente:

// pdforgeplaceholders
"Page {page} of {totalPages}"

//IronPDFplaceholders
"Page {page} of {total-pages}"  // Note: hyphen in total-pages
// pdforgeplaceholders
"Page {page} of {totalPages}"

//IronPDFplaceholders
"Page {page} of {total-pages}"  // Note: hyphen in total-pages
' pdforgeplaceholders
"Page {page} of {totalPages}"

' IronPDFplaceholders
"Page {page} of {total-pages}"  ' Note: hyphen in total-pages
$vbLabelText   $csharpLabel

Nuevas capacidades tras la migración

Tras migrar a IronPDF, obtendrá funciones que pdforgeno puede ofrecerle:

Fusión de PDF

var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
$vbLabelText   $csharpLabel

Extracción de texto

var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim allText As String = pdf.ExtractAllText()
$vbLabelText   $csharpLabel

Marcas de agua

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

Protección con contraseña

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
$vbLabelText   $csharpLabel

Resumen comparativo de características

Característica pdforge IronPDF
HTML a PDF
URL a PDF
Configuración de la página
Capacidad offline
Procesamiento local
Fusionar PDF
Dividir PDF
Extraer texto
Marcas de agua
Relleno de formularios
Firmas digitales
Protección por contraseña
Sin límite de tarifa
Licencia única

Lista de comprobación de la migración

Pre-Migración

  • Inventariar todas las llamadas API de pdforgeen el código base
  • Documente las opciones de configuración actuales utilizadas (tamaño de página, orientación)
  • Identificar los marcadores de posición de encabezado/pie de página para actualizar ({totalPages}{total-pages})
  • Planifique el almacenamiento de la clave de licencia deIronPDF(se recomiendan variables de entorno)
  • Pruebe primero con la licencia de prueba de IronPDF

Cambios en el paquete

  • Eliminar el paquete NuGet pdforge
  • Eliminar el paquete NuGet PdfForge
  • Instalar IronPdf el paquete NuGet : dotnet add package IronPdf

Cambios de código

  • Actualizar todas las importaciones de espacios de nombres (using PdfForge;using IronPdf;)
  • Agregar using IronPdf.Rendering; para enumeraciones de tamaño y orientación del papel
  • Reemplace HtmlToPdfConverter con ChromePdfRenderer
  • Reemplace ConvertHtmlString() con RenderHtmlAsPdf()
  • Reemplace ConvertUrl() con RenderUrlAsPdf()
  • Reemplace File.WriteAllBytes() con pdf.SaveAs()
  • Mover la propiedad PageSize a RenderingOptions.PaperSize
  • Mover la propiedad Orientation a RenderingOptions.PaperOrientation
  • Actualizar nombres de enumeración (PageSize.A4PdfPaperSize.A4)
  • Actualizar nombres de enumeración (PageOrientation.LandscapePdfPaperOrientation.Landscape)
  • Actualizar la sintaxis de los marcadores de posición en encabezados y pies de página

Posmigración

  • Comprobar que la calidad del PDF se ajusta a las expectativas
  • Verificar que la operación fuera de línea funcione
  • Eliminar las credenciales de API de la configuración
  • Agregue nuevas capacidades (fusión, marcas de agua, seguridad) según sea necesario

Contexto regulatorio español: soberanía de datos en facturación electrónica

Para los ISVs españoles, la arquitectura en la nube de pdforge introduce riesgos regulatorios específicos que IronPDF elimina. El régimen VeriFactu (Real Decreto-Ley 15/2025) exige que los sistemas de facturación generen PDFs con integridad garantizada de la cadena de producción. La LOPDGDD establece restricciones sobre el tratamiento de datos fiscales de terceros.

El riesgo VeriFactu con APIs de nube

Cuando pdforge genera un PDF de factura, el HTML con todos los datos fiscales (NIF/CIF, importes, datos del cliente) se envía a servidores externos. Esto plantea tres riesgos:

  1. Soberanía de datos: Los datos de facturación salen de su infraestructura y son procesados por un tercero externo.
  2. LOPDGDD: El NIF/CIF y otros datos de identificación fiscal son datos personales bajo LOPDGDD. Su tratamiento por terceros requiere contrato DPA y garantías adecuadas.
  3. Integridad de cadena VeriFactu: La leyenda VERI*FACTU y el QR de la AEAT deben generarse con el contenido final verificado localmente.

Generación local con IronPDF

IronPDF genera facturas completamente en proceso, sin enviar datos a servidores externos:

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 consultoría .NET</td><td>1.210,00 €</td></tr>
    </table>

    <div class='verifactu-legend'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT]
    </div>
</body>
</html>";

// Todos los datos fiscales permanecen en su infraestructura — sin envío a la nube
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0001.pdf");
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 consultoría .NET</td><td>1.210,00 €</td></tr>
    </table>

    <div class='verifactu-legend'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT]
    </div>
</body>
</html>";

// Todos los datos fiscales permanecen en su infraestructura — sin envío a la nube
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0001.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
Dim html As String = "
<!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 consultoría .NET</td><td>1.210,00 €</td></tr>
    </table>

    <div class='verifactu-legend'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT]
    </div>
</body>
</html>"

' Todos los datos fiscales permanecen en su infraestructura — sin envío a la nube
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("factura-verifactu-2026-0001.pdf")
$vbLabelText   $csharpLabel

Comparación de conformidad regulatoria

Requisito pdforge (nube) IronPDF (local)
VeriFactu — generación local No (servidor externo)
LOPDGDD — datos fiscales en infraestructura propia No
TicketBAI — firma XAdES en proceso No
Facturae XML para FACe No soportado
Penalización VeriFactu (hasta 150.000 €/año) Riesgo alto Riesgo eliminado

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

  • [ ] Eliminar credenciales de API de pdforge de configuración
  • [ ] Verificar que ningún dato fiscal se envía a servidores externos
  • [ ] Implementar leyenda VERI*FACTU en la plantilla HTML de facturas
  • [ ] Añadir QR de la AEAT con URL de verificación
  • [ ] Configurar firma digital XAdES para TicketBAI si aplica (Bizkaia, Gipuzkoa, Araba)
  • [ ] Revisar cumplimiento LOPDGDD para el tratamiento local de datos de clientes

Preguntas Frecuentes

¿Por qué enviar datos de facturas a pdforge puede incumplir la LOPDGDD?

Cuando pdforge genera un PDF, el HTML de la factura —con NIF/CIF, importes y datos del cliente— se envía a servidores externos. Estos datos son datos personales bajo la LOPDGDD, supervisada por la AEPD. Su tratamiento por terceros requiere contrato DPA y garantías adecuadas. IronPDF procesa todo localmente, sin transferencias externas.

¿Qué riesgo VeriFactu introduce el uso de pdforge?

El Real Decreto-Ley 15/2025 exige que la generación de facturas con leyenda VERI*FACTU se realice con integridad garantizada en la cadena de producción. Enviar datos de facturas a un servidor de terceros como pdforge introduce un punto de fallo externo en esa cadena. Las sanciones alcanzan hasta 150.000 €/año.

¿Puede IronPDF generar la leyenda VERI*FACTU con el QR de la AEAT?

Sí. IronPDF con motor Chromium soporta CSS3 completo para renderizar la leyenda VERI*FACTU y el patrón de QR requerido por la sede electrónica de la AEAT. El procesamiento es completamente local, sin envío de datos a servidores externos.

¿Soporta IronPDF TicketBAI para Bizkaia, Gipuzkoa y Araba?

Sí. IronPDF incluye firmas digitales XAdES requeridas por TicketBAI en los tres territorios históricos vascos. pdforge, al ser un servicio de nube, no puede proporcionar estas capacidades de firma nativa.

¿Qué ahorro de costes ofrece IronPDF frente al modelo de suscripción de pdforge?

pdforge cobra por suscripción mensual y uso de API, con costes que se acumulan indefinidamente. IronPDF ofrece licencia de compra única por desarrollador, con actualizaciones incluidas. Para ISVs de facturación con volúmenes altos, el ahorro puede ser significativo a largo plazo.

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