Artículo técnico

Exportar libros de Excel a PDF/A desde Delphi

HotXLS exporta un libro o una única hoja de cálculo directamente a PDF/A desde Delphi y C++Builder, sin Excel y sin un driver de impresora PDF. Activa UsePDFA y elige un perfil en TXLSPDFExport, y el archivo exportado lleva un perfil ICC sRGB incrustado como su output intent, el bloque de identificación pdfaid en sus metadatos XMP, y una cabecera de versión de PDF adecuada al nivel de conformidad

El requisito suele llegar desde una política de retención de registros, no desde un desarrollador. Los estados financieros, los resultados de laboratorio, las presentaciones regulatorias y todo lo que un organismo público deba conservar durante décadas tiene que almacenarse en un formato que se represente de forma idéntica dentro de cincuenta años, y para eso existe precisamente PDF/A, ISO 19005. Una hoja de cálculo es un cálculo vivo; una copia archivada de una hoja de cálculo tiene que ser una imagen fija de ese cálculo

¿Qué hace que un PDF sea un PDF de archivo?

Tres requisitos hacen la mayor parte del trabajo. El archivo debe ser autocontenido, de modo que cada fuente que usa esté incrustada y no se referencie ningún recurso externo. Su color debe ser inequívoco, lo que significa un output intent que nombre el espacio de color para el que se preparó el archivo. Y debe identificarse a sí mismo, mediante metadatos XMP que declaren el número de parte y el nivel de conformidad

HotXLS proporciona los tres. El perfil sRGB se incrusta como un objeto de flujo con tres componentes y DeviceRGB como su alternativa, referenciado desde un output intent GTS_PDFA1 cuya condición e identificador nombran ambos sRGB IEC61966-2.1. El paquete XMP lleva las entradas de parte y conformidad de pdfaid. Los bytes del perfil se compilan dentro de la biblioteca en lugar de cargarse en tiempo de ejecución, de modo que no hay paso de despliegue ni posibilidad de que un archivo ausente convierta una exportación de archivo en una exportación ordinaria

Diagrama de los tres requisitos de archivo PDF/A y el aparato que HotXLS escribe desde Delphi: subsets FontFile2 incrustados, un output intent sRGB GTS_PDFA1 y la identificación XMP pdfaid
Un archivo PDF/A debe ser autosuficiente, inequívoco en color y autoidentificativo, y HotXLS escribe el aparato correspondiente a partir del par de propiedades UsePDFA
uses
  lxHandleX, lxPDF;

var
  Book: TXLSXWorkbook;
  Exporter: TXLSPDFExport;
begin
  Book := TXLSXWorkbook.Create;
  Exporter := TXLSPDFExport.Create;
  try
    if Book.Open('quarterly-results.xlsx') <> 1 then
      Exit;

    Exporter.UsePDFA := True;
    Exporter.PDFAProfile := xlsPdfA2b;      // ISO 19005-2 nivel B
    Exporter.DocumentLanguage := 'en-GB';
    Exporter.TagMode := xlsPdfTagsAutomatic;

    if Exporter.SaveAsPDF(Book, 'quarterly-results-archive.pdf') <> 1 then
      raise Exception.Create('archival export failed');
  finally
    Exporter.Free;
    Book.Free;
  end;
end;

¿Qué perfil deberías elegir?

La enumeración de perfiles cubre PDF/A-1, PDF/A-2 y PDF/A-3, cada uno en una variante accesible y una variante básica. Las diferencias prácticas son más estrechas de lo que sugiere la lista

El nivel B, la variante básica, garantiza que la apariencia visual sea reproducible. El nivel A añade requisitos estructurales y semánticos, principalmente un árbol de estructura etiquetado y un orden de lectura definido, de modo que el documento sea accesible para las tecnologías de asistencia. La parte 2 relaja algunas restricciones de la parte 1 y permite object streams y JPEG 2000; la parte 3 además permite archivos incrustados arbitrarios, que es lo que usan los formatos de facturación electrónica para llevar XML legible por máquina junto a la página legible por humanos

Para una hoja de cálculo archivada, PDF/A-2b es la opción por defecto más pragmática: es ampliamente aceptada por los archivos, no exige la disciplina de etiquetado que el nivel A impone sobre una cuadrícula de celdas, y permite las estructuras compactas que evitan que la exportación de un libro de 200 páginas se hinche. Elige la parte 3 cuando el archivo también deba llevar los datos de origen como adjunto, algo que el exportador soporta mediante AddAttachment

La regla de fuentes que atrapa a la mayoría

Cada glifo que dibuja un archivo PDF/A debe proceder de una fuente incrustada. Esta es la razón individual más común por la que una exportación por lo demás correcta falla la validación, y el modo de fallo es sutil: el archivo se ve bien en la máquina que lo generó, porque esa máquina tiene la fuente instalada

