PDF/A: El Estándar PDF de Archivo — Guía Completa
PDF/A es la versión del PDF estandarizada por ISO diseñada específicamente para la preservación digital a largo plazo. Gobiernos, tribunales, bibliotecas, hospitales e instituciones financieras de todo el mundo exigen PDF/A para documentos que deben permanecer legibles décadas o siglos en el futuro.
Por Qué Existe PDF/A
Un fichero PDF normal puede hacer referencia a recursos externos (URLs, fuentes, perfiles de color) que podrían no existir en el futuro. Puede contener JavaScript, puede cifrar contenido y puede usar características propietarias.
PDF/A elimina todos estos riesgos exigiendo que sea completamente autocontenido y tecnológicamente neutro — todo lo necesario para renderizarlo de forma idéntica en cualquier lector conforme, ahora o dentro de 500 años, debe estar incrustado en el propio fichero.
Estándares PDF/A: Una Familia de Especificaciones ISO
| Estándar | Año | Basado en | Perfiles | Adiciones clave |
|---|---|---|---|---|
| PDF/A-1 | 2005 | PDF 1.4 | 1a, 1b | Requisitos fundamentales establecidos |
| PDF/A-2 | 2011 | PDF 1.7 | 2a, 2b, 2u | JPEG2000, capas, firmas digitales |
| PDF/A-3 | 2012 | PDF 1.7 | 3a, 3b, 3u | Cualquier fichero como adjunto incrustado |
| PDF/A-4 | 2020 | PDF 2.0 | 4, 4e, 4f | Actualizado a PDF 2.0 |
Niveles de Conformidad
| Nivel | Nombre | Requisitos |
|---|---|---|
| a (Accesible) | Más estricto | PDF etiquetado con estructura lógica, texto alternativo para imágenes, especificación de idioma |
| b (Básico) | Estándar | Todos los requisitos visuales: fuentes incrustadas, colores independientes de dispositivo, sin cifrado |
| u (Unicode) | Intermedio (PDF/A-2/3) | Requisitos del nivel b + todo el texto debe tener asignación Unicode |
PDF/A-1b es el nivel más comúnmente requerido para archivo general de registros. PDF/A-3b se usa para facturación electrónica (ZUGFeRD en Alemania, Factur-X en Francia).
Requisitos Técnicos para Conformidad PDF/A
Fuentes
- Todas las fuentes deben estar incrustadas en el PDF
- La codificación de fuentes debe permitir la extracción del mapeo carácter-glifo
Color
- Todos los colores deben ser independientes de dispositivo: usar espacios de color con perfil ICC
- Debe estar presente un OutputIntent que especifique el dispositivo de renderizado previsto
Metadatos
- Los metadatos XMP son obligatorios
- El nivel de conformidad PDF/A debe declararse en el espacio de nombres
pdfaid::<pdfaid:part>1</pdfaid:part> <pdfaid:conformance>B</pdfaid:conformance>
Características Prohibidas
- Sin cifrado
- Sin JavaScript
- Sin referencias a contenido externo
- Sin transparencia (PDF/A-1 solo; PDF/A-2/3 lo permiten)
Creación de PDF/A con Ghostscript
# Convertir cualquier PDF a PDF/A-1b
gs -dNOPAUSE -dBATCH -dSAFER \
-sDEVICE=pdfwrite \
-dPDFA=1 \
-dPDFACompatibilityPolicy=1 \
-sColorConversionStrategy=UseDeviceIndependentColor \
-sOutputFile=salida_pdfa.pdf \
entrada.pdf
# Conversión más simple a PDF/A-2b
gs -dNOPAUSE -dBATCH \
-sDEVICE=pdfwrite \
-dPDFA=2 \
-dCompatibilityLevel=1.7 \
-sOutputFile=salida_pdfa2.pdf \
entrada.pdf
Validación de PDF/A con VeraPDF
# Validar un fichero para conformidad PDF/A-1b
verapdf --flavour 1b entrada.pdf
# Formatos de salida
verapdf --flavour 1b --format text entrada.pdf # Legible por humanos
verapdf --flavour 1b --format json entrada.pdf # Legible por máquinas
verapdf --flavour 1b --format xml entrada.pdf # Informe XML
# Detectar automáticamente el nivel de conformidad del fichero
verapdf entrada.pdf
# Validar por lotes un directorio
verapdf --flavour 2b /ruta/a/pdfs/*.pdf
Python: Creación y Validación de PDF/A
from reportlab.pdfgen import canvas
from reportlab.lib.colors import HexColor
import subprocess
def crear_pdfa(ruta_salida):
"""Crear un documento PDF/A mínimo con ReportLab."""
c = canvas.Canvas(ruta_salida)
c.setAuthor("KaijuConverter")
c.setTitle("Documento de Ejemplo PDF/A")
c.setSubject("Documento de archivo")
c.setFont("Helvetica", 14)
c.drawString(100, 750, "Este documento se creó para archivo PDF/A.")
c.drawString(100, 720, "Todas las fuentes están incrustadas. Sin referencias externas.")
c.setFillColor(HexColor('#1a56db'))
c.drawString(100, 690, "Color usando sRGB (independiente de dispositivo)")
c.save()
def validar_pdfa(ruta_pdf, nivel='1b'):
"""Ejecutar VeraPDF para validar conformidad PDF/A."""
resultado = subprocess.run(
['verapdf', '--flavour', nivel, '--format', 'text', ruta_pdf],
capture_output=True, text=True
)
superado = 'PASS' in resultado.stdout
return {'superado': superado, 'salida': resultado.stdout}
PDF/A para Facturación Electrónica: ZUGFeRD y Factur-X
PDF/A-3 permite un caso de uso potente: incrustar datos XML de factura estructurados directamente dentro de un PDF. Esta es la base de:
- ZUGFeRD (Alemania): datos XML de factura incrustados en PDF/A-3b
- Factur-X (estándar conjunto Francia/Alemania): mismo enfoque
- EN16931 (estándar europeo de factura electrónica): XML incrustado en PDF/A-3
El fichero XML incrustado contiene datos de factura legibles por máquinas mientras el PDF proporciona presentación legible por humanos.
Errores Comunes de Validación PDF/A
| Error | Referencia estándar | Solución |
|---|---|---|
| Fuente no incrustada | 6.3.3 | Incrustar todas las fuentes antes de crear el PDF |
| OutputIntent faltante | 6.2.2 | Añadir OutputIntent con perfil ICC |
| DeviceRGB sin ICC | 6.2.4 | Convertir a sRGB con ICC incrustado |
| Objeto transparente | 6.4 (solo PDF/A-1) | Aplanar transparencia antes de la conversión |
| Acción JavaScript | 6.6.1 | Eliminar todo JavaScript |
| Cifrado presente | 6.3.1 | Eliminar protección con contraseña |
Resumen
PDF/A es el formato definitivo para documentos que deben sobrevivir el paso del tiempo. Para archivo estándar de registros, PDF/A-1b o PDF/A-2b son apropiados. Para documentos con mandato de accesibilidad, usa PDF/A-1a. Para facturación electrónica con XML incrustado, usa PDF/A-3b. Siempre valida con VeraPDF antes de enviar a cualquier autoridad o sistema de archivo.
Conversiones relacionadas
Conversiones de documento que siguen este tema: