Article technique

Exporter des classeurs Excel en PDF/A d'archivage depuis Delphi

HotXLS exporte un classeur ou une seule feuille de calcul directement en PDF/A depuis Delphi et C++Builder, sans Excel et sans pilote d'imprimante PDF. Définissez UsePDFA et choisissez un profil sur TXLSPDFExport, et le fichier exporté porte un profil ICC sRGB intégré comme intention de sortie, le bloc d'identification pdfaid dans ses métadonnées XMP, et un en-tête de version PDF adapté au niveau de conformité

Cette exigence provient généralement d'une politique de conservation d'archives plutôt que d'un développeur. États financiers, résultats de laboratoire, dépôts réglementaires et tout ce qu'un organisme public doit conserver pendant des décennies doivent être stockés dans un format qui s'affiche à l'identique dans cinquante ans, et c'est exactement ce que le PDF/A, ISO 19005, existe pour garantir. Une feuille de calcul est un calcul vivant ; une copie archivée d'une feuille de calcul doit en être une image figée

Qu'est-ce qui fait d'un PDF un PDF d'archive ?

Trois exigences font l'essentiel du travail. Le fichier doit être autonome, si bien que chaque police qu'il utilise est intégrée et qu'aucune ressource externe n'est référencée. Sa couleur doit être sans ambiguïté, ce qui signifie une intention de sortie nommant l'espace colorimétrique pour lequel le fichier a été préparé. Et il doit s'identifier lui-même, via des métadonnées XMP déclarant le numéro de partie et le niveau de conformité

HotXLS fournit les trois. Le profil sRGB est intégré comme objet de flux avec trois composantes et DeviceRGB comme alternative, référencé depuis une intention de sortie GTS_PDFA1 dont la condition et l'identifiant nomment tous deux sRGB IEC61966-2.1. Le paquet XMP porte les entrées de partie et de conformité pdfaid. Les octets du profil sont compilés dans la bibliothèque plutôt que chargés au moment de l'exécution, si bien qu'il n'y a aucune étape de déploiement et aucun risque qu'un fichier manquant transforme un export d'archive en export ordinaire

Diagramme des trois exigences d'archivage PDF/A et de l'appareillage que HotXLS écrit depuis Delphi : sous-ensembles FontFile2 incorporés, un output intent sRGB GTS_PDFA1 et une identification XMP pdfaid
Un fichier PDF/A doit être autonome, sans ambiguïté de couleurs et auto-identifiant, et HotXLS écrit l'appareillage correspondant depuis la paire de propriétés 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 niveau 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;

Quel profil choisir ?

L'énumération de profils couvre PDF/A-1, PDF/A-2 et PDF/A-3, chacun dans une variante accessible et une variante de base. Les différences pratiques sont plus étroites que la liste ne le suggère

Le niveau B, la variante de base, garantit que l'apparence visuelle est reproductible. Le niveau A ajoute des exigences structurelles et sémantiques, principalement un arbre de structure balisé et un ordre de lecture défini, si bien que le document devient accessible aux technologies d'assistance. La partie 2 assouplit certaines restrictions de la partie 1 et autorise les flux d'objets et le JPEG 2000 ; la partie 3 autorise en plus des fichiers embarqués arbitraires, ce que les formats de facturation électronique utilisent pour porter du XML lisible par machine aux côtés de la page lisible par un humain

Pour une feuille de calcul archivée, PDF/A-2b est le choix pragmatique par défaut : il est largement accepté par les archives, il n'exige pas la discipline de balisage que le niveau A impose sur une grille de cellules, et il autorise les structures compactes qui empêchent un export de classeur de 200 pages de gonfler démesurément. Choisissez la partie 3 quand l'archive doit aussi porter les données source en pièce jointe, ce que l'exportateur prend en charge via AddAttachment

La règle de police qui piège la plupart des gens

Chaque glyphe qu'un fichier PDF/A dessine doit provenir d'une police intégrée. C'est la raison la plus fréquente pour laquelle un export par ailleurs correct échoue à la validation, et le mode d'échec est subtil : le fichier semble correct sur la machine qui l'a créé, car cette machine dispose de la police installée

HotXLS intègre des sous-ensembles TrueType pour les polices qu'il utilise, mais la voie de repli sur les polices Base 14 existe pour les cas où une police ne peut pas être résolue, et un repli Base 14 n'est par définition pas intégré. Pour une sortie d'archive, configurez un fichier de police Unicode explicite afin que la voie de repli ne soit jamais empruntée. Les mécanismes du sous-ensemble et de la chaîne de repli sont décrits dans le sous-ensemble de polices TrueType ; la règle pratique est de tester l'export sur une machine qui ne dispose pas de vos polices d'entreprise

