Gestión de fuentes en PDFs para documentos en castellano con IronPDF
Los desarrolladores .NET en España que generan documentos PDF para el entorno normativo español —facturas VeriFactu, registros TicketBAI, documentos archivados bajo LOPDGDD— se enfrentan a tres exigencias tipográficas específicas que no existen en los mercados anglosajones: el correcto renderizado del bloque Latin-1 Extended del castellano (á, é, í, ó, ú, ü, ñ, ¿, ¡), la incrustación obligatoria de fuentes en documentos con validez probatoria a largo plazo, y el despliegue en entornos Linux/Docker donde las fuentes con soporte de caracteres españoles no están disponibles por defecto.
Esta guía explica cómo gestionar fuentes con IronPDF en C# para documentos en castellano: incrustación para garantizar la integridad visual en archivos LOPDGDD, selección de fuentes adecuadas para la leyenda VERI*FACTU, y configuración Docker para garantizar el renderizado correcto de todo el alphabeto español en producción.
Inicio rápido: incrustar fuentes en PDFs en castellano
-
Instala IronPDF con el Administrador de Paquetes NuGet
PM > Install-Package IronPdf -
Copie y ejecute este fragmento de código.
using IronPdf; using System.Text; ChromePdfRenderer renderer = new ChromePdfRenderer(); // UTF-8 imprescindible para á, é, í, ó, ú, ü, ñ, ¿, ¡ renderer.RenderingOptions.InputEncoding = Encoding.UTF8; PdfDocument pdf = renderer.RenderHtmlAsPdf(@" <html lang='es'> <head><meta charset='UTF-8'/></head> <body style='font-family:""Fuente Corporativa"";'> <p>Factura N.º 2026-001 — Importe: 1.210,00 € (IVA 21% incluido)</p> <p>VERI*FACTU | Factura verificable en la sede electrónica de la AEAT</p> </body> </html>"); // Incrustar la fuente para garantizar visualización en cualquier visor pdf.Fonts.Add(File.ReadAllBytes("FuenteCorporativa.ttf")).Embed(); pdf.SaveAs("factura-fuente-incrustada.pdf"); -
Despliegue para probar en su entorno real
Comienza a usar IronPDF en tu proyecto hoy mismo con una prueba gratuita
Flujo mínimo para documentos en castellano (5 pasos)
- Descargar la biblioteca IronPDF para C#
- Establezca
InputEncoding = UTF8enChromePdfRendererpara garantizar el renderizado de tildes y ñ - Use el método
Addcon los bytes del archivo TTF/OTF de su fuente corporativa - Llame a
Embed()para incrustar la fuente en el PDF y garantizar portabilidad - Guarde el PDF con
SaveAs(); el documento mostrará correctamente el castellano en cualquier sistema
Por qué el castellano requiere atención especial en la generación de PDFs
El bloque Latin-1 Extended y los caracteres del español
El castellano estándar de España (español peninsular) usa el bloque Unicode Latin-1 Extended (U+00C0–U+00FF), que incluye caracteres ausentes en el ASCII básico:
| Carácter | Unicode | Contexto de uso normativo |
|---|---|---|
| á, é, í, ó, ú | U+00E1–U+00FA | Presentes en razones sociales, nombres de calles, municipios |
| ü | U+00FC | Préstamos del alemán en nombres propios |
| ñ | U+00F1 | Carácter distintivo del español, presente en NIF, nombres |
| ¿, ¡ | U+00BF, U+00A1 | Signos de apertura obligatorios en castellano formal |
Cuando IronPDF genera un PDF en entornos Linux/Docker sin las fuentes adecuadas, estos caracteres pueden renderizarse como rectángulos o sustituirse por caracteres genéricos, lo que invalida visualmente un documento de factura o un contrato firmado.
Fuentes y documentos con validez probatoria bajo LOPDGDD
La LOPDGDD (Ley Orgánica de Protección de Datos y Garantía de Derechos Digitales), supervisada por la AEPD, exige que los documentos con datos personales conserven su integridad visual a lo largo del período de archivo. Un documento archivado cuyo texto se renderiza incorrectamente por ausencia de fuentes incrustadas puede ser impugnado en procesos legales o auditorías.
Regla práctica: todo PDF destinado al archivo a largo plazo bajo LOPDGDD o como visualización de factura VeriFactu debe tener sus fuentes incrustadas.
Configuración UTF-8 para el castellano
using IronPdf;
using System.Text;
var renderer = new ChromePdfRenderer();
// Configuración imprescindible para documentos en castellano
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
using IronPdf;
using System.Text;
var renderer = new ChromePdfRenderer();
// Configuración imprescindible para documentos en castellano
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
Imports IronPdf
Imports System.Text
Dim renderer As New ChromePdfRenderer()
' Configuración imprescindible para documentos en castellano
renderer.RenderingOptions.InputEncoding = Encoding.UTF8
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
Esta configuración es suficiente cuando se usan fuentes del sistema con soporte Latin-1 Extended. En entornos Linux/Docker, es necesario adicionalmente instalar las fuentes adecuadas (ver sección Docker más adelante).
Encontrar e inspeccionar fuentes en un documento PDF
using IronPdf;
// Cargar un documento PDF de factura existente
PdfDocument pdfFactura = PdfDocument.FromFile("factura-verifactu.pdf");
// Obtener todas las fuentes del documento
var coleccionFuentes = pdfFactura.Fonts;
// Verificar si las fuentes están incrustadas (requisito para archivo LOPDGDD)
foreach (var fuente in coleccionFuentes)
{
Console.WriteLine($"Fuente: {fuente.Name} | Incrustada: {fuente.IsEmbedded}");
}
// Buscar una fuente específica por nombre
var fuenteArial = coleccionFuentes["Arial"];
if (fuenteArial != null)
{
Console.WriteLine($"Arial encontrada — incrustada: {fuenteArial.IsEmbedded}");
}
using IronPdf;
// Cargar un documento PDF de factura existente
PdfDocument pdfFactura = PdfDocument.FromFile("factura-verifactu.pdf");
// Obtener todas las fuentes del documento
var coleccionFuentes = pdfFactura.Fonts;
// Verificar si las fuentes están incrustadas (requisito para archivo LOPDGDD)
foreach (var fuente in coleccionFuentes)
{
Console.WriteLine($"Fuente: {fuente.Name} | Incrustada: {fuente.IsEmbedded}");
}
// Buscar una fuente específica por nombre
var fuenteArial = coleccionFuentes["Arial"];
if (fuenteArial != null)
{
Console.WriteLine($"Arial encontrada — incrustada: {fuenteArial.IsEmbedded}");
}
Imports IronPdf
' Cargar un documento PDF de factura existente
Dim pdfFactura As PdfDocument = PdfDocument.FromFile("factura-verifactu.pdf")
' Obtener todas las fuentes del documento
Dim coleccionFuentes = pdfFactura.Fonts
' Verificar si las fuentes están incrustadas (requisito para archivo LOPDGDD)
For Each fuente In coleccionFuentes
Console.WriteLine($"Fuente: {fuente.Name} | Incrustada: {fuente.IsEmbedded}")
Next
' Buscar una fuente específica por nombre
Dim fuenteArial = coleccionFuentes("Arial")
If fuenteArial IsNot Nothing Then
Console.WriteLine($"Arial encontrada — incrustada: {fuenteArial.IsEmbedded}")
End If
Incrustar fuentes en documentos para archivo bajo LOPDGDD
La incrustación incorpora los datos de la fuente directamente en el PDF, garantizando que el documento se visualice idénticamente en cualquier sistema, independientemente de si la fuente está instalada o no. Es el requisito técnico para documentos que deben conservar su integridad visual durante el período de retención exigido por LOPDGDD.
using IronPdf;
// Cargar el PDF de factura generado
PdfDocument pdf = PdfDocument.FromFile("factura-sin-incrustar.pdf");
// Incrustar todas las fuentes del documento
foreach (var fuente in pdf.Fonts)
{
if (!fuente.IsEmbedded)
{
fuente.Embed();
}
}
pdf.SaveAs("factura-fuentes-incrustadas-lopdgdd.pdf");
using IronPdf;
// Cargar el PDF de factura generado
PdfDocument pdf = PdfDocument.FromFile("factura-sin-incrustar.pdf");
// Incrustar todas las fuentes del documento
foreach (var fuente in pdf.Fonts)
{
if (!fuente.IsEmbedded)
{
fuente.Embed();
}
}
pdf.SaveAs("factura-fuentes-incrustadas-lopdgdd.pdf");
Imports IronPdf
' Cargar el PDF de factura generado
Dim pdf As PdfDocument = PdfDocument.FromFile("factura-sin-incrustar.pdf")
' Incrustar todas las fuentes del documento
For Each fuente In pdf.Fonts
If Not fuente.IsEmbedded Then
fuente.Embed()
End If
Next
pdf.SaveAs("factura-fuentes-incrustadas-lopdgdd.pdf")
Para documentos generados desde cero con fuentes corporativas:
using IronPdf;
using System.Text;
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
// Generar el PDF de la factura VeriFactu
PdfDocument pdfFactura = renderer.RenderHtmlAsPdf(@"
<html lang='es'>
<head><meta charset='UTF-8'/>
<style>
body { font-family: 'Source Sans Pro', Arial, sans-serif; font-size: 11px; }
.verifactu { font-weight: bold; color: #333; }
</style>
</head>
<body>
<h1>Factura N.º 2026-050</h1>
<p>NIF: B87654321 | Empresa: Soluciones Empresariales del Norte S.L.</p>
<p>Base imponible: 2.000,00 € | IVA 21%: 420,00 € | <strong>Total: 2.420,00 €</strong></p>
<p class='verifactu'>VERI*FACTU | Factura verificable en la sede electrónica de la AEAT</p>
</body>
</html>");
// Añadir y embedir la fuente corporativa
pdfFactura.Fonts.Add(File.ReadAllBytes("SourceSansPro-Regular.ttf")).Embed();
pdfFactura.Fonts.Add(File.ReadAllBytes("SourceSansPro-Bold.ttf")).Embed();
pdfFactura.SaveAs("factura-2026-050-verifactu.pdf");
using IronPdf;
using System.Text;
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
// Generar el PDF de la factura VeriFactu
PdfDocument pdfFactura = renderer.RenderHtmlAsPdf(@"
<html lang='es'>
<head><meta charset='UTF-8'/>
<style>
body { font-family: 'Source Sans Pro', Arial, sans-serif; font-size: 11px; }
.verifactu { font-weight: bold; color: #333; }
</style>
</head>
<body>
<h1>Factura N.º 2026-050</h1>
<p>NIF: B87654321 | Empresa: Soluciones Empresariales del Norte S.L.</p>
<p>Base imponible: 2.000,00 € | IVA 21%: 420,00 € | <strong>Total: 2.420,00 €</strong></p>
<p class='verifactu'>VERI*FACTU | Factura verificable en la sede electrónica de la AEAT</p>
</body>
</html>");
// Añadir y embedir la fuente corporativa
pdfFactura.Fonts.Add(File.ReadAllBytes("SourceSansPro-Regular.ttf")).Embed();
pdfFactura.Fonts.Add(File.ReadAllBytes("SourceSansPro-Bold.ttf")).Embed();
pdfFactura.SaveAs("factura-2026-050-verifactu.pdf");
Imports IronPdf
Imports System.Text
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.InputEncoding = Encoding.UTF8
' Generar el PDF de la factura VeriFactu
Dim pdfFactura As PdfDocument = renderer.RenderHtmlAsPdf("
<html lang='es'>
<head><meta charset='UTF-8'/>
<style>
body { font-family: 'Source Sans Pro', Arial, sans-serif; font-size: 11px; }
.verifactu { font-weight: bold; color: #333; }
</style>
</head>
<body>
<h1>Factura N.º 2026-050</h1>
<p>NIF: B87654321 | Empresa: Soluciones Empresariales del Norte S.L.</p>
<p>Base imponible: 2.000,00 € | IVA 21%: 420,00 € | <strong>Total: 2.420,00 €</strong></p>
<p class='verifactu'>VERI*FACTU | Factura verificable en la sede electrónica de la AEAT</p>
</body>
</html>")
' Añadir y embedir la fuente corporativa
pdfFactura.Fonts.Add(File.ReadAllBytes("SourceSansPro-Regular.ttf")).Embed()
pdfFactura.Fonts.Add(File.ReadAllBytes("SourceSansPro-Bold.ttf")).Embed()
pdfFactura.SaveAs("factura-2026-050-verifactu.pdf")
Sustituir fuentes en documentos heredados
Cuando se trabaja con documentos PDF generados por sistemas legacy que usan fuentes no disponibles en el entorno actual, IronPDF permite sustituir las fuentes preservando la codificación de caracteres:
using IronPdf;
PdfDocument pdfLegacy = PdfDocument.FromFile("factura-sistema-antiguo.pdf");
// Sustituir fuente no disponible por Arial con soporte Latin-1 Extended
var fuenteObsoleta = pdfLegacy.Fonts["FuenteAntiguaEmpresa"];
if (fuenteObsoleta != null)
{
// Arial tiene soporte completo del bloque Latin-1 Extended
fuenteObsoleta.Replace(StandardFont.Helvetica);
}
pdfLegacy.SaveAs("factura-fuente-actualizada.pdf");
using IronPdf;
PdfDocument pdfLegacy = PdfDocument.FromFile("factura-sistema-antiguo.pdf");
// Sustituir fuente no disponible por Arial con soporte Latin-1 Extended
var fuenteObsoleta = pdfLegacy.Fonts["FuenteAntiguaEmpresa"];
if (fuenteObsoleta != null)
{
// Arial tiene soporte completo del bloque Latin-1 Extended
fuenteObsoleta.Replace(StandardFont.Helvetica);
}
pdfLegacy.SaveAs("factura-fuente-actualizada.pdf");
Imports IronPdf
Dim pdfLegacy As PdfDocument = PdfDocument.FromFile("factura-sistema-antiguo.pdf")
' Sustituir fuente no disponible por Arial con soporte Latin-1 Extended
Dim fuenteObsoleta = pdfLegacy.Fonts("FuenteAntiguaEmpresa")
If fuenteObsoleta IsNot Nothing Then
' Arial tiene soporte completo del bloque Latin-1 Extended
fuenteObsoleta.Replace(StandardFont.Helvetica)
End If
pdfLegacy.SaveAs("factura-fuente-actualizada.pdf")
Nota: La sustitución conserva la estructura de datos de la fuente original (estilo, codificación de caracteres) pero reemplaza el conjunto de glifos. Para documentos con firma PAdES activa, la sustitución de fuentes debe realizarse antes de aplicar la firma; modificar el contenido después de firmar invalida la firma.
Las 14 fuentes estándar PDF y su soporte del castellano
Las 14 fuentes estándar PDF (Base 14 Fonts) están garantizadas en todos los visores de PDF sin necesidad de incrustación:
| Familia | Variantes disponibles | Soporte Latin-1 Extended |
|---|---|---|
| Helvetica (≡ Arial) | Regular, Bold, Oblique, BoldOblique | Completo |
| Times-Roman | Regular, Bold, Italic, BoldItalic | Completo |
| Courier | Regular, Bold, Oblique, BoldOblique | Completo |
| Symbol | Regular | Solo símbolos |
| ZapfDingbats | Regular | Solo dingbats |
Para documentos de facturación en castellano, Helvetica (Arial) o Times-Roman son las opciones estándar sin incrustación. Sin embargo, para documentos archivados bajo LOPDGDD o facturas VeriFactu, se recomienda incrustar incluso las fuentes estándar para garantizar la integridad visual a largo plazo.
Despliegue Docker/Linux: fuentes para el castellano
En entornos Linux (servidores cloud, Docker, Azure App Service), las fuentes con soporte completo del Latin-1 Extended del español no están instaladas por defecto. IronPDF utiliza el motor Chromium para renderizar HTML a PDF; si las fuentes no están disponibles en el sistema, los caracteres del castellano (á, ñ, ¿, ¡) se sustituyen por glifos genéricos.
Dockerfile con fuentes para el castellano
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MiProyecto.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet build -c Release -o /app/build
FROM build AS publish
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# Fuentes con soporte Latin-1 Extended para el castellano (á, é, ñ, ¿, ¡)
RUN apt-get update && apt-get install -y \
fonts-liberation \
fonts-dejavu-core \
fontconfig \
libgdiplus \
libc6-dev \
&& fc-cache -fv \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["dotnet", "MiProyecto.dll"]
El paquete fonts-liberation proporciona equivalentes libres de Arial, Times New Roman y Courier New, con soporte completo del bloque Latin-1 Extended. El paquete fonts-dejavu-core añade soporte adicional de caracteres Unicode. fc-cache -fv actualiza la caché de fuentes del sistema para que el motor Chromium de IronPDF pueda encontrarlas.
Verificación del renderizado en Docker
Para verificar que los caracteres del castellano se renderizan correctamente en el contenedor, agregue una prueba de diagnóstico:
using IronPdf;
using System.Text;
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
// HTML de diagnóstico con todos los caracteres del castellano
var pdfDiagnostico = renderer.RenderHtmlAsPdf(@"
<html lang='es'>
<head><meta charset='UTF-8'/></head>
<body>
<h2>Diagnóstico de fuentes en castellano</h2>
<p>Vocales con tilde: á, é, í, ó, ú, Á, É, Í, Ó, Ú</p>
<p>Diéresis: ü, Ü</p>
<p>Eñe: ñ, Ñ</p>
<p>Signos de apertura: ¿preguntas?, ¡exclamaciones!</p>
<p>Símbolo euro: 1.210,00 €</p>
<p>Leyenda normativa: VERI*FACTU | Factura verificable en la sede electrónica de la AEAT</p>
</body>
</html>");
pdfDiagnostico.SaveAs("/app/output/diagnostico-castellano.pdf");
using IronPdf;
using System.Text;
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
// HTML de diagnóstico con todos los caracteres del castellano
var pdfDiagnostico = renderer.RenderHtmlAsPdf(@"
<html lang='es'>
<head><meta charset='UTF-8'/></head>
<body>
<h2>Diagnóstico de fuentes en castellano</h2>
<p>Vocales con tilde: á, é, í, ó, ú, Á, É, Í, Ó, Ú</p>
<p>Diéresis: ü, Ü</p>
<p>Eñe: ñ, Ñ</p>
<p>Signos de apertura: ¿preguntas?, ¡exclamaciones!</p>
<p>Símbolo euro: 1.210,00 €</p>
<p>Leyenda normativa: VERI*FACTU | Factura verificable en la sede electrónica de la AEAT</p>
</body>
</html>");
pdfDiagnostico.SaveAs("/app/output/diagnostico-castellano.pdf");
Imports IronPdf
Imports System.Text
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.InputEncoding = Encoding.UTF8
' HTML de diagnóstico con todos los caracteres del castellano
Dim pdfDiagnostico = renderer.RenderHtmlAsPdf("
<html lang='es'>
<head><meta charset='UTF-8'/></head>
<body>
<h2>Diagnóstico de fuentes en castellano</h2>
<p>Vocales con tilde: á, é, í, ó, ú, Á, É, Í, Ó, Ú</p>
<p>Diéresis: ü, Ü</p>
<p>Eñe: ñ, Ñ</p>
<p>Signos de apertura: ¿preguntas?, ¡exclamaciones!</p>
<p>Símbolo euro: 1.210,00 €</p>
<p>Leyenda normativa: VERI*FACTU | Factura verificable en la sede electrónica de la AEAT</p>
</body>
</html>")
pdfDiagnostico.SaveAs("/app/output/diagnostico-castellano.pdf")
Fuentes recomendadas para documentos normativos españoles
Para los distintos tipos de documentos normativos en España, las siguientes elecciones de fuente son estándares habituales:
| Tipo de documento | Fuente recomendada | Razón |
|---|---|---|
| Facturas VeriFactu | Arial/Helvetica 10-11pt | Legibilidad en impresión, soporte Latin-1 completo |
| Contratos y poderes | Times New Roman 12pt | Tradición notarial española |
| Documentos Facturae (B2G) | Arial 10pt | Compatibilidad con sistemas FACe |
| Formularios LOPDGDD | Arial o Calibri 11pt | Legibilidad en pantalla y papel |
| Acuses y notificaciones AEAT | Courier 10pt (monoespaciada) | Legibilidad de datos tabulares y códigos |
Para documentos dirigidos a la Administración Pública española (Facturae, FACe), evite fuentes propietarias sin incrustación, ya que los sistemas administrativos pueden no disponer de ellas.
Fuentes y conformidad PDF/A para archivo bajo LOPDGDD
Para el archivo a largo plazo bajo LOPDGDD, se recomienda generar documentos PDF/A-3 con fuentes incrustadas. PDF/A prohíbe las referencias a fuentes externas y exige que todas las fuentes utilizadas en el documento estén incrustadas en el fichero:
using IronPdf;
using System.Text;
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
// Generar conforme con PDF/A para archivo LOPDGDD
renderer.RenderingOptions.PdfAVersion = PdfAVersion.PdfA3a;
PdfDocument pdfArchivo = renderer.RenderHtmlAsPdf(@"
<html lang='es'>
<head><meta charset='UTF-8'/></head>
<body style='font-family:Arial,sans-serif;'>
<h1>Contrato de prestación de servicios</h1>
<p>Entre Empresa A S.L. (NIF: B12345678) y Empresa B S.A. (NIF: A98765432)</p>
<p>Fecha: 20/05/2026 | Duración: 12 meses | Importe: 24.000,00 € + IVA</p>
</body>
</html>");
// Verificar que todas las fuentes están incrustadas antes de guardar
foreach (var fuente in pdfArchivo.Fonts)
{
if (!fuente.IsEmbedded) fuente.Embed();
}
pdfArchivo.SaveAs("contrato-archivo-lopdgdd-pdfa3.pdf");
using IronPdf;
using System.Text;
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.InputEncoding = Encoding.UTF8;
// Generar conforme con PDF/A para archivo LOPDGDD
renderer.RenderingOptions.PdfAVersion = PdfAVersion.PdfA3a;
PdfDocument pdfArchivo = renderer.RenderHtmlAsPdf(@"
<html lang='es'>
<head><meta charset='UTF-8'/></head>
<body style='font-family:Arial,sans-serif;'>
<h1>Contrato de prestación de servicios</h1>
<p>Entre Empresa A S.L. (NIF: B12345678) y Empresa B S.A. (NIF: A98765432)</p>
<p>Fecha: 20/05/2026 | Duración: 12 meses | Importe: 24.000,00 € + IVA</p>
</body>
</html>");
// Verificar que todas las fuentes están incrustadas antes de guardar
foreach (var fuente in pdfArchivo.Fonts)
{
if (!fuente.IsEmbedded) fuente.Embed();
}
pdfArchivo.SaveAs("contrato-archivo-lopdgdd-pdfa3.pdf");
Imports IronPdf
Imports System.Text
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.InputEncoding = Encoding.UTF8
' Generar conforme con PDF/A para archivo LOPDGDD
renderer.RenderingOptions.PdfAVersion = PdfAVersion.PdfA3a
Dim pdfArchivo As PdfDocument = renderer.RenderHtmlAsPdf("
<html lang='es'>
<head><meta charset='UTF-8'/></head>
<body style='font-family:Arial,sans-serif;'>
<h1>Contrato de prestación de servicios</h1>
<p>Entre Empresa A S.L. (NIF: B12345678) y Empresa B S.A. (NIF: A98765432)</p>
<p>Fecha: 20/05/2026 | Duración: 12 meses | Importe: 24.000,00 € + IVA</p>
</body>
</html>")
' Verificar que todas las fuentes están incrustadas antes de guardar
For Each fuente In pdfArchivo.Fonts
If Not fuente.IsEmbedded Then fuente.Embed()
Next
pdfArchivo.SaveAs("contrato-archivo-lopdgdd-pdfa3.pdf")
Consideraciones de licencias de fuentes en documentos normativos españoles
Antes de incrustar fuentes corporativas o de terceros en documentos PDF destinados al archivo bajo LOPDGDD o a la transmisión a plataformas como FACe (Facturae) o BATUZ (TicketBAI en Bizkaia), verifique que la licencia de la fuente permita la incrustación en documentos de distribución comercial.
Las licencias de fuentes más comunes en el ecosistema español corporativo:
| Fuente | Licencia | Incrustación permitida |
|---|---|---|
| Arial, Times New Roman (Microsoft) | EULA Microsoft | Sí, para la mayoría de usos comerciales |
| Liberation fonts (Red Hat) | SIL OFL 1.1 | Sí, sin restricciones |
| DejaVu | Bitstream Vera / Public Domain | Sí, sin restricciones |
| Roboto, Open Sans (Google) | Apache 2.0 | Sí, sin restricciones |
| Fuentes corporativas propietarias | Según contrato tipográfico | Verificar con el proveedor |
Para documentos enviados a la Administración Pública española (Facturae a FACe, Facturae a administraciones regionales), se recomienda usar fuentes con licencias abiertas (Liberation, DejaVu, Google Fonts) para eliminar cualquier ambigüedad sobre los derechos de incrustación en documentos de archivo a largo plazo.
Los plazos de retención bajo LOPDGDD pueden superar los cinco años para datos de facturación. Un documento archivado con una fuente propietaria de terceros puede generar problemas jurídicos si la licencia de esa fuente expira o cambia de términos durante el período de archivo. Las fuentes bajo licencias abiertas (SIL OFL, Apache 2.0) evitan este riesgo por diseño.
Para más información sobre generación PDF/A, consulte la guía de PDF/A con IronPDF. Para fuentes web y fuentes de iconos en documentos HTML complejos, consulte la guía de fuentes web e iconos. Para la firma PAdES de documentos archivados bajo LOPDGDD, consulte la guía de firma digital.
Preguntas Frecuentes
¿Por qué los caracteres españoles (á, ñ, ¿) no se renderizan correctamente en Docker/Linux?
En entornos Linux, las fuentes con soporte del bloque Latin-1 Extended del castellano no están instaladas por defecto. Instale fonts-liberation y ejecute fc-cache -fv en su Dockerfile. Establezca además InputEncoding = Encoding.UTF8 en ChromePdfRenderer.
¿Es obligatorio incrustar fuentes en PDFs destinados al archivo bajo LOPDGDD?
Sí, se recomienda firmemente. La LOPDGDD exige que los documentos archivados mantengan su integridad visual durante el período de retención. Sin fuentes incrustadas, el documento puede renderizarse incorrectamente en futuros visores si las fuentes ya no están disponibles. Para documentos PDF/A bajo LOPDGDD, la incrustación es un requisito técnico del estándar PDF/A.
¿Qué fuentes debo usar para la leyenda VERI*FACTU en facturas PDF?
Helvetica (Arial), Times-Roman o fuentes con soporte completo de Latin-1 Extended son las opciones estándar. Para documentos que se envían a plataformas de la Administración Pública (FACe, BATUZ), use fuentes con licencias abiertas (Liberation, DejaVu, Google Fonts) para evitar problemas de derechos de incrustación en archivos a largo plazo.
¿Cómo verifico si todas las fuentes de un documento PDF están incrustadas?
Itere sobre la propiedad pdf.Fonts y compruebe fuente.IsEmbedded para cada fuente del documento. Si alguna no está incrustada, llame a fuente.Embed() antes de guardar el fichero final.
¿Puedo sustituir fuentes en PDFs de facturación heredados antes de firmar con PAdES?
Sí, use el método fuenteObsoleta.Replace(StandardFont.Helvetica) para sustituir fuentes no disponibles. La sustitución debe realizarse ANTES de aplicar la firma PAdES; modificar el contenido después de firmar invalida la firma y el documento pierde validez probatoria bajo LOPDGDD.
¿Qué diferencia hay entre incrustar una fuente estándar (Arial) y una fuente corporativa personalizada?
Las 14 fuentes estándar PDF están garantizadas en todos los visores y no requieren incrustación para visualización básica. Sin embargo, para documentos archivados bajo LOPDGDD, se recomienda incrustar incluso las fuentes estándar para garantizar la fidelidad visual a largo plazo. Las fuentes corporativas personalizadas siempre deben incrustarse.

