CheckFileCompliance

Conformité, inspection de documents

Sélection du profil de lecteur PDF/UA

Les contrôles PDF/UA sélectionnent la partie 2 lorsque le XMP identifie pdfuaid:part=2 et conservent sinon les contrôles de la partie 1 ; les contrôles PDF/UA-1 historiques décrits ici ne sont nullement implicites pour la partie 2

Le profil PDF/UA-2 implémente les contrôles de base d’identification, d’espaces de noms, de rôles et de structure ; les rapports structurés utilisent PDF/UA-2 et ISO 14289-2 et indiquent fullCertification=false ainsi que le périmètre non vérifié

Utilisez CheckFilePDFUACompliance ou RunPDFUAValidationPipelineTask pour forcer une partie cible, et GetPDFUAReadValidationCoverageJSON pour inspecter les limites de capacités

Description

Lit un fichier PDF externe et le valide par rapport à une norme de conformité ISO choisie. La valeur renvoyée vaut soit zéro (le fichier passe proprement le test choisi), soit un handle StringListID non nul qui recense chaque anomalie détectée. Chaque entrée de la liste est un code court, deux-points, et un message lisible — exactement le même format de code que celui utilisé par GetPDFUADiagnostics. Énumérez le résultat avec GetStringListCount et GetStringListItemLe test PDF/A couvre les six modes de conformité (PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-3a, PDF/A-3b) et lit les entrées XMP

pdfaid:part/pdfaid:conformance pour décider quel jeu de règles appliquerLe test PDF/UA-1 (ajouté en v3.56.0) vérifie un PDF externe par rapport à ISO 14289-1 et émet des codes de diagnostic dans la plage

10xxx afin qu'ils restent visuellement séparés des codes PDF/A 00xxx

Syntaxe

Delphi

Function TPDFlib.CheckFileCompliance(Const InputFileName, Password: WideString; ComplianceTest, Options: Integer): Integer;

ActiveX

Function PDFlib::CheckFileCompliance(InputFileName As String, Password As String, ComplianceTest As Long, Options As Long) As Long

DLL

int DLCheckFileCompliance(int InstanceID, const wchar_t * InputFileName, const wchar_t * Password, int ComplianceTest, int Options);

Paramètres

InputFileNameChemin complet du fichier PDF à valider. Le fichier est ouvert en lecture seule et n'est pas modifié.
PasswordMot de passe utilisé pour ouvrir le fichier. Passez une chaîne vide pour les documents non chiffrés. Notez qu'un document chiffré échoue au test PDF/A (code 00006), que le mot de passe correct soit fourni ou non — PDF/A interdit le chiffrement.
ComplianceTestLa norme à vérifier.

1 — PDF/A (ISO 19005-1/-2/-3, les six niveaux de conformité).
2 — PDF/UA-1 (ISO 14289-1:2014, PDF accessible).
3 — PDF/X (ISO 15930, y compris la famille PDF/X-6).
4 — PDF/VT-3 (ISO 16612-3:2020 sur une base de la famille PDF/X-6).
5 — PDF/R-1, échange raster restreint.
6 — PDF/VCR-1, gabarits de remplacement à contenu variable.
7 — PDF/E-1, échange de documents d'ingénierie.
OptionsIndicateurs binaires modifiant le test.

0 — Par défaut : signaler chaque anomalie trouvée dans le document.
1 — S'arrêter après la première anomalie et renvoyer immédiatement. Utile lorsque l'appelant n'a besoin que d'un signal réussite/échec.

Valeurs de retour

0Le fichier est conforme à la norme choisie.
Non-zeroUn handle StringListID dont les entrées décrivent chaque non-conformité détectée. Le handle reste valide jusqu'à la fermeture du document ou jusqu'à l'appel de ReleaseStringList.

Codes d'anomalie PDF/A (ComplianceTest = 1)

00002La version PDF dépasse le maximum autorisé par le niveau de conformité (PDF/A-1 plafonne à 1.4 ; PDF/A-2 et PDF/A-3 plafonnent à 1.7). La ligne de détail nomme la version en cause et le maximum autorisé.
00003Le catalogue contient /OCProperties (contenu facultatif / calques), interdit par PDF/A-1. PDF/A-2 et PDF/A-3 autorisent les calques et ne déclenchent pas ce contrôle.
00005La paire XMP pdfaid:part+pdfaid:conformance est absente, mal formée, ou contient une valeur hors de l'ensemble légal 1A, 1B, 2A, 2B, 3A, 3B. La bibliothèque ne peut pas déterminer quel jeu de règles appliquer, si bien que l'anomalie est signalée comme fatale indépendamment de Options.
00006Le document est chiffré. PDF/A interdit le chiffrement dans toutes ses parties.
00007Le catalogue n'a pas d'entrée /OutputIntents. Toutes les parties PDF/A exigent une intention de sortie afin que l'espace colorimétrique de rendu soit défini sans ambiguïté.
00011Le catalogue n'a pas d'entrée /MarkInfo. Requis uniquement pour la conformité de niveau a (PDF/A-1a, 2a, 3a) — le PDF balisé doit se déclarer.
00012Le catalogue n'a pas d'entrée /StructTreeRoot. Requis uniquement pour la conformité de niveau a. Un document PDF balisé doit posséder une arborescence de structure logique.

