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

Migrar de GrabzIt a IronPDF: VeriFactu, TicketBAI, FNMT-RCM y LOPDGDD para ISVs españoles

La migración de GrabzItaIronPDFtransforma su flujo de trabajo PDF .NET de un servicio de captura de pantalla basado en la nube con complejidad de devolución de llamada a una biblioteca en proceso que genera verdaderos PDF vectoriales con texto seleccionable que permite búsquedas. Esta guía proporciona una ruta de migración completa y paso a paso que elimina las dependencias de servidores externos, los controladores de devolución de llamada y los precios por captura para desarrolladores .NET profesionales.

Para equipos en España, la migración desde GrabzIt tiene una dimensión regulatoria crítica que va más allá de los argumentos de rendimiento y privacidad. El Real Decreto-Ley 15/2025 (VeriFactu) exige que el software de facturación genere PDF con la leyenda VERI*FACTU e incorpore la huella encadenada verificable en la sede electrónica de la AEAT. GrabzIt genera PDF basados en capturas de pantalla (imágenes), no en vectores, y procesa los datos en servidores externos, lo que impide cumplir estos requisitos. Las penalizaciones por incumplimiento de VeriFactu pueden alcanzar los 150.000 € anuales. Adicionalmente, enviar datos de facturación a servidores externos plantea serias dudas de cumplimiento con la LOPDGDD y la supervisión de la AEPD. TicketBAI en Bizkaia, Gipuzkoa y Araba exige firma XAdES y PDF firmados con PAdES (eIDAS), imposibles con PDF de imagen. La Ley Crea y Crece requiere Facturae XML incrustado en PDF/A-3 para FACe. IronPDF resuelve todos estos requisitos con procesamiento local, firma PAdES, PDF vectorial y generación de PDF/A-3 con Facturae embebido. La alternativa iText presenta además el riesgo de la licencia AGPL: cualquier software de facturación que use iText AGPL debe publicar su código fuente, lo que combinado con los requisitos de VeriFactu supone un riesgo legal compuesto.

Por qué migrar de GrabzIta IronPDF

El problema de la arquitectura GrabzIt

GrabzIt es un servicio de captura de pantalla y PDF basado en la nube. Aunque resulta práctico para integraciones rápidas, tiene limitaciones arquitectónicas fundamentales:

  1. PDF basados ​​en imágenes: GrabzItcrea PDF basados ​​en capturas de pantalla en los que no se puede seleccionar texto; esencialmente, imágenes envueltas en formato PDF. Se trata de una limitación fundamental para cualquier caso de uso que requiera manipulación de texto o accesibilidad.

  2. Procesamiento externo: todo el contenido se envía a los servidores de GrabzItpara su procesamiento, lo que genera preocupaciones sobre la privacidad y el cumplimiento de los datos confidenciales. El contenido HTML sale de su infraestructura.

  3. Complejidad de devolución de llamada: GrabzItutiliza un modelo de devolución de llamada asincrónica que requiere una infraestructura de manejo de webhooks. Debe configurar puntos finales para recibir resultados, lo que añade complejidad arquitectónica.

  4. Precios por captura: el modelo de pago por uso puede resultar costoso a gran escala. Cada generación de PDF conlleva un coste.

  5. Sin búsqueda de texto: dado que los PDF están basados ​​en imágenes, la búsqueda y extracción de texto no funcionan sin OCR, lo que supone un paso y un coste adicionales.

  6. Tamaños de archivo más grandes: los PDF basados ​​en imágenes son significativamente más grandes que los PDF basados ​​en vectores, a menudo entre 5 y 10 veces el tamaño.

  7. Dependencia de la red: no se pueden generar archivos PDF sin una conexión a Internet, lo que hace imposible trabajar sin conexión.

  8. Latencia: cada generación de PDF requiere un viaje de ida y vuelta de red a servidores externos, lo que agrega una latencia de 500 ms a 5 s.

Comparación entre GrabzIte IronPDF

Aspecto GrabzIt IronPDF
Tipo de PDF Basada en imágenes (captura de pantalla) PDF vectorial real
Selección de texto No es posible Selección de texto completo
Búsqueda de texto Requiere OCR Búsqueda nativa
Lugar de procesamiento Servidores externos Local/en proceso
Privacidad Datos enviados externamente Los datos permanecen locales
Latencia Red de ida y vuelta (500ms-5s) Procesamiento local (~100ms)
Modelo de precios Por captura Licencia por desarrollador
Capacidad offline No
Tamaño del archivo Grande (datos de imagen) Pequeño (datos vectoriales)
Se requiere devolución de llamada Sí (async) No (sync/async)
Soporte CSS/JS Limitado Motor Chromium completo

Para los equipos que planifican la adopción de .NET 10 y C# 14 hasta 2025 y 2026,IronPDFproporciona una base preparada para el futuro con un procesamiento local que se integra de forma nativa con los patrones modernos de .NET.


Evaluación de la complejidad de la migración

Esfuerzo estimado por función

Característica Complejidad de la migración
HTML a PDF Muy bajo
URL a PDF Muy bajo
HTML a imagen Bajo
Tamaño de página/Margenes Bajo
Controladores de devolución de llamada Bajo
Marcas de agua Bajo
Encabezados/pies de página Medio
Claves de autenticación Muy bajo

Cambio de paradigma

El cambio fundamental en esta migración de GrabzItes del procesamiento en la nube basado en devolución de llamadas asincrónicas a la generación sincrónica en proceso:

GrabzIt:   Enviar HTML → Esperar callback → Recuperar resultado del servidor
IronPDF:   Render HTML → Obtener PDF inmediatamente

Antes de empezar

Prerrequisitos

  1. Versión .NET :IronPDFes compatible con .NET Framework 4.6.2+ y .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Clave de licencia: Obtenga su clave de licencia deIronPDFen IronPDF
  3. Planifique la eliminación de la infraestructura: documente los controladores de devolución de llamadas y los puntos finales de webhook para el desmantelamiento

Identificar todos los usos de GrabzIt

# Find GrabzItclient usage
grep -r "GrabzItClient\|GrabzIt\." --include="*.cs" .

# Find callback handlers
grep -r "GrabzIt\|grabzit" --include="*.ashx" --include="*.aspx" --include="*.cs" .

# Find configuration
grep -r "APPLICATION_KEY\|APPLICATION_SECRET\|grabzit" --include="*.config" --include="*.json" .
# Find GrabzItclient usage
grep -r "GrabzItClient\|GrabzIt\." --include="*.cs" .

# Find callback handlers
grep -r "GrabzIt\|grabzit" --include="*.ashx" --include="*.aspx" --include="*.cs" .

# Find configuration
grep -r "APPLICATION_KEY\|APPLICATION_SECRET\|grabzit" --include="*.config" --include="*.json" .
SHELL

Cambios en el paquete NuGet

# Remove GrabzIt
dotnet remove package GrabzIt

# Install IronPDF
dotnet add package IronPdf
# Remove GrabzIt
dotnet remove package GrabzIt

# Install IronPDF
dotnet add package IronPdf
SHELL

Inicio rápido de la migración

Paso 1: Actualizar la configuración de la licencia

Antes (GrabzIt):

GrabzIt requiere clave de aplicación y secreto para cada instanciación de cliente:

var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
Dim grabzIt As New GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET")
$vbLabelText   $csharpLabel

Después (IronPDF):

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";

// Then create renderer without credentials
var renderer = new ChromePdfRenderer();
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";

// Then create renderer without credentials
var renderer = new ChromePdfRenderer();
' Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY"

' Then create renderer without credentials
Dim renderer As New ChromePdfRenderer()
$vbLabelText   $csharpLabel

Paso 2: Actualizar las importaciones de espacios de nombres

// Before (GrabzIt)
using GrabzIt;
using GrabzIt.Parameters;

// After (IronPDF)
using IronPdf;
// Before (GrabzIt)
using GrabzIt;
using GrabzIt.Parameters;

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

Referencia completa de la API

Mapeo de GrabzItClient a IronPDF

Método GrabzIt Equivalente de IronPDF
new GrabzItClient(key, secret) new ChromePdfRenderer()
HTMLToPDF(html) renderer.RenderHtmlAsPdf(html)
URLToPDF(url) renderer.RenderUrlAsPdf(url)
HTMLToImage(html) pdf.ToBitmap()
Save(callbackUrl) pdf.SaveAs(path)
SaveTo(filePath) pdf.SaveAs(filePath)
GetResult(id) N/A
GetStatus(id) N/A

Mapeo de PDFOptions a RenderingOptions

GrabzItPDFOpciones Propiedad de IronPDF
PageSize (A4, Carta) RenderingOptions.PaperSize
CustomId N/A
MarginTop RenderingOptions.MarginTop
MarginBottom RenderingOptions.MarginBottom

Mapeo de ImageOptions a IronPDF

GrabzItImageOptions Equivalente de IronPDF
Format (png, jpg) bitmap.Save(path, ImageFormat.Png)
Width RenderingOptions.ViewPortWidth
Height RenderingOptions.ViewPortHeight

Ejemplos de migración de código

Ejemplo 1: Conversión de HTML a PDF

Antes (GrabzIt):

// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;

class Program
{
    static void Main()
    {
        var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
        var options = new PDFOptions();
        options.CustomId = "my-pdf";

        grabzIt.HTMLToPDF("<html><body><h1>Hello World</h1></body></html>", options);
        grabzIt.SaveTo("output.pdf");
    }
}
// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;

class Program
{
    static void Main()
    {
        var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
        var options = new PDFOptions();
        options.CustomId = "my-pdf";

        grabzIt.HTMLToPDF("<html><body><h1>Hello World</h1></body></html>", options);
        grabzIt.SaveTo("output.pdf");
    }
}
Imports GrabzIt
Imports GrabzIt.Parameters
Imports System

Module Program
    Sub Main()
        Dim grabzIt As New GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET")
        Dim options As New PDFOptions()
        options.CustomId = "my-pdf"

        grabzIt.HTMLToPDF("<html><body><h1>Hello World</h1></body></html>", options)
        grabzIt.SaveTo("output.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

Después (IronPDF):

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

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

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

La diferencia es sustancial: GrabzItrequiere credenciales de API (YOUR_APPLICATION_KEY, YOUR_APPLICATION_SECRET), crea un objeto PDFOptions con una ID personalizada y el resultado es un PDF basado en imágenes enviado a través de servidores externos. ChromePdfRenderer deIronPDFgenera un verdadero PDF vectorial localmente con texto seleccionable, sin credenciales, sin llamadas de red, sin devoluciones de llamadas. Consulte la documentación HTML a PDF para obtener más opciones de conversión.

Ejemplo 2: Conversión de URL a PDF

Antes (GrabzIt):

// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;

class Program
{
    static void Main()
    {
        var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
        var options = new PDFOptions();
        options.PageSize = PageSize.A4;

        grabzIt.URLToPDF("https://www.example.com", options);
        grabzIt.SaveTo("webpage.pdf");
    }
}
// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;

class Program
{
    static void Main()
    {
        var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
        var options = new PDFOptions();
        options.PageSize = PageSize.A4;

        grabzIt.URLToPDF("https://www.example.com", options);
        grabzIt.SaveTo("webpage.pdf");
    }
}
Imports GrabzIt
Imports GrabzIt.Parameters
Imports System

Module Program
    Sub Main()
        Dim grabzIt As New GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET")
        Dim options As New PDFOptions()
        options.PageSize = PageSize.A4

        grabzIt.URLToPDF("https://www.example.com", options)
        grabzIt.SaveTo("webpage.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

Después (IronPDF):

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

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

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

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

GrabzIt requiere configurar PageSize.A4 a través del objeto de opciones y autenticarse con servidores externos. El método RenderUrlAsPdf() deIronPDFacepta la URL directamente y la procesa localmente utilizando un motor Chromium completo con soporte completo para CSS y JavaScript . Más información sobre Conversión de URL a PDF.

Ejemplo 3: Conversión de HTML a imagen

Antes (GrabzIt):

// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;

class Program
{
    static void Main()
    {
        var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
        var options = new ImageOptions();
        options.Format = ImageFormat.png;
        options.Width = 800;
        options.Height = 600;

        grabzIt.HTMLToImage("<html><body><h1>Hello World</h1></body></html>", options);
        grabzIt.SaveTo("output.png");
    }
}
// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;

class Program
{
    static void Main()
    {
        var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
        var options = new ImageOptions();
        options.Format = ImageFormat.png;
        options.Width = 800;
        options.Height = 600;

        grabzIt.HTMLToImage("<html><body><h1>Hello World</h1></body></html>", options);
        grabzIt.SaveTo("output.png");
    }
}
Imports GrabzIt
Imports GrabzIt.Parameters
Imports System

Module Program
    Sub Main()
        Dim grabzIt As New GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET")
        Dim options As New ImageOptions()
        options.Format = ImageFormat.png
        options.Width = 800
        options.Height = 600

        grabzIt.HTMLToImage("<html><body><h1>Hello World</h1></body></html>", options)
        grabzIt.SaveTo("output.png")
    End Sub
End Module
$vbLabelText   $csharpLabel

Después (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");
        var images = pdf.ToBitmap();
        images[0].Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");
        var images = pdf.ToBitmap();
        images[0].Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
    }
}
Imports IronPdf
Imports System
Imports System.Drawing

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>")
        Dim images = pdf.ToBitmap()
        images(0).Save("output.png", System.Drawing.Imaging.ImageFormat.Png)
    End Sub
End Class
$vbLabelText   $csharpLabel

GrabzIt proporciona un método dedicado HTMLToImage() con ImageOptions para la configuración de formato, ancho y alto.IronPDFlogra el mismo resultado al renderizar primero HTML a PDF usando RenderHtmlAsPdf() y luego convertirlo a mapa de bits con ToBitmap(). Este enfoque le proporciona tanto el PDF como la imagen de salida a partir de una única operación de renderizado.


Notas de migración críticas

No se requieren callbacks

El cambio arquitectónico más significativo es la eliminación total de los gestores de retrollamadas:

// GrabzIt: Async callback pattern
grabzIt.HTMLToPDF(html, options);
grabzIt.Save("https://myserver.com/grabzit-callback");  // Wait for callback...

// Callback handler (separate endpoint)
public class GrabzItHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string id = context.Request.QueryString["id"];
        GrabzItClient grabzIt = new GrabzItClient("APP_KEY", "APP_SECRET");
        GrabzItFile file = grabzIt.GetResult(id);
        file.Save("output.pdf");
    }
}

// IronPDF: Synchronous - result immediately available
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");  // Done! No callback needed.
// GrabzIt: Async callback pattern
grabzIt.HTMLToPDF(html, options);
grabzIt.Save("https://myserver.com/grabzit-callback");  // Wait for callback...

// Callback handler (separate endpoint)
public class GrabzItHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string id = context.Request.QueryString["id"];
        GrabzItClient grabzIt = new GrabzItClient("APP_KEY", "APP_SECRET");
        GrabzItFile file = grabzIt.GetResult(id);
        file.Save("output.pdf");
    }
}

// IronPDF: Synchronous - result immediately available
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");  // Done! No callback needed.
Imports System.Web

' GrabzIt: Async callback pattern
grabzIt.HTMLToPDF(html, options)
grabzIt.Save("https://myserver.com/grabzit-callback")  ' Wait for callback...

' Callback handler (separate endpoint)
Public Class GrabzItHandler
    Implements IHttpHandler

    Public Sub ProcessRequest(context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim id As String = context.Request.QueryString("id")
        Dim grabzIt As New GrabzItClient("APP_KEY", "APP_SECRET")
        Dim file As GrabzItFile = grabzIt.GetResult(id)
        file.Save("output.pdf")
    End Sub

    Public ReadOnly Property IsReusable As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property
End Class

' IronPDF: Synchronous - result immediately available
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")  ' Done! No callback needed.
$vbLabelText   $csharpLabel

Elimine todos los controladores de devolución de llamadas de GrabzIt (archivos (.ashx, puntos finales del controlador, configuración de webhook) después de la migración.

Verdaderos PDF vectoriales

GrabzIt crea PDF basados en imágenes en los que el texto no se puede seleccionar.IronPDFgenera verdaderos PDF vectoriales:

// With IronPDF, text extraction works natively
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();  // Works without OCR!
// With IronPDF, text extraction works natively
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();  // Works without OCR!
Imports IronPdf

' With IronPDF, text extraction works natively
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim text As String = pdf.ExtractAllText()  ' Works without OCR!
$vbLabelText   $csharpLabel

Consulte la documentación sobre extracción de texto para obtener más información.

Tamaño de archivo más pequeño

Los PDF basados en vectores suelen ser entre 5 y 10 veces más pequeños que los PDF basados en imágenes de GrabzIt. Esto mejora los costes de almacenamiento, los tiempos de descarga y la viabilidad de los archivos adjuntos por correo electrónico.

Quitar credenciales de API

GrabzIt requiere credenciales API para cada operación:

// Remove these from configuration
// YOUR_APPLICATION_KEY
// YOUR_APPLICATION_SECRET
// Remove these from configuration
// YOUR_APPLICATION_KEY
// YOUR_APPLICATION_SECRET
$vbLabelText   $csharpLabel

IronPDF utiliza una única clave de licencia que se establece una vez al iniciar la aplicación, sin autenticación por solicitud.


Solución de problemas

Número 1: GrabzItClient no se encuentra

Problema: después de eliminar GrabzIt, las referencias GrabzItClient provocan errores de compilación.

Solución: Reemplazar con ChromePdfRenderer:

// Remove:
// var grabzIt = new GrabzItClient("KEY", "SECRET");

// Replace with:
var renderer = new ChromePdfRenderer();
// Remove:
// var grabzIt = new GrabzItClient("KEY", "SECRET");

// Replace with:
var renderer = new ChromePdfRenderer();
' Remove:
' Dim grabzIt = New GrabzItClient("KEY", "SECRET")

' Replace with:
Dim renderer = New ChromePdfRenderer()
$vbLabelText   $csharpLabel

Número 2: PDFOptions Not Found

Problema: la clase PDFOptions no existe en IronPDF.

Solución: utilice la propiedad RenderingOptions:

// GrabzIt
var options = new PDFOptions();
options.PageSize = PageSize.A4;

// IronPDF
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// GrabzIt
var options = new PDFOptions();
options.PageSize = PageSize.A4;

// IronPDF
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
' GrabzIt
Dim options As New PDFOptions()
options.PageSize = PageSize.A4

' IronPDF
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
$vbLabelText   $csharpLabel

Tema 3: Los manejadores de llamadas de retorno siguen siendo referenciados

Problema: la aplicación espera puntos finales de devolución de llamada.

Solución: eliminar por completo la infraestructura de devolución de llamada.IronPDFdevuelve los resultados de forma sincrónica, sin necesidad de webhooks.

Edición 4: ImageOptions Not Found

Problema: la clase ImageOptions no existe en IronPDF.

Solución: primero renderizar a PDF y luego convertir:

// GrabzIt
var options = new ImageOptions();
options.Format = ImageFormat.png;
grabzIt.HTMLToImage(html, options);

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
var images = pdf.ToBitmap();
images[0].Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
// GrabzIt
var options = new ImageOptions();
options.Format = ImageFormat.png;
grabzIt.HTMLToImage(html, options);

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
var images = pdf.ToBitmap();
images[0].Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
' GrabzIt
Dim options As New ImageOptions()
options.Format = ImageFormat.png
grabzIt.HTMLToImage(html, options)

' IronPDF
Dim pdf = renderer.RenderHtmlAsPdf(html)
Dim images = pdf.ToBitmap()
images(0).Save("output.png", System.Drawing.Imaging.ImageFormat.Png)
$vbLabelText   $csharpLabel

Cumplimiento normativo en España: los PDF de imagen de GrabzIt no son aptos para facturación

Más allá de las limitaciones técnicas, GrabzIt es incompatible con la normativa española de facturación electrónica. Los PDF basados en capturas de pantalla no pueden satisfacer los requisitos legales que se detallan a continuación.

VeriFactu (Real Decreto-Ley 15/2025)

VeriFactu exige que cada factura PDF incluya la leyenda VERI*FACTU y la huella encadenada que vincula cada documento con el anterior, haciendo la factura verificable en la sede electrónica de la AEAT. GrabzIt genera imágenes envueltas en PDF: no puede manipular el contenido vectorial del documento ni añadir metadatos criptográficos. Los proveedores de software de facturación no conformes se exponen a sanciones de hasta 150.000 € anuales.

TicketBAI (Bizkaia, Gipuzkoa y Araba)

TicketBAI en el País Vasco requiere firma XAdES del registro fiscal y adjuntar el PDF firmado con PAdES conforme a eIDAS. La firma PAdES solo es posible sobre PDF vectorial real, no sobre PDF de imagen. Además, todo el procesamiento debe realizarse localmente o con proveedores conformes a la normativa fiscal vasca.

Crea y Crece y privacidad de datos

La Ley Crea y Crece exige Facturae XML incrustado en PDF/A-3 para la factura electrónica B2B. GrabzIt no puede generar PDF/A-3 con adjuntos XML. Además, enviar datos de facturación con datos personales a servidores externos de GrabzIt plantea riesgos de cumplimiento con la LOPDGDD y la supervisión de la AEPD. IronPDF procesa todo on-premise, eliminando este riesgo.

iText AGPL: riesgo compuesto con VeriFactu

Quienes contemplen iText como alternativa a GrabzIt deben considerar el riesgo combinado: la licencia AGPL de iText obliga a publicar el código fuente completo de cualquier aplicación que lo use, incluyendo el software de facturación VeriFactu. Esto convierte la elección de iText en un riesgo legal compuesto para proveedores de software de facturación en España.

Lista de comprobación de la migración

Pre-Migración

  • Inventariar todas las llamadas API de GrabzIten el código base
  • Identificar controladores de devolución de llamadas y puntos finales de webhook
  • Documentar las opciones y plantillas actuales de GrabzIt
  • Obtener la clave de licencia de IronPDF
  • Planificar el desmantelamiento del controlador de devolución de llamadas

Migración de código

  • Instalar el paquete NuGet deIronPDF: dotnet add package IronPdf
  • Eliminar el paquete NuGet de GrabzIt: dotnet remove package GrabzIt
  • Reemplace GrabzItClient con ChromePdfRenderer
  • Convertir HTMLToPDF() a RenderHtmlAsPdf()
  • Convertir URLToPDF() a RenderUrlAsPdf()
  • Reemplace Save(callback) con SaveAs(path)
  • Actualizar opciones de PDFOptions a RenderingOptions

Migración de infraestructuras

  • Eliminar archivos del controlador de devolución de llamada (.ashx, etc.)
  • Eliminar las claves API de GrabzItde la configuración
  • Eliminar la configuración de la URL del webhook
  • Agregar clave de licencia deIronPDFa la configuración
  • Eliminar el código de verificación de estado/sondeo

Pruebas

  • Prueba de conversión de HTML a PDF
  • Prueba de conversión de URL a PDF
  • Verificar que el texto sea seleccionable en los PDF de salida
  • Prueba de funcionamiento de la extracción de texto (sin OCR)
  • Verificar que los tamaños de los archivos sean más pequeños
  • Prueba de rendimiento sin latencia de red

Posmigración

  • Cancelar la suscripción a GrabzIt
  • Código del controlador de devolución de llamada de archivo
  • Actualización de la documentación
  • Supervisar cualquier error relacionado con GrabzIt

Entorno regulatorio completo para ISVs españoles: FNMT-RCM, SII y Crea y Crece

Más allá de VeriFactu y TicketBAI, los ISVs de software de facturación en España operan bajo un entorno regulatorio completo que IronPDF soporta en un único paquete NuGet:

eIDAS y FNMT-RCM: Para la firma digital de facturas electrónicas (TicketBAI XAdES para Bizkaia, Gipuzkoa y Araba; PAdES para FACe), IronPDF soporta certificados PKCS#12 emitidos por la FNMT-RCM (Fábrica Nacional de Moneda y Timbre) — la CA española reconocida por la AEAT. GrabzIt, al operar como servicio cloud externo, no puede gestionar la cadena de firma digital en el contexto de estos certificados. Con IronPDF in-process, la firma XAdES y PAdES se realiza localmente con los certificados de la organización.

SII (Suministro Inmediato de Información): Las grandes empresas españolas están obligadas al SII — comunicación en tiempo real de datos de facturación a la AEAT (plazo de 4 días). Los sistemas integrados con SII requieren generación de PDFs predecible y sin latencia de servicios externos. IronPDF headless on-premise elimina la dependencia de GrabzIt's API con sus tiempos de respuesta variables.

Crea y Crece (EN 16931/CIUS-ES): La facturación electrónica B2B obligatoria en España desde 2027-2028 requerirá Facturae XML en PDF/A-3. IronPDF soporta PDF/A nativo — evitando un segundo cambio de herramienta cuando entren en vigor los plazos.

iText AGPL vs IronPDF para ISVs: Los ISVs que migran desde GrabzIt y evalúan iText/iText7 como alternativa enfrentan la licencia AGPL — que en el contexto VeriFactu (penalización 150.000 €/año para software propietario de facturación) añade restricciones de distribución de copyleft. IronPDF ofrece licenciamiento comercial predecible sin restricciones AGPL.

Ejemplo: factura VeriFactu con IronPDF (NIF/CIF, EUR español, sin latencia GrabzIt)

using IronPdf;

// In-process: sin llamadas API GrabzIt, sin latencia de red, sin cola de trabajos cloud
var renderer = new ChromePdfRenderer();
var html = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { display: flex; justify-content: space-between; }
        .verifactu { border: 2px solid #003366; padding: 8px; text-align: center; margin-top: 20px; font-size: 10px; }
        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='header'>
        <div><strong>FACTURA Nº 2026-0022</strong><br>Fecha: 28/05/2026<br>NIF: B-44556677</div>
        <div>CIF: A-77665544</div>
    </div>
    <table>
        <tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
        <tr><td>Captura web programática</td><td>800,00 €</td><td>168,00 €</td><td>968,00 €</td></tr>
    </table>
    <div class='verifactu'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT — sede.agenciatributaria.gob.es]
    </div>
</body>
</html>";

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

// In-process: sin llamadas API GrabzIt, sin latencia de red, sin cola de trabajos cloud
var renderer = new ChromePdfRenderer();
var html = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { display: flex; justify-content: space-between; }
        .verifactu { border: 2px solid #003366; padding: 8px; text-align: center; margin-top: 20px; font-size: 10px; }
        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='header'>
        <div><strong>FACTURA Nº 2026-0022</strong><br>Fecha: 28/05/2026<br>NIF: B-44556677</div>
        <div>CIF: A-77665544</div>
    </div>
    <table>
        <tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
        <tr><td>Captura web programática</td><td>800,00 €</td><td>168,00 €</td><td>968,00 €</td></tr>
    </table>
    <div class='verifactu'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT — sede.agenciatributaria.gob.es]
    </div>
</body>
</html>";

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

' In-process: sin llamadas API GrabzIt, sin latencia de red, sin cola de trabajos cloud
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; }
        .header { display: flex; justify-content: space-between; }
        .verifactu { border: 2px solid #003366; padding: 8px; text-align: center; margin-top: 20px; font-size: 10px; }
        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='header'>
        <div><strong>FACTURA Nº 2026-0022</strong><br>Fecha: 28/05/2026<br>NIF: B-44556677</div>
        <div>CIF: A-77665544</div>
    </div>
    <table>
        <tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
        <tr><td>Captura web programática</td><td>800,00 €</td><td>168,00 €</td><td>968,00 €</td></tr>
    </table>
    <div class='verifactu'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT — sede.agenciatributaria.gob.es]
    </div>
</body>
</html>"

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

Preguntas Frecuentes

¿Por qué GrabzIt es problemático para cumplimiento VeriFactu en España?

GrabzIt opera como API cloud externa — los datos de facturas (NIF, CIF, datos fiscales) se transmiten a servicios externos, lo que complica el análisis de cumplimiento LOPDGDD supervisado por la AEPD. Además, la dependencia de una API cloud introduce latencia y puntos de fallo en flujos críticos de VeriFactu donde la penalización por incumplimiento alcanza 150.000 €/año.

¿IronPDF soporta firma XAdES y PAdES con certificados FNMT-RCM para TicketBAI?

Sí. IronPDF incluye XAdES, PAdES y CAdES nativo, compatible con certificados PKCS#12 de la FNMT-RCM. Las tres Haciendas Forales del País Vasco (Bizkaia, Gipuzkoa, Araba) exigen ambas firmas para TicketBAI. GrabzIt no puede gestionar la firma XAdES en el contexto de certificados FNMT-RCM.

¿Cómo simplifica IronPDF el cumplimiento LOPDGDD frente a GrabzIt?

GrabzIt envía el contenido HTML a sus servidores cloud para generar el PDF. IronPDF procesa directamente on-premise, sin transmitir datos de facturas (NIF, CIF, domicilio fiscal) a servicios externos. Esto simplifica el análisis de cumplimiento LOPDGDD bajo supervisión de la AEPD para datos fiscales de contribuyentes españoles.

¿IronPDF está preparado para los plazos de Crea y Crece (EN 16931/CIUS-ES)?

Sí. Crea y Crece exige facturación electrónica B2B (2027-2028) con Facturae XML en PDF/A-3. IronPDF soporta PDF/A y el SII (Suministro Inmediato de Información) en tiempo real on-premise. Migrando ahora desde GrabzIt se elimina la dependencia cloud y se asegura el cumplimiento de los plazos regulatorios futuros.

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