HotXLS incrusta subconjuntos TrueType para las fuentes que usa, pero la ruta de reserva base-14 existe para los casos en que no se puede resolver una fuente, y una reserva base-14 no está incrustada por definición. Para la salida de archivo, configura un archivo de fuente Unicode explícito para que la ruta de reserva nunca se tome. Los mecanismos de subconjuntado y de la cadena de reserva se describen en subconjuntado de fuentes TrueType; la regla práctica es probar la exportación en una máquina que no tenga instaladas tus fuentes corporativas

Diagrama de la regla de fuentes PDF/A en las exportaciones HotXLS de Delphi: las fuentes resueltas se convierten en subsets TrueType incrustados que validan en todas partes, mientras la reserva base-14 nunca se incrusta y falla en máquinas sin la fuente
Una fuente irresoluble retrocede a una fuente base-14 que nunca se incrusta, de modo que configure un archivo de fuente Unicode explícito y pruebe en una máquina sin sus fuentes corporativas

Qué garantiza el exportador, y qué no

Ser preciso aquí importa más que sonar convincente. La exportación produce el aparato de identificación de PDF/A — output intent, perfil ICC incrustado, metadatos pdfaid, una cabecera de versión adecuada — y enruta el texto a través de la ruta de incrustación. No ejecuta un validador completo sobre su propia salida, así que no impone todas las prohibiciones de la especificación, como las reglas sobre transparencia, sobre ciertos tipos de anotación y sobre contenido opcional

En una exportación de hoja de cálculo esas construcciones rara vez aparecen, razón por la cual la tasa de éxito práctica es alta. Pero alta no es lo mismo que garantizada, y para un pipeline de archivo genuino la arquitectura correcta es exportar y luego validar con una herramienta independiente, tratando un fallo de validación como un error del pipeline y no como una advertencia. Una división comparable de responsabilidades para documentos PDF se describe en validación preflight de PDF/A

La maquetación forma parte de la fidelidad archivística

Una hoja de cálculo archivada que es técnicamente conforme pero visualmente ilegible ha fracasado en su verdadero cometido. La configuración de página pesa más en una exportación de archivo que en una impresión cotidiana, porque nadie podrá reajustarla más adelante

Tres ajustes se pagan solos. Ajustar al ancho evita el fallo clásico en el que una tabla de 14 columnas de ancho llega como siete páginas de dos columnas cada una. Repetir las filas de encabezado mantiene cada página legible de forma aislada. Y las áreas de impresión explícitas excluyen las notas de trabajo que viven a la derecha de los datos reales. El conjunto completo de controles de impresión y configuración de página se trata en protección, configuración de página e impresión

// Configuración de página lista para archivo, aplicada antes de la exportación
Sheet := Book.Sheets[0];
Sheet.PageLandscape := True;
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0;                  // tantas páginas de alto como haga falta
Sheet.SetPrintArea('A1:N480');
Sheet.PrintTitleRows := '$1:$3';

// Los metadatos también pertenecen al archivo
Book.Title := 'Quarterly results 2026 Q2';
Book.Author := 'Finance';

Una lista de comprobación antes del primer lote

Confirma que el archivo se identifica a sí mismo: no descomprimas nada, simplemente abre el PDF en un editor de texto y busca las entradas de parte y conformidad de pdfaid y el output intent GTS_PDFA1. Confirma las fuentes: comprueba que cada fuente del documento se reporta como incrustada. Confirma la apariencia: compara las páginas exportadas con una copia impresa, porque un ajuste de tipo «ajustar a la página» que reduce el texto en silencio a cuatro puntos es conforme e inútil

Después ejecuta un validador independiente sobre una muestra representativa y conserva el informe. Los archivos piden cada vez más la evidencia de validación, no solo el archivo, y generarla en el momento de la exportación es mucho más barato que reconstruirla años después. Para la ruta de exportación cotidiana, no archivística, y sus opciones de renderizado, consulta exportación de hojas de cálculo a PDF

La exportación de archivo, la configuración de página y el motor de renderizado que hay detrás se distribuyen en una única biblioteca para Delphi y C++Builder; la lista completa de funciones está en la página del componente de hoja de cálculo HotXLS Delphi

Diagrama de la arquitectura exportar y luego validar para la salida PDF/A de HotXLS en Delphi: el exportador escribe el aparato de identificación y un validador independiente enruta el fichero al archivo o lanza un error de pipeline
El exportador construye el aparato de identificación mientras que un validador independiente prueba la conformidad, y una validación fallida detiene el lote en lugar de registrar una advertencia