Aller au contenu

Dépannage : échecs de validation PDF/A et PDF/UA

Ces entrées couvrent les échecs signalés par le moteur lorsqu’il maintient un document dans un profil PDF/A ou PDF/UA. Les numéros de clause ci-dessous sont ceux que le moteur cite dans son propre code source et dans ses messages d’exception. Cette page les paraphrase. Le moteur signale les échecs de profil qu’il détecte : il ne certifie pas qu’un document est conforme. Le verdict de conformité qui fait autorité provient d’un validateur externe qui exécute son propre jeu de règles.

  • Symptôme. NextPDF\Security\Exception\IncompatiblePdfAModeException avec un message indiquant qu’une opération de chiffrement est interdite dans un mode PDF/A.
  • Cause probable. Le pipeline a activé un mode PDF/A tout en demandant le chiffrement. Le moteur cite ISO 19005-{1,2,3,4} §6.1.3 : la clé Encrypt ne doit pas être présente dans le trailer d’un fichier PDF/A. Le moteur traite cela comme un refus absolu, quel que soit l’ordre des appels.
  • Preuves / diagnostic. getContext() renvoie pdfa_mode et encryption_operation. Le test du chemin d’échec tests/SecurityScenarios/PdfAEncryptionRefusalTest.php vérifie que le refus est déclenché, que PDF/A ait été activé avant ou après l’appel de chiffrement.
  • Résolution.
    1. Détermine de quelle propriété le document a besoin : conformité d’archivage ou chiffrement.
    2. Pour un document d’archivage, supprime l’appel de chiffrement.
    3. Pour un document chiffré, supprime l’appel d’activation de PDF/A.
    4. Relance le pipeline.
  • À lire aussi. Chiffrement et permissions.

Entrée : le filtre d’image est interdit sous PDF/A-1

Section intitulée « Entrée : le filtre d’image est interdit sous PDF/A-1 »
  • Symptôme. Pdf14FeatureRejectedException levée pendant l’ingestion de l’image, avec un message qui nomme /JPXDecode ou /JBIG2Decode et la clause ISO 19005-1:2005 §6.1.13.
  • Cause probable. Une build PDF/A-1 a traité une image qui utilise un filtre introduit après PDF 1.4. PDF/A-1 vise l’ensemble de fonctionnalités de PDF 1.4, donc PdfA1FeatureGuard rejette JPEG 2000 (/JPXDecode) et JBIG2 (/JBIG2Decode).
  • Preuves / diagnostic. src/Writer/PdfA1FeatureGuard.php contient la liste des filtres interdits et lève l’exception avec la clause citée. Ce garde-fou ne rejette ces filtres que sous le profil PDF/A-1 ; PDF/A-2, PDF/A-3 et le profil PDF 2.0 les autorisent.
  • Résolution.
    1. Réencode l’image source sans JPEG 2000 ni JBIG2 — par exemple, ré-enregistre-la en JPEG baseline ou sous forme d’image compressée avec Flate.
    2. À défaut, vise PDF/A-2 ou PDF/A-3, qui autorisent ces filtres.
    3. Relance la build.
  • À lire aussi. Référence de conformité.

Entrée : une police n’est pas incorporée sous PDF/A

Section intitulée « Entrée : une police n’est pas incorporée sous PDF/A »
  • Symptôme. Une build PDF/A échoue lors de son étape de validation des polices ; un validateur externe signale une police non incorporée.
  • Cause probable. Un glyphe a été tracé avec une police dont le programme n’est pas incorporé. Le contrat du gestionnaire PDF/A stipule que toute police doit être incorporée ; aucune police standard-14 n’est autorisée sans incorporation.
  • Preuves / diagnostic. src/Contracts/PdfAManagerInterface.php déclare validateFont(string $fontName, bool $isEmbedded, array $cmapForward) avec la règle documentée « All fonts must be embedded ; no standard 14 fonts allowed without embedding. » L’implémentation concrète de cette règle est livrée dans nextpdf/pro.
  • Résolution.
    1. Identifie la police signalée comme non incorporée.
    2. Configure cette police avec un fichier de programme incorporable plutôt que de t’appuyer sur une police standard-14 intégrée.
    3. Pour comprendre l’interaction avec la substitution Base 14, lis l’entrée sur les polices et le balisage.
    4. Relance la build et revalide.
  • À lire aussi. Polices et balisage.

Entrée : du JavaScript est présent et la validation PDF/A échoue

Section intitulée « Entrée : du JavaScript est présent et la validation PDF/A échoue »
  • Symptôme. Une build PDF/A échoue à son étape de validation JavaScript, ou un validateur externe signale une action JavaScript.
  • Cause probable. Le document, ou un champ de formulaire, contient une action JavaScript. Le contrat du gestionnaire PDF/A cite ISO 19005-4:2020 §6.7.1, qui interdit les actions JavaScript.
  • Preuves / diagnostic. PdfAManagerInterface::validateNoJavaScript() et validateNoJavaScriptActions() citent toutes deux §6.7.1 dans leurs docblocks.
  • Résolution.
    1. Supprime l’action JavaScript du document ou du champ de formulaire.
    2. Si l’action est requise pour le fonctionnement attendu, le document ne peut pas être PDF/A ; produis une variante non-PDF/A pour cet usage.
    3. Relance la build et revalide.
  • À lire aussi. Référence de conformité.

Entrée : la sortie balisée ne se déclare pas PDF/UA-2

Section intitulée « Entrée : la sortie balisée ne se déclare pas PDF/UA-2 »
  • Symptôme. Un document construit avec le balisage activé n’est pas reconnu comme PDF/UA-2, ou la déclaration PDF/UA-2 est absente.
  • Cause probable. L’arbre de structure est vide. Le moteur ne déclare pas PDF/UA-2 pour un document qui ne contient aucune structure balisée, car un arbre de structure vide ne satisfait pas le profil.
  • Preuves / diagnostic. Le test du chemin d’échec tests/Integration/Accessibility/EmptyTaggedPdfDoesNotAdvertisePdfUa2Test.php vérifie qu’un document balisé mais vide ne se déclare pas PDF/UA-2. C’est le comportement documenté du moteur, pas un défaut.
  • Résolution.
    1. Vérifie que le contenu est émis via le chemin de balisage afin que l’arbre de structure soit renseigné, plutôt que vide.
    2. Vérifie que les séquences de contenu marqué pointent vers des éléments de structure.
    3. Relance la build et revérifie le statut PDF/UA-2.
  • À lire aussi. Polices et balisage.

Entrée : PDF/UA-2 échoue sur une langue manquante ou invalide

Section intitulée « Entrée : PDF/UA-2 échoue sur une langue manquante ou invalide »
  • Symptôme. Une vérification PDF/UA-2 échoue parce qu’une entrée de langue manque ou n’est pas une balise valide.
  • Cause probable. Le document ou un élément de structure ne déclare pas de langue valide. PDF/UA-2 exige une déclaration de langue naturelle ; une valeur Lang manquante ou mal formée fait échouer la vérification stricte.
  • Preuves / diagnostic. Le test du chemin d’échec tests/Unit/Conformance/PdfUa2Section844LangStrictTest.php teste l’exigence stricte de langue. Les balises de langue sont validées via src/Accessibility/Bcp47Validator.php ; une balise invalide entraîne src/Accessibility/InvalidBcp47TagException.php.
  • Résolution.
    1. Définis une langue au niveau du document sous la forme d’une balise BCP-47 valide, par exemple en-US ou zh-Hant-TW.
    2. Lorsqu’un passage est rédigé dans une autre langue, définis la langue sur cet élément de structure.
    3. Relance la build et revalide.
  • À lire aussi. Polices et balisage.
  • Les refus PDF/A et PDF/UA décrits ici sont émis par le moteur lui-même. Ils sont indépendants du verdict d’un validateur externe et ne le remplacent pas — exécute un validateur tel que veraPDF pour obtenir le résultat qui fait autorité.
  • Le writer concret chargé des objets requis par PDF/A (flux de métadonnées XMP, output intent avec un profil ICC) est résolu à l’exécution depuis nextpdf/pro. Avec le seul package cœur installé, ces objets ne sont pas émis ; une build avec le cœur seul n’est pas un producteur PDF/A complet.
  • Le refus de chiffrement est absolu et indépendant de l’ordre — activer PDF/A après l’appel de chiffrement déclenche quand même le refus.

Glossaire : output intent · arbre de structure