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
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
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