Diagramme de la règle de polices PDF/A dans les exports HotXLS Delphi : les polices résolues deviennent des sous-ensembles TrueType incorporés qui se valident partout, tandis que le repli base-14 n'est jamais incorporé et échoue sur les machines sans la police
Une police irrésoluble retombe sur une police de la base 14 jamais incorporée, aussi configurez un fichier de police Unicode explicite et testez sur une machine dépourvue de vos polices d'entreprise

Ce que l'exportateur garantit, et ce qu'il ne garantit pas

Être précis ici compte plus que de paraître confiant. L'export produit l'appareil d'identification du PDF/A — intention de sortie, profil ICC intégré, métadonnées pdfaid, en-tête de version approprié — et il fait transiter le texte par la voie d'intégration. Il ne fait pas passer sa propre sortie par un validateur complet, si bien qu'il n'impose pas chaque interdiction de la spécification, telles que les règles sur la transparence, sur certains types d'annotations et sur le contenu optionnel

Pour un export de feuille de calcul, ces constructions apparaissent rarement, ce qui explique pourquoi le taux de réussite pratique est élevé. Mais élevé n'est pas la même chose que garanti, et pour un véritable pipeline d'archivage, l'architecture correcte consiste à exporter puis à valider avec un outil indépendant, en traitant un échec de validation comme une erreur de pipeline plutôt que comme un avertissement. Une répartition des responsabilités comparable pour les documents PDF est décrite dans la validation préflight PDF/A

La mise en page fait partie de la fidélité d'archivage

Une feuille de calcul archivée qui est techniquement conforme et visuellement illisible a manqué son objectif réel. La mise en page pèse davantage dans un export d'archive que dans une impression quotidienne, car personne ne pourra la remettre en forme plus tard

Trois réglages se rentabilisent d'eux-mêmes. L'ajustement à la largeur évite l'échec classique où un tableau de 14 colonnes de large arrive en sept pages de deux colonnes chacune. La répétition des lignes d'en-tête garde chaque page lisible isolément. Et les zones d'impression explicites excluent les notes de travail qui se trouvent à droite des données réelles. L'ensemble complet des contrôles d'impression et de mise en page est traité dans protection, mise en page et impression

// Mise en page prête pour l'archive, appliquée avant l'export
Sheet := Book.Sheets[0];
Sheet.PageLandscape := True;
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0;                  // autant de pages de haut que nécessaire
Sheet.SetPrintArea('A1:N480');
Sheet.PrintTitleRows := '$1:$3';

// Les métadonnées ont aussi leur place dans l'archive
Book.Title := 'Quarterly results 2026 Q2';
Book.Author := 'Finance';

Une checklist avant le premier lot

Confirmez que le fichier s'identifie lui-même : n'extrayez rien, ouvrez simplement le PDF dans un éditeur de texte et cherchez les entrées de partie et de conformité pdfaid ainsi que l'intention de sortie GTS_PDFA1. Confirmez les polices : vérifiez que chaque police du document se déclare comme intégrée. Confirmez l'apparence : comparez les pages exportées à une copie imprimée, car un réglage d'ajustement à la page qui réduit silencieusement le texte à quatre points est conforme et inutilisable

Ensuite, exécutez un validateur indépendant sur un échantillon représentatif et conservez le rapport. Les archives demandent de plus en plus la preuve de validation, pas seulement le fichier, et la générer au moment de l'export coûte bien moins cher que de la reconstruire des années plus tard. Pour la voie d'export quotidienne, non archivistique, et ses options de rendu, voir l'export PDF de feuille de calcul

L'export d'archive, la mise en page et le moteur de rendu qui les sous-tend sont livrés dans une seule bibliothèque pour Delphi et C++Builder ; la liste complète des fonctionnalités se trouve sur la page du composant tableur HotXLS Delphi

Diagramme de l'architecture exporter-puis-valider pour la sortie PDF/A HotXLS Delphi : l'exportateur écrit l'appareillage d'identification et un validateur indépendant aiguille le fichier vers l'archive ou lève une erreur de pipeline
L'exportateur construit l'appareillage d'identification tandis qu'un validateur indépendant prouve la conformité, et une validation en échec arrête le lot au lieu de journaliser un avertissement