Artículo técnico

Exportar libros de Excel a PDF/A desde Delphi

HotXLS exporta un libro completo o una sola hoja de cálculo directamente a PDF/A desde Delphi y C++Builder, sin Excel y sin un controlador de impresora PDF. Configure UsePDFA y elija un perfil en TXLSPDFExport, y el archivo exportado llevará un perfil ICC sRGB embebido como su output intent, el bloque de identificación pdfaid en sus metadatos XMP, y un encabezado de versión PDF apropiado para el nivel de conformidad

El requisito suele venir de una política de retención de registros y no de 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 tienen que almacenarse en un formato que se renderice de forma idéntica dentro de cincuenta años, y eso es justamente lo que PDF/A, ISO 19005, existe para garantizar. Una hoja de cálculo es un cálculo vivo; una copia archivada de una hoja de cálculo debe 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é embebida y no se referencie ningún recurso externo. Su color debe ser inequívoco, lo cual 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 suministra los tres. El perfil sRGB se embebe como un objeto de flujo con tres componentes y DeviceRGB como su alternativo, referenciado desde un output intent GTS_PDFA1 cuya condición e identificador nombran ambos a 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 faltante 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: subconjuntos FontFile2 incrustados, un output intent sRGB GTS_PDFA1 e identificación XMP pdfaid
Un archivo PDF/A debe ser autosuficiente, sin ambigüedad de color y autoidentificado, 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ía 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 agrega 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 la tecnología 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 embebidos 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 pragmática por defecto: 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 infle. Elija la parte 3 cuando el archivo también deba llevar los datos de origen como un adjunto, lo cual el exportador admite mediante AddAttachment

La regla de fuentes que atrapa a la mayoría

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

HotXLS embebe subconjuntos TrueType para las fuentes que usa, pero la ruta de reserva a base-14 existe para los casos en que no se puede resolver una fuente, y una reserva base-14 no está embebida por definición. Para una salida de archivo, configure un archivo de fuente Unicode explícito de modo que nunca se tome la ruta de reserva. La mecánica del subsetting y de la cadena de reserva se describe en subsetting de fuentes TrueType; la regla práctica es probar la exportación en una máquina que no tenga instaladas sus fuentes corporativas

Diagrama de la regla de fuentes PDF/A en exportaciones de HotXLS en Delphi: las fuentes resueltas se convierten en subconjuntos TrueType incrustados que validan en todas partes, mientras la alternativa base-14 nunca se incrusta y falla en máquinas sin la fuente
Una fuente irresoluble retrocede a una fuente base-14 que jamás se incrusta, así 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 seguro. La exportación produce el aparato de identificación de PDF/A — output intent, perfil ICC embebido, metadatos pdfaid, un encabezado de versión apropiado — y enruta el texto por la ruta de embebido. 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 el fallo de validación como un error del pipeline y no como una advertencia. Una división de responsabilidades comparable para documentos PDF se describe en validación preflight de PDF/A

El diseño es parte de la fidelidad de archivo

Una hoja de cálculo archivada que es técnicamente conforme pero visualmente ilegible ha fallado en su verdadero propósito. La configuración de página pesa más en una exportación de archivo que en una impresión cotidiana, porque nadie podrá reajustar su diseño después

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. Las filas de encabezado repetidas mantienen cada página legible por sí sola. 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 cubre 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 sea necesario
Sheet.SetPrintArea('A1:N480');
Sheet.PrintTitleRows := '$1:$3';

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

Una lista de verificación antes de la primera ejecución por lotes

Confirme que el archivo se identifica a sí mismo: no descomprima nada, simplemente abra el PDF en un editor de texto y busque las entradas de parte y conformidad de pdfaid y el output intent GTS_PDFA1. Confirme las fuentes: verifique que cada fuente del documento se reporte como embebida. Confirme la apariencia: compare las páginas exportadas contra una copia impresa, porque un ajuste de encajar-en-página que reduce el texto a cuatro puntos en silencio es conforme e inútil

Después ejecute un validador independiente sobre una muestra representativa y conserve el informe. Los archivos cada vez piden con más frecuencia 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 de archivo, y sus opciones de renderizado, vea exportación de hoja de cálculo a PDF

La exportación de archivo, la configuración de página y el motor de renderizado que las sostiene se entregan en una sola biblioteca para Delphi y C++Builder; la lista completa de funciones está en la página del componente de hoja de cálculo para Delphi de HotXLS

Diagrama de la arquitectura de 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 archivo al repositorio de 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