Codes d'anomalie PDF/UA-1 (ComplianceTest = 2)

10001Le flux de métadonnées XMP ne contient pas pdfuaid:part, ou la valeur n'est pas 1. ISO 14289-1 §5 exige qu'un fichier conforme s'identifie au moyen de cette propriété ; ISO 14289-1 §6.2 interdit de revendiquer la conformité sans elle.
10002Le catalogue du document n'a pas de flux /Metadata. La revendication de conformité PDF/UA-1 est consignée dans ce flux ; sans lui, le fichier ne peut pas s'annoncer comme accessible.
10003Le dictionnaire /MarkInfo du catalogue est absent ou /Marked ne vaut pas true. ISO 14289-1 §7.1 exige que tout fichier conforme se déclare comme balisé afin que les technologies d'assistance puissent s'appuyer sur l'arborescence de structure.
10004Le catalogue n'a pas d'entrée /StructTreeRoot. Un fichier PDF/UA-1 doit inclure une arborescence de structure logique décrivant l'ordre de lecture et la sémantique du document.
10005Le dictionnaire /ViewerPreferences est absent ou son entrée /DisplayDocTitle ne vaut pas true. ISO 14289-1 §7.1 exige que les lecteurs conformes affichent le titre du document dans leur fenêtre plutôt que le nom du fichier.
10006L'entrée /Lang du catalogue est absente ou vide. ISO 14289-1 §7.2 (renvoyant à ISO 32000-1 §14.9.2) exige que tout fichier conforme déclare sa langue naturelle afin que les lecteurs d'écran retiennent la voix et les règles de prononciation correctes.
10007Le flux de métadonnées XMP ne comporte pas de dc:title Dublin Core non vide. ISO 14289-1 §7.1 exige "une entrée dc:title qui identifie clairement le document".
10008Le dictionnaire /MarkInfo a /Suspects à true. ISO 14289-1 §7.1 : les fichiers revendiquant la conformité PDF/UA doivent avoir une valeur Suspects de false — une valeur true marque le balisage comme susceptible de contenir des erreurs.
10009Le /RoleMap du document remappe un ou plusieurs types de structure standard. ISO 14289-1 §7.1 : les balises standard définies dans ISO 32000-1 §14.8.4 (P, H1..H6, Figure, Table, etc.) ne doivent pas être remappées. La ligne de détail nomme la première balise standard remappée.
10010Le fichier est chiffré, mais le bit 10 de la clé d'autorisation de chiffrement /P (masque 512, "Extract for accessibility") n'est pas défini. ISO 14289-1 §7.16 exige que tout fichier conforme chiffré autorise l'extraction pour l'accessibilité afin que les technologies d'assistance puissent accéder au contenu.
10011Un formulaire XFA dynamique a été détecté : le paquet XDP XFA contient <dynamicRender>required</dynamicRender>. ISO 14289-1 §7.15 interdit les formulaires XFA dynamiques dans les fichiers conformes ; le XFA statique est permis.
10012Un Reference XObject (Form XObject portant une entrée /Ref) a été détecté. ISO 14289-1 §7.20 interdit les XObjects de référence car ils permettent à un PDF d'en incorporer un autre par référence sans exposer le contenu référencé aux technologies d'assistance.
10013Une ou plusieurs annotations TrapNet ont été détectées. ISO 14289-1 §7.18.2 interdit explicitement TrapNet dans les fichiers conformes. La ligne de détail indique combien d'annotations ont été trouvées.
10014Une ou plusieurs pages portent des annotations mais ne définissent pas /Tabs /S dans leur dictionnaire de page. ISO 14289-1 §7.18.3 exige que l'ordre de tabulation de telles pages suive l'arborescence de structure, ce que signale /Tabs /S. La ligne de détail indique le nombre de pages en cause.
10015Une ou plusieurs annotations Link n'ont pas de description alternative /Contents non vide. ISO 14289-1 §7.18.5 exige que chaque annotation Link porte une description accessible afin que les lecteurs d'écran puissent annoncer la cible du lien. La ligne de détail indique le nombre d'annotations Link en cause.
10016Un ou plusieurs dictionnaires FileSpec de fichiers incorporés n'ont pas la clé de nom de fichier /F. ISO 14289-1 §7.11 exige que chaque FileSpec de fichier incorporé porte à la fois /F et /UF.
10017Un ou plusieurs dictionnaires FileSpec de fichiers incorporés n'ont pas la clé de nom de fichier Unicode /UF. ISO 14289-1 §7.11 exige que chaque FileSpec de fichier incorporé porte à la fois /F et /UF.
10018Un ou plusieurs dictionnaires de configuration de contenu facultatif n'ont pas de chaîne de texte /Name non vide. ISO 14289-1 §7.10 exige que chaque dictionnaire de configuration OCG (l'entrée par défaut D plus chaque dictionnaire de OCProperties/Configs) porte un /Name non vide.
10019Un ou plusieurs dictionnaires de configuration de contenu facultatif contiennent la clé /AS interdite. ISO 14289-1 §7.10 interdit explicitement /AS dans tout dictionnaire de configuration OCG afin d'empêcher les ajustements d'état automatiques pilotés par les informations d'utilisation.
10020Une ou plusieurs polices hors Standard 14 référencées par le document n'incorporent pas leur programme de police (pas d'entrée FontFile, FontFile2 ou FontFile3 sur le FontDescriptor). ISO 14289-1 §7.21.4.1 exige que chaque police utilisée pour le rendu incorpore son programme. Les polices Type 3 échappent à ce contrôle car leurs glyphes sont des CharProcs en ligne.
10021Un ou plusieurs descendants CIDFontType2 n'ont pas l'entrée /CIDToGIDMap. ISO 14289-1 §7.21.3.2 exige que chaque CIDFont Type 2 incorporé porte /CIDToGIDMap (soit sous forme d'un flux faisant correspondre les CIDs aux indices de glyphes, soit sous forme du nom Identity).
10022Une ou plusieurs polices Standard 14 (Helvetica, Times, Courier, Symbol, ZapfDingbats et leurs variantes gras / oblique) sont référencées sans programme de police incorporé. ISO 14289-1 §7.21.4 NOTE 5 précise qu'il n'y a aucune exemption d'incorporation pour les 14 polices Type 1 standard.
10023Une ou plusieurs polices n'ont pas de CMap /ToUnicode et ne relèvent pas de la liste d'exemption §7.21.7. Cette liste couvre les MacRomanEncoding / MacExpertEncoding / WinAnsiEncoding prédéfinis, les polices Type 0 dont le CIDFont descendant utilise les collections de caractères Adobe GB1 / CNS1 / Japan1 / Korea1, et les polices TrueType non symboliques.
10024Le premier élément de titre dans l'ordre du document n'est pas H1 (ou le H fortement structuré). ISO 14289-1 §7.4.2 : "Si des balises de titre sont utilisées, H1 doit être le premier."
10025Un ou plusieurs sauts de niveau de titre ont été détectés dans l'ordre du document — p. ex. un H1 immédiatement suivi d'un H3, en sautant H2. ISO 14289-1 §7.4.2 exige que les séquences de titres descendantes progressent dans un ordre numérique strict sans sauter de niveaux intermédiaires.
10026Une ou plusieurs annotations Widget n'ont pas d'entrée /StructParent. ISO 14289-1 §7.18.4 exige que les annotations Widget soient imbriquées dans une balise de structure Form ; sans /StructParent, le widget ne peut absolument pas être atteint depuis l'arborescence de structure. La ligne de détail indique le nombre.
10027Une ou plusieurs annotations Widget ont une entrée /StructParent mais la valeur ne se résout pas, via StructTreeRoot/ParentTree, vers un élément de structure avec /S = Form. ISO 14289-1 §7.18.4 exige que chaque annotation Widget soit imbriquée dans une balise de structure Form. Causes possibles : l'entrée /ParentTree manque entièrement, pointe vers un non-StructElem (entier brut / dictionnaire MCR) ou nomme une balise non Form.
10028Une ou plusieurs polices TrueType non symboliques ont un /Encoding (ou un /BaseEncoding de dictionnaire Encoding) qui n'est ni MacRomanEncoding ni WinAnsiEncoding. ISO 14289-1 §7.21.6 restreint l'encodage TrueType non symbolique à ces deux noms prédéfinis.
10029Une ou plusieurs polices TrueType symboliques comportent une entrée /Encoding dans le dictionnaire de police. Le quatrième paragraphe de ISO 14289-1 §7.21.6 l'interdit — l'encodage TrueType symbolique doit s'exprimer uniquement par la table cmap du programme de police incorporé.
10030Un ou plusieurs éléments de structure L (liste) n'ont pas l'attribut ListNumbering. ISO 14289-1 §7.6 exige que chaque balise L déclare son style de numérotation via cet attribut. Les valeurs valides sont None, Disc, Circle, Square, Decimal, UpperRoman, LowerRoman, UpperAlpha et LowerAlpha (ISO 32000-1 Table 347).
10031Une ou plusieurs annotations Link portent un dictionnaire d'action URI dont l'entrée /IsMap vaut true. ISO 14289-1 §7.18.5 interdit /IsMap = true sur une action URI, sauf si une fonctionnalité équivalente est fournie ailleurs dans le contenu sans clé /IsMap. Les auteurs ayant un cas d'usage IsMap légitime devraient supprimer ce diagnostic de leur propre initiative.
10032Un ou plusieurs éléments de structure Note n'ont pas l'entrée /ID. ISO 14289-1 §7.9 exige que chaque balise Note déclare un /ID unique afin que les références croisées puissent viser une cible stable.
10033Au moins deux éléments de structure Note partagent la même valeur /ID. La ligne de détail indique le nombre de paires en double détectées. ISO 14289-1 §7.9 exige que les ID des Note soient uniques dans le document.
10034Un ou plusieurs programmes TrueType non symboliques (FontDescriptor avec l'indicateur Symbolic effacé, flux FontFile2 présent) incorporent une table cmap dont la seule sous-table est l'entrée symbolique (3,0) Microsoft. Le premier paragraphe de ISO 14289-1 §7.21.6 exige au moins une sous-table cmap non symbolique afin que le programme puisse rendre les points de code déclarés par son /Encoding.
10035Une ou plusieurs polices TrueType non symboliques déclarent un /Encoding avec un tableau /Differences contenant des noms de glyphes absents de l'Adobe Glyph List 2.0. .notdef est toléré car la spécification l'autorise implicitement. Le troisième paragraphe de ISO 14289-1 §7.21.6 exige que chaque entrée Differences figure dans l'AGL.
10036Une ou plusieurs largeurs de polices TrueType simples diffèrent des métriques correspondantes du programme de police incorporé de plus d'un millième d'em. ISO 14289-1 §7.21.5 exige que le tableau /Widths concorde avec les métriques de glyphes incorporées.
10037Une ou plusieurs largeurs CIDFontType2 diffèrent des métriques correspondantes du programme TrueType incorporé de plus d'un millième d'em. ISO 14289-1 §7.21.5 exige que le tableau /W concorde avec les métriques de glyphes incorporées.
10038Un /CharSet de descripteur de police Type 1 omet un ou plusieurs noms de glyphes présents dans son programme de police incorporé. ISO 14289-1 §7.21.4.2 exige que l'entrée énumère chaque glyphe incorporé.
10039Un /CIDSet de descripteur de police CID omet un ou plusieurs CIDs correspondant à des glyphes de son programme de police incorporé. ISO 14289-1 §7.21.4.2 exige que l'ensemble de bits identifie chaque CID incorporé.
10040Un Form XObject contenant du texte est appelé depuis un contenu de page hors contenu marqué. ISO 14289-1 §7.20 exige que le contenu d'un Form XObject soit incorporé dans des éléments de structure.
10041Un ou plusieurs opérandes d'affichage de texte se résolvent au glyphe .notdef. ISO 14289-1 §7.21.8 interdit les références à .notdef quel que soit le mode de rendu du texte.
10042Un ou plusieurs dictionnaires de données de séquence multimédia (identifiés par /S /MCD, éventuellement /Type /MediaClip) n'ont pas l'entrée obligatoire de type de contenu /CT. ISO 14289-1 §7.18.6 rend obligatoire cette clé facultative de ISO 32000-1 Table 274.
10043Un ou plusieurs dictionnaires de données de séquence multimédia n'ont pas le tableau obligatoire /Alt (paires chaîne de langue + texte alternatif). ISO 14289-1 §7.18.6 rend obligatoire cette clé facultative de ISO 32000-1 Table 274 afin que les technologies d'assistance puissent annoncer une description du multimédia incorporé.
10044Un ou plusieurs nœuds de l'arborescence de structure portent plus d'un enfant H (titre générique) direct. ISO 14289-1 §7.4.4 l'interdit explicitement — scindez la section, ou remplacez les balises H par des niveaux H1..H6 numérotés.

Remarques

Le test PDF/A est conçu comme une vérification automatique rapide avant livraison. Il repère les anomalies au niveau du document qui disqualifient d'emblée un fichier (version PDF erronée, OutputIntent absent, arborescence de structure absente au niveau A, chiffrement, calques en PDF/A-1). Il ne parcourt pas chaque opérateur de flux de contenu et ne vérifie ni l'incorporation des polices ni les références d'espaces colorimétriques de chaque objet peint — ces validations requièrent un validateur PDF/A dédié (tel que veraPDF). Utilisez cette fonction comme contrôle de première ligne et comme barrière de régression dans les pipelines de build. Utilisez CreatePreflightReport ou SavePreflightReport lorsque vous voulez que la bibliothèque mette en forme les listes d'anomalies dans un rapport texte réutilisable. Utilisez CreatePreflightReportEx ou SavePreflightReportEx pour une sortie de rapport en texte, JSON, HTML ou CSV, ou consultez Preflight Reports pour le workflow de rapport completL'API associée

GetPDFUADiagnostics effectue des contrôles analogues pour PDF/UA (ISO 14289-1) sur le document en mémoire en cours de construction, plutôt que sur un fichier externeLorsque vous produisez une sortie PDF/A avec cette bibliothèque, appelez

SetPDFAMode avant d'ajouter du contenu. Le garde-fou côté génération intégré à SetPDFAMode bloque les opérations interdites par la partie choisie, si bien qu'un document construit ainsi passera normalement CheckFileCompliance automatiquement

Exemple

// Validate a delivered PDF/A file and print all issues
var
  Issues, Count, I: Integer;
begin
  Issues := PDF.CheckFileCompliance('archive.pdf', '', 1, 0);
  if Issues = 0 then
    WriteLn('archive.pdf: PDF/A conformant')
  else
  begin
    Count := PDF.GetStringListCount(Issues);
    WriteLn('archive.pdf: ', Count, ' PDF/A issue(s) detected:');
    for I := 1 to Count do
      WriteLn('  ', PDF.GetStringListItem(Issues, I));
  end;
end;

// Fast pass/fail gate in a CI pipeline — stop on the first issue
var
  Failed: Boolean;
begin
  Failed := PDF.CheckFileCompliance('build/output.pdf', '', 1, 1) <> 0;
  if Failed then
    Halt(1);
end;

Voir aussi

Preflight Reports, CreatePreflightReport, CreatePreflightReportEx, SavePreflightReport, SavePreflightReportEx, ComparePreflightReports, SetPDFAMode, GetPDFUADiagnostics, GetStringListCount, GetStringListItem, SetPDFUAMode

Le test de conformité 3 audite PDF/X (ISO 15930) : identification d'édition, intention de sortie, géométrie de page, polices incorporées et l'ensemble des fonctionnalités interdites ; pour PDF/X-6, il valide aussi les indicateurs d'annotations et les apparences fixes, les apparences AcroForm et signature, les exclusions XFA et d'apparences générées par la visionneuse, le placement des actions, les chaînes d'actions, l'ensemble des actions nommées permises et chaque valeur UseBlackPtComp

Le test de conformité 4 audite les métadonnées d'identification PDF/VT-3, sa base de la famille PDF/X-6, le graphe DPartRoot et DPart, les noms et valeurs DPM, le niveau d'enregistrement, l'ordre des pages et la couverture exacte des feuilles ; les vérifications composées partagent une passe d'analyseur

Le test de conformité 5 audite le placement des marqueurs PDF/R-1, la version et le chiffrement, les objets indirects de génération zéro, les dictionnaires et filtres restreints, les programmes de page à flux unique, les bandes raster ordonnées, les codages d'image, la couverture de pages et la résolution effective ; il peut réutiliser une passe d'analyse de pipeline de validation partagée

Le test de conformité 6 audite la fondation PDF/X et l'identification XMP PDF/VCR-1, la racine de modèle directe unique, les champs déclarés, le champ de sélection de pages optionnel et chaque espace réservé de remplacement PassThrough de feuille, la liaison de pages, les MCID et les boîtes englobantes ; il peut réutiliser une passe d'analyse de pipeline de validation partagée

Le test de conformité 7 audite l'identification et les métadonnées de cycle de vie PDF/E-1, les identifiants de trailer, le chiffrement permis, les intentions de sortie et les espaces colorimétriques de périphérique, les opérateurs de contenu, les polices, les annotations, les formulaires, le contenu optionnel, les actions, les références à des fichiers externes, les états graphiques et les restrictions de flux 3D ; il peut réutiliser une passe d'analyse de pipeline de validation partagée