Conformité
Chaque PDF est archivable par défaut : il est produit en PDF/A, la norme ISO d'archivage à long terme, sans rien demander. Un document peut déclarer une autre partie de PDF/A, ajouter une déclaration d'accessibilité (PDF/UA) ou nommer la classe Office Open XML de son DOCX.
Une déclaration n'est inscrite dans le fichier que si le fichier la respecte. Sinon, elle est retirée et le rendu en donne la raison : un document ne porte jamais le nom d'une norme qu'il ne satisfait pas.
Déclarer une conformité
Les déclarations se trouvent dans metadata.conformance, une liste par format de sortie :
{
"document": {
"metadata": {
"title": "Rapport annuel 2026",
"lang": "fr-CA",
"conformance": { "pdf": ["a-2u", "ua-1"], "docx": ["strict"] }
},
"content": [
{ "h1": "Rapport annuel 2026" },
{ "p": "Le contenu du rapport." }
]
}
}
La liste est un ensemble de remplacements, pas une liste complète. Une famille qu'elle ne mentionne pas garde sa valeur par défaut : ["ua-2"] produit donc toujours un fichier archivable. L'ordre est sans importance, et chaque norme ne se déclare qu'à un seul niveau : deux parties de PDF/A, ou deux parties de PDF/UA, sont refusées comme contradictoires.
PDF/A : archivage
| Valeur | Norme | À utiliser pour |
|---|---|---|
a-2b | PDF/A-2b | La valeur par défaut. La page s'affiche à l'identique dans tout lecteur, dans des années |
a-2u | PDF/A-2u | 2b, et chaque caractère se copie et se recherche tel qu'il est dessiné. Sans coût supplémentaire ici |
a-2a | PDF/A-2a | 2u, et le document est balisé avec sa structure logique |
a-3b, a-3u, a-3a | PDF/A-3 | Les trois mêmes niveaux, pour un document qui intègre des fichiers (une facture électronique avec son XML, par exemple) |
a-4 | PDF/A-4 | L'archivage sur PDF 2.0 |
a-none | aucune | Renonce à l'archivage par défaut |
Sans valeur PDF/A, un document est déclaré a-2b. Trois cas changent cette valeur d'eux-mêmes :
- un document avec des pièces jointes est déclaré PDF/A-3b, car la partie 2 n'autorise pas les fichiers intégrés et la partie 3 existe pour eux ;
- un document produit en PDF 2.0 (par
pdfVersion, ou par une déclaration définie sur 2.0 commeua-2) est déclaré PDF/A-4 ; - un document chiffré n'est pas archivable.
PDF/A interdit le chiffrement, et c'est le chiffrement que vous avez demandé : la valeur par défaut s'efface. Un PDF chiffré est livré sans sa conformité PDF/A, et le rendu le signale. Une définition qui déclare une partie de PDF/A et définit aussi encryption est refusée : choisissez l'un des deux. Pour qu'un document reste à la fois archivable et confidentiel, laissez le PDF non chiffré et protégez-le là où il est stocké et transmis.
a-none désactive l'archivage explicitement, pour tout autre document qui ne doit pas être archivable :
"metadata": { "conformance": { "pdf": ["a-none"] } }
Une liste vide, comme un bloc conformance absent, ne change rien.
Ce que PDF/A vous demande
Presque tout ce qu'exige PDF/A relève du moteur de rendu : polices intégrées et sous-ensemblées, profils de couleur, métadonnées, et aucune des fonctionnalités que la norme interdit. Trois points dépendent du document :
| Le document doit | Parce que |
|---|---|
| ne pas être chiffré, s'il déclare PDF/A | PDF/A interdit le chiffrement : un document chiffré n'est tout simplement pas archivable |
| utiliser des polices dont la licence autorise l'intégration, s'il fournit les siennes | PDF/A intègre chaque police utilisée |
| ne contenir que des caractères qu'une police disponible sait dessiner | un carré vide à la place d'un caractère n'est pas un contenu archivable |
PDF/UA : accessibilité
| Valeur | Norme | Produit en |
|---|---|---|
ua-1 | PDF/UA-1 (ISO 14289-1) | PDF 1.7, avec a-2* ou a-3* |
ua-2 | PDF/UA-2 (ISO 14289-2) | PDF 2.0, avec a-4 |
wtpdf-accessibility, wtpdf-reuse | Well-Tagged PDF 1.0 | PDF 2.0. Chacune implique ua-2, et les deux peuvent être déclarées ensemble |
Une déclaration d'accessibilité balise le document pour les lecteurs d'écran et autres technologies d'assistance. Le balisage n'est construit que lorsqu'un document le déclare, car l'arbre de structure représente une grande part de la taille d'un fichier balisé.
L'essentiel de la structure vient de ce que vous avez déjà écrit : les titres deviennent des balises de titre, les tableaux des balises de tableau avec la portée de leurs en-têtes, les listes des balises de liste, une table des matières devient navigable, et les en-têtes, pieds de page et filigranes sont marqués comme éléments de mise en page qu'un lecteur ignore. Les liens, champs de formulaire, formules et codes-barres reçoivent leur description de leur propre contenu.
Ce que PDF/UA vous demande
Certaines informations ne sont connues que de l'auteur. Sous une déclaration d'accessibilité, le schéma les exige : un éditeur signale celle qui manque pendant la rédaction, et l'API refuse une définition qui en est dépourvue :
| Clé | Pourquoi |
|---|---|
metadata.title | un lecteur annonce le titre, pas le nom du fichier |
metadata.lang, une étiquette comme "en" ou "fr-CA" | un lecteur d'écran prononce le texte dans cette langue |
alt sur chaque image, ou sur sa définition dans document.images | un auditeur apprend ce que montre l'image |
title ou desc sur chaque svg | la même chose, pour les dessins |
Et certaines que le schéma ne peut pas vérifier :
- sous
ua-1, les titres commencent àh1et ne sautent jamais de niveau en descendant ; - les cellules d'en-tête sont des
th, pour qu'un lecteur dise à quelle colonne ou ligne appartient une valeur ; - l'ordre du contenu est l'ordre de lecture : écrivez le document dans l'ordre où il doit être lu ;
- le sens ne repose jamais sur la seule couleur ou la seule position, et les textes alternatifs et de lien disent quelque chose (« figure 1 » ne décrit rien).
Un champ de formulaire sans label est annoncé par son nom : écrivez un libellé pour des mots qu'une personne dirait.
Déclarations et versions PDF
Les parties 2 et 3 de PDF/A et PDF/UA-1 sont définies sur PDF 1.7. PDF/A-4, PDF/UA-2 et Well-Tagged PDF sont définies sur PDF 2.0. Les déclarations des deux côtés ne se combinent pas :
| Déclaration | Sortie | Peut accompagner |
|---|---|---|
par défaut, a-2*, a-3* | PDF 1.7 | ua-1 |
a-4 | PDF 2.0 | ua-2, wtpdf-* |
ua-1 | PDF 1.7 | a-2*, a-3* |
ua-2, wtpdf-* | PDF 2.0 | a-4 (ce que devient aussi la valeur par défaut) |
metadata.pdfVersion fixe la sortie à "1.7" ou "2.0". Sans elle, la version suit les déclarations. Une version fixée n'est jamais remplacée : une déclaration qui la contredit, comme ua-1 avec "2.0", est refusée avant tout rendu.
DOCX : classe Office Open XML
| Valeur | Classe |
|---|---|
strict | ISO/IEC 29500 Strict |
transitional | ISO/IEC 29500 Transitional |
Un paquet est conforme à une seule classe : les deux ne peuvent pas être déclarées ensemble. Une classe déclarée est produite telle quelle : ce que Strict ne peut pas porter est omis et signalé, jamais écrit dans l'autre classe.
Quand une déclaration ne peut pas être faite
- Refusée avant le rendu. Une contradiction visible dans la définition elle-même (deux parties d'une même norme,
a-2bavecua-2, une déclaration contraire à lapdfVersionfixée), ou une clé qu'exige une déclaration d'accessibilité, est une erreur de validation : rien n'est rendu ni facturé, et le message nomme la clé. - Retirée au rendu. Quand le fichier final ne respecterait pas une déclaration, que vous l'ayez demandée ou qu'il s'agisse de l'archivage par défaut, le document est quand même livré et comptabilisé, sans cette déclaration. Les
errorCodesde la réponse portentCONFORMANCE_WITHHELD: vérifiez-les avant de transmettre le document. La raison et la clause figurent dans les diagnostics du rendu : activez les diagnostics pendant la rédaction pour les voir dans l'annexe du document. - Pas un retrait. Un document chiffré qui ne déclare aucune partie de PDF/A n'est pas archivable par conception : rien de ce que vous avez demandé n'est perdu, donc aucun code, seulement une note dans les diagnostics.
errorCodes avant de transmettre un documentUn document dont la conformité a été retirée est quand même livré. Si vos utilisateurs comptent sur PDF/A ou PDF/UA, traitez CONFORMANCE_WITHHELD dans les errorCodes de la réponse comme un échec dans votre intégration.