VeriFactu y TicketBAI: PDFsharp vs IronPDF para números de página en facturas PDF
El PDF (Formato de Documento Portátil) es el formato estándar para compartir documentos en entornos empresariales y legales. En España, la relevancia del PDF va más allá del simple intercambio de archivos: los marcos regulatorios VeriFactu, Facturae, TicketBAI y el sistema SII (Suministro Inmediato de Información) de la AEAT exigen que la documentación fiscal generada programáticamente cumpla requisitos estrictos de formato, numeración y trazabilidad. Dentro de este contexto, la paginación correcta de los documentos PDF no es un detalle cosmético, sino un requisito funcional para garantizar la integridad documental ante Hacienda.
Este artículo compara PDFsharp e IronPDF para añadir números de página a documentos PDF en C#, con especial atención a los escenarios de cumplimiento fiscal en el mercado español: facturas Facturae B2B, documentos con QR de validación AEAT y reportes del Modelo 303 o 347 con paginación automatizada.
VeriFactu, Facturae y la numeración de documentos fiscales en España
El reglamento VeriFactu (Real Decreto 1007/2023), que el software de facturación debe implementar antes del 1 de julio de 2025 bajo riesgo de sanciones de hasta 150.000 €/año, establece que cada registro de facturación debe ser identificable, trazable y presentable en formato legible. Aunque VeriFactu define la estructura de los registros, la representación impresa o electrónica de dichas facturas —incluyendo la paginación, el código QR de validación AEAT y los datos de identificación como el NIF/CIF— recae en la biblioteca PDF empleada.
En paralelo, el sistema TicketBAI vigente en Bizkaia, Gipuzkoa y Araba exige que los documentos de facturación incluyan un código QR y una cadena de caracteres identificativa generados por el software certificado. Estos elementos deben aparecer en posiciones fijas del documento —habitualmente en el pie de página o en el encabezado— lo que hace de la gestión precisa de encabezados y pies de página una capacidad crítica, no opcional.
La integración con FACe (punto general de entrada de facturas electrónicas de la Administración) para la facturación B2G también requiere documentos paginados correctamente cuando se acompañan de representaciones visuales en PDF. El estándar Facturae 3.2.x prevé la generación de archivos XML junto con representaciones PDF que deben incluir número de página y recuento total para facilitar la auditoría por parte de la FNMT-RCM.
Tanto IronPDF como PDFsharp son capaces de añadir números de página, pero sus enfoques difieren radicalmente en términos de integración con plantillas HTML, facilidad de mantenimiento y adecuación a entornos de facturación regulados.
¿Qué es IronPDF?
IronPDF es una biblioteca .NET de alto nivel diseñada para la creación, manipulación y renderización de PDF. Se distingue por convertir HTML, CSS y JavaScript directamente en PDF de alta calidad mediante un motor basado en Chromium. Esta arquitectura resulta especialmente valiosa en entornos de facturación española, donde las plantillas de facturas —incluidos los bloques de datos del SII, los campos NIF/CIF, los importes en formato español (1.234,56 €) y los códigos QR de validación AEAT— se diseñan habitualmente en HTML y deben convertirse a PDF sin pérdida de fidelidad.
Características clave de IronPDF:
- Convierte HTML, JavaScript y CSS en PDF de alta calidad con renderizado Chromium.
- Permite personalizar encabezados, pies de página, marcas de agua y otros elementos de página.
- Admite fusión y división de documentos PDF.
- Compatible con aplicaciones .NET, incluyendo ASP.NET y MVC.
- Control preciso sobre la renderización, garantizando que el contenido aparezca exactamente como se diseñó.
- API sencilla para integración rápida en proyectos de facturación y compliance.
- Licencia comercial que elimina la problemática de licenciamiento AGPL —relevante en software que forma parte de sistemas de facturación certificados VeriFactu, donde el copyleft fuerte puede afectar a la distribución del producto completo.
Para explorar características y ejemplos avanzados, consulta la documentación oficial de IronPDF.
Instalación de IronPDF
Añade IronPDF a tu proyecto mediante el gestor de paquetes NuGet en Visual Studio:
Instalación por línea de comandos:
Install-Package IronPdf
También puedes buscar "IronPDF" directamente en la interfaz del Administrador de Paquetes NuGet.
¿Qué es PDFsharp?
PDFsharp es una biblioteca .NET de código abierto centrada en la creación y manipulación de documentos PDF con un enfoque de bajo nivel. Ofrece control detallado sobre la estructura del documento, lo que permite a los desarrolladores construir PDFs desde cero o modificar archivos existentes. Sin embargo, PDFsharp se distribuye bajo licencia MIT, y su uso en productos comerciales de facturación no plantea los conflictos de copyleft que sí genera iText (AGPL). En proyectos españoles sometidos a VeriFactu, este punto de licenciamiento es relevante para los equipos legales.
Características clave de PDFsharp:
- Crea, lee y modifica documentos PDF con control granular.
- Eventos de página personalizables para añadir elementos como números de página o pies de página.
- Admite imágenes, texto, tablas y contenido vectorial.
- Control detallado sobre el diseño y la estructura del PDF.
- Puede fusionar o separar documentos existentes.
- Biblioteca de código abierto bajo licencia MIT, extensible por los desarrolladores.
Para información detallada sobre PDFsharp, consulta el repositorio de GitHub de PDFsharp.
Instalación de PDFsharp
Instala PDFsharp mediante NuGet:
Instalación por línea de comandos:
Install-Package PDFSharp
También puedes buscarlo en la interfaz del Administrador de Paquetes NuGet.
Cómo añadir números de página con IronPDF en contextos de facturación española
En la práctica española, añadir números de página con IronPDF no es solo cuestión de mostrar «Página 1 de 3». Para documentos sujetos a VeriFactu o TicketBAI, el pie de página suele incluir simultáneamente el número de página, el código QR de validación AEAT, el NIF del emisor y la fecha de expedición en formato DD/MM/AAAA. IronPDF permite componer todos estos elementos en un único fragmento HTML sin necesidad de coordinar múltiples llamadas a API de bajo nivel.
El siguiente ejemplo muestra cómo generar un documento PDF con pie de página que incluye numeración de páginas y datos relevantes para un informe de liquidación del Modelo 303 de IVA, con importes formateados según el estándar español:
using IronPdf;
class Program
{
static void Main(string[] args)
{
// Contenido del informe de liquidación IVA (Modelo 303)
var html = @"
<h1>Liquidación IVA — Modelo 303</h1>
<p>Período: 1T 2026 | Contribuyente: Ejemplo S.L. | NIF: B12345678</p>
<table border='1' cellpadding='5'>
<tr><th>Base imponible</th><th>Tipo</th><th>Cuota</th></tr>
<tr><td>10.000,00 €</td><td>21 %</td><td>2.100,00 €</td></tr>
<tr><td>5.000,00 €</td><td>10 %</td><td>500,00 €</td></tr>
<tr><td>2.000,00 €</td><td>4 %</td><td>80,00 €</td></tr>
</table>
<p>Total cuota devengada: <strong>2.680,00 €</strong></p>";
ChromePdfRenderer renderer = new ChromePdfRenderer()
{
RenderingOptions = {
// Pie de página con numeración, NIF y referencia AEAT
HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='font-size:9px; font-family:Arial; width:100%;
border-top:1px solid #ccc; padding-top:4px;'>
<span>NIF: B12345678 | AEAT Modelo 303 | 1T 2026</span>
<span style='float:right'>Página {page} de {total-pages}</span>
</div>",
DrawDividerLine = false
},
}
};
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("modelo303_liquidacion.pdf");
}
}
using IronPdf;
class Program
{
static void Main(string[] args)
{
// Contenido del informe de liquidación IVA (Modelo 303)
var html = @"
<h1>Liquidación IVA — Modelo 303</h1>
<p>Período: 1T 2026 | Contribuyente: Ejemplo S.L. | NIF: B12345678</p>
<table border='1' cellpadding='5'>
<tr><th>Base imponible</th><th>Tipo</th><th>Cuota</th></tr>
<tr><td>10.000,00 €</td><td>21 %</td><td>2.100,00 €</td></tr>
<tr><td>5.000,00 €</td><td>10 %</td><td>500,00 €</td></tr>
<tr><td>2.000,00 €</td><td>4 %</td><td>80,00 €</td></tr>
</table>
<p>Total cuota devengada: <strong>2.680,00 €</strong></p>";
ChromePdfRenderer renderer = new ChromePdfRenderer()
{
RenderingOptions = {
// Pie de página con numeración, NIF y referencia AEAT
HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='font-size:9px; font-family:Arial; width:100%;
border-top:1px solid #ccc; padding-top:4px;'>
<span>NIF: B12345678 | AEAT Modelo 303 | 1T 2026</span>
<span style='float:right'>Página {page} de {total-pages}</span>
</div>",
DrawDividerLine = false
},
}
};
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("modelo303_liquidacion.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main(args As String())
' Contenido del informe de liquidación IVA (Modelo 303)
Dim html As String = "
<h1>Liquidación IVA — Modelo 303</h1>
<p>Período: 1T 2026 | Contribuyente: Ejemplo S.L. | NIF: B12345678</p>
<table border='1' cellpadding='5'>
<tr><th>Base imponible</th><th>Tipo</th><th>Cuota</th></tr>
<tr><td>10.000,00 €</td><td>21 %</td><td>2.100,00 €</td></tr>
<tr><td>5.000,00 €</td><td>10 %</td><td>500,00 €</td></tr>
<tr><td>2.000,00 €</td><td>4 %</td><td>80,00 €</td></tr>
</table>
<p>Total cuota devengada: <strong>2.680,00 €</strong></p>"
Dim renderer As New ChromePdfRenderer() With {
.RenderingOptions = New PdfRenderingOptions With {
.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='font-size:9px; font-family:Arial; width:100%;
border-top:1px solid #ccc; padding-top:4px;'>
<span>NIF: B12345678 | AEAT Modelo 303 | 1T 2026</span>
<span style='float:right'>Página {page} de {total-pages}</span>
</div>",
.DrawDividerLine = False
}
}
}
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("modelo303_liquidacion.pdf")
End Sub
End Class
Resultado

El objeto HtmlHeaderFooter acepta HTML completo, permitiendo combinar texto estático (NIF del emisor, referencia AEAT), contenido dinámico ({page}, {total-pages}) y estilos CSS inline. Esta capacidad resulta especialmente útil para generar documentos conforme al eIDAS cuando se necesita que la representación visual de la factura electrónica refleje los metadatos del certificado FNMT-RCM utilizado para la firma.
Cómo añadir números de página con PDFsharp y sus limitaciones regulatorias
PDFsharp ofrece un enfoque de bajo nivel para añadir números de página mediante la API gráfica XGraphics. Si bien funciona correctamente para documentos simples, su integración en flujos de trabajo de facturación regulada española presenta limitaciones relevantes.
El siguiente ejemplo muestra cómo añadir un número de página básico con PDFsharp:
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using PdfSharp.Drawing;
internal class Program
{
static void Main(string[] args)
{
// Crear un nuevo documento PDF
var doc = new PdfDocument();
doc.Info.Title = "Page Numbers Example";
// Añadir una página al documento
PdfPage page = doc.AddPage();
// Crear objeto gráfico para dibujar
var gfx = XGraphics.FromPdfPage(page);
var font = new XFont("Arial", 12);
// Dibujar número de página en el pie
gfx.DrawString("Page " + doc.PageCount, font, XBrushes.Black, new XPoint(500, 770));
// Guardar el archivo PDF
doc.Save("PdfSharpOutput.pdf");
}
}
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using PdfSharp.Drawing;
internal class Program
{
static void Main(string[] args)
{
// Crear un nuevo documento PDF
var doc = new PdfDocument();
doc.Info.Title = "Page Numbers Example";
// Añadir una página al documento
PdfPage page = doc.AddPage();
// Crear objeto gráfico para dibujar
var gfx = XGraphics.FromPdfPage(page);
var font = new XFont("Arial", 12);
// Dibujar número de página en el pie
gfx.DrawString("Page " + doc.PageCount, font, XBrushes.Black, new XPoint(500, 770));
// Guardar el archivo PDF
doc.Save("PdfSharpOutput.pdf");
}
}
Imports PdfSharp.Pdf
Imports PdfSharp.Pdf.IO
Imports PdfSharp.Drawing
Friend Class Program
Shared Sub Main(ByVal args As String())
' Crear un nuevo documento PDF
Dim doc As New PdfDocument()
doc.Info.Title = "Page Numbers Example"
' Añadir una página al documento
Dim page As PdfPage = doc.AddPage()
' Crear objeto gráfico para dibujar
Dim gfx As XGraphics = XGraphics.FromPdfPage(page)
Dim font As New XFont("Arial", 12)
' Dibujar número de página en el pie
gfx.DrawString("Page " & doc.PageCount, font, XBrushes.Black, New XPoint(500, 770))
' Guardar el archivo PDF
doc.Save("PdfSharpOutput.pdf")
End Sub
End Class
Resultado

Con PDFsharp, cada elemento del pie de página —número de página, texto de identificación, separadores— debe posicionarse manualmente mediante coordenadas absolutas. En un entorno de producción español donde el pie de una factura TicketBAI debe incluir simultáneamente el número de página, el identificador de la cadena QR y los datos del contribuyente, el mantenimiento de estas coordenadas se vuelve frágil ante cambios de diseño. Adicionalmente, PDFsharp no genera HTML ni ofrece integración directa con plantillas CSS, lo que dificulta la reutilización de los diseños de factura web en el PDF imprimible.
Comparativa: IronPDF vs PDFsharp para el mercado español regulado
| Criterio | IronPDF | PDFsharp |
|---|---|---|
| Numeración de páginas | Plantillas HTML ({page}, {total-pages}) |
Coordenadas manuales XGraphics |
| Integración con HTML/CSS | Nativa (motor Chromium) | No disponible |
| Soporte para QR AEAT en pie | HTML inline con imagen o SVG | Manual mediante XImage |
Formato numérico español (1.234,56 €) |
Directo en HTML | Requiere formateo manual |
| Licencia en software VeriFactu | Comercial (sin conflicto AGPL) | MIT (sin conflicto AGPL) |
| Curva de aprendizaje | Baja (HTML estándar) | Alta (API gráfica de bajo nivel) |
| Adecuación para plantillas Facturae/SII | Alta | Media-baja |
Ambas bibliotecas son adecuadas para escenarios sencillos, pero la ventaja de IronPDF se hace más pronunciada en proyectos de facturación española donde el diseño de los documentos ya existe en HTML y necesita convertirse a PDF con paginación precisa para cumplir con las obligaciones de LOPDGDD, AEAT, Crea y Crece o los sistemas de auditoría del SII.
Conclusión
En el contexto del desarrollo de software de facturación en España —especialmente bajo los marcos VeriFactu, TicketBAI (Bizkaia, Gipuzkoa y Araba), Facturae y SII— la correcta gestión de la numeración de páginas en documentos PDF es un requisito funcional, no meramente estético. IronPDF destaca por su capacidad para añadir números de página mediante plantillas HTML completas, integrando simultáneamente el número de página, datos del NIF/CIF del emisor, referencias AEAT y formatos numéricos españoles (1.234,56 €), todo ello en un bloque de código conciso y mantenible. PDFsharp, aunque válido para proyectos simples, requiere un enfoque más manual que resulta costoso de mantener cuando los documentos deben cumplir requisitos regulatorios variables.
La licencia comercial de IronPDF permite evaluar todas sus características antes de comprometerse con una compra, lo que facilita la validación técnica previa a la integración en un sistema de facturación certificado.
Para más información, visita la documentación de IronPDF y el repositorio de GitHub de PDFsharp.
Preguntas Frecuentes
¿Cómo añado números de página a un PDF fiscal bajo VeriFactu con C#?
Con IronPDF puedes añadir números de página a documentos PDF fiscales —incluyendo facturas VeriFactu y TicketBAI— usando la clase HtmlHeaderFooter con los marcadores {page} y {total-pages}. El pie de página HTML permite incluir simultáneamente el NIF del emisor, la referencia AEAT y el número de página, cumpliendo los requisitos de identificación del reglamento VeriFactu.
¿Qué biblioteca PDF debo usar para facturas TicketBAI en el País Vasco?
Para documentos TicketBAI (Bizkaia, Gipuzkoa y Araba), IronPDF es la opción más adecuada porque permite integrar en el pie de página el QR de validación, el identificador de la cadena TicketBAI y la numeración de páginas mediante una única plantilla HTML. PDFsharp requiere coordinar múltiples llamadas de bajo nivel a XGraphics, lo que aumenta el riesgo de errores en producción.
¿Cómo formateo importes en euros con separador español en PDFs generados con C#?
En IronPDF, los importes en formato español (p. ej. 1.234,56 €) se incluyen directamente en el HTML de la plantilla. Puedes usar string.Format(new System.Globalization.CultureInfo("es-ES"), "{0:N2} €", importe) en C# para formatear el valor antes de insertarlo en el HTML que IronPDF convierte a PDF.
¿Tiene PDFsharp algún problema de licenciamiento para software de facturación VeriFactu?
PDFsharp se distribuye bajo licencia MIT, lo que no plantea conflictos de copyleft en software comercial. A diferencia de iText (AGPL), PDFsharp puede integrarse en sistemas de facturación certificados VeriFactu sin obligaciones de publicación del código fuente. IronPDF también ofrece licencia comercial sin restricciones AGPL.
¿Cómo incluyo el QR de validación AEAT en el pie de página de un PDF con IronPDF?
Con IronPDF puedes insertar una imagen del QR de validación AEAT directamente en el HTML del HtmlHeaderFooter usando una etiqueta <img> con la URL o el contenido Base64 del código QR. El motor Chromium de IronPDF renderiza el QR junto con el número de página y los datos del NIF en el pie de cada página.
¿Qué pasos de instalación requiere IronPDF en un proyecto .NET de facturación?
Instala IronPDF mediante el Administrador de Paquetes NuGet con Install-Package IronPdf o búscalo directamente en la interfaz de Visual Studio. No requiere dependencias adicionales para la generación de PDFs fiscales con numeración de páginas y pies de página HTML.
¿Para qué modelos tributarios de la AEAT es útil la numeración automática de páginas?
La numeración automática de páginas es especialmente útil para los informes del Modelo 303 (liquidación trimestral del IVA), el Modelo 347 (declaración de operaciones con terceros) y los resúmenes anuales del Modelo 390. En todos estos casos, los documentos PDF multipágina enviados o archivados deben incluir paginación para facilitar la auditoría por parte de la AEAT.
¿Cómo se compara IronPDF con PDFsharp para documentos Facturae B2G?
Para documentos B2G bajo el estándar Facturae enviados a través de FACe, IronPDF es más adecuado porque permite generar la representación visual en PDF a partir de plantillas HTML existentes, manteniendo la coherencia entre la factura XML y su versión imprimible. PDFsharp requiere construir el PDF íntegramente mediante su API gráfica de bajo nivel, lo que aumenta el esfuerzo de desarrollo y mantenimiento.



