function ValidatePdfUa: TPdfUaValidationResult;
ValidatePdfUa détecte PDF/UA-1 et PDF/UA-2 depuis XMP et applique les règles du profil sélectionné
pdfuaid:part = 1 et la description pdfaExtension:schemas correspondante (§5)dc:title obligatoire dans le paquet XMP (§7.1)StructTreeRoot dans le catalogue ou ailleurs dans le fichier (§7.1) — requis pour que le document puisse porter un balisage/MarkInfo << /Marked true /Suspects false >> (§7.1)/ViewerPreferences << /DisplayDocTitle true >> (§7.1)/Lang avec une balise de langue BCP 47 (§7.2)/ID de trailer et absence de chiffrementxmp:CreateDate / xmp:ModifyDate (recommandé pour la parité Info/XMP)Le résultat est un enregistrement TPdfUaValidationResult :
puc1, puc2, pucNone ou pucUnknownTPdfUaValidationIssues contenant zéro ou plusieurs valeurs : pvuaiMissingXmpMetadata, pvuaiMissingPdfUaIdentifier, pvuaiMissingExtensionSchema, pvuaiMissingDcTitle, pvuaiMissingStructTreeRoot, pvuaiMissingMarkInfo, pvuaiSuspectsTrue, pvuaiMissingDisplayDocTitle, pvuaiMissingLang, pvuaiEncryptionPresent, pvuaiMissingTrailerId, pvuaiMissingXmpDates, pvuaiFontNotEmbedded, pvuaiFontMissingToUnicode, pvuaiMissingTabsOrder, pvuaiFigureMissingAlt, pvuaiFormulaMissingAlt, pvuaiNoteMissingId. La passe 1 (v1.66.0) ajoute pvuaiRoleMapMissing (7.1), pvuaiOptionalContentAsKey (7.10), pvuaiXfaPresent (7.15), pvuaiTrapNetAnnotation (7.18.2), pvuaiReferenceXObject (7.20) et pvuaiEncryptionPBitMissing (7.16 — la violation de chiffrement précise qui remplace l’ancien indicateur de chiffrement quelconque). La passe 2 (v1.67.0) ajoute pvuaiLinkMissingContents (7.18.5), pvuaiAnnotationMissingContents (7.18.1), pvuaiEmbeddedFileMissingName (7.11), pvuaiMediaClipMissingAlt (7.18.6.2) et pvuaiCidFontMissingCidToGidMap (7.21.3.2). La passe 3 (v1.68.0) ajoute pvuaiUriActionIsMap (7.18.5) et pvuaiHeadingSequenceViolation (7.4.2 — la première règle au niveau de l’arbre de structure ; ValidatePdfUaStructureElements vérifie désormais la séquence de titres numérotés). La passe 4 (v1.69.0) ajoute pvuaiWidgetOutsideForm (7.18.4 — imbrication de Widget dans l’arbre de structure) et pvuaiSubsetMissingCharSet (7.21.4.2). La passe 5 (v1.70.0) ajoute pvuaiSubsetMissingCidSet (7.21.4.2), pvuaiToUnicodeForbiddenValue (7.21.7), pvuaiLangInvalidFormat (7.2) et pvuaiOrderedListMissingListNumbering (7.6 — levé depuis v1.71.0 lorsqu’un élément L déclare une valeur ListNumbering hors de l’ensemble du Tableau 347 ; un attribut absent n’est pas signalé). La passe 7 (v1.80.0) ajoute les contrôles de tableaux §7.5 pvuaiTableStructureInvalid (TH/TD hors d’un TR, ou TR/THead/TBody/TFoot hors de leur conteneur requis), pvuaiTableHeaderMissingScope (un TH ne portant ni attribut Scope ni ID dans un tableau où aucune cellule n’utilise une association Headers) et pvuaiTableHeadersUndefinedId (des cellules référencent des en-têtes via des tableaux Headers alors qu’aucun élément de structure du document ne définit d’ID ; une entrée orpheline isolée à côté d’entrées résolubles est tolérée, à l’instar du validateur de référence). v1.81.0 ajoute le contrôle d’imbrication de listes §7.6 pvuaiListStructureInvalid (un LI hors d’un conteneur L, ou un Lbl/LBody hors d’un élément LI ; les listes imbriquées et les Lbl dans Note/BibEntry sont acceptés). v1.82.0 ajoute les contrôles de résolution RoleMap §7.1 pvuaiRoleMapRemapsStandard (une entrée RoleMap redéfinit un type de structure standard) et pvuaiRoleMapUnresolved (un type de structure non standard utilisé n’a pas d’entrée RoleMap, ou sa chaîne est orpheline ou cyclique ; les chaînes indirectes atteignant un type standard sont acceptées et les entrées RoleMap inutilisées ne sont jamais jugées). v1.83.0 ajoute les contrôles de modèle de titres §7.4.4 pvuaiHeadingModelMixed (la balise H générique mélangée à des titres numérotés H1..Hn) et pvuaiHeadingMultipleInNode (un nœud de structure portant plus d’un titre H enfant). v1.84.0 ajoute le contrôle de contenu non balisé §7.1 pvuaiUntaggedContent (un objet texte ou image rendu ni revendiqué par l’arbre de structure de la page via son identifiant de contenu marqué ni marqué comme Artifact ; les objets chemin nus sont hors du contrôle pour éviter de signaler la décoration omniprésente). v1.85.0 ajoute le contrôle XFA dynamique §7.15 pvuaiXfaDynamic (la configuration XFA définit dynamicRender à required) et retire le candidat XFA quelconque pvuaiXfaPresent (le XFA statique est conforme ; la valeur d’énumération demeure mais n’est plus levée). Depuis v1.85.1, le contrôle §7.18.3 pvuaiMissingTabsOrder s’exécute par page : chaque page annotée exige /Tabs /S dans son propre dictionnaire. v1.86.0 ajoute les contrôles d’encodage TrueType §7.21.6 pvuaiTrueTypeEncodingInvalid (un TrueType non symbolique n’a pas d’Encoding, ou celui-ci n’est ni MacRomanEncoding ni WinAnsiEncoding directement ni via BaseEncoding) et pvuaiSymbolicTrueTypeEncoding (un TrueType symbolique porte un nom Encoding non standard ; les noms standards sont tolérés car les documents conformes étiquettent couramment à tort des polices à encodage standard comme symboliques). v1.87.0 ajoute les contrôles de polices composites §7.21.3 pvuaiCidSystemInfoMismatch (la CMap intégrée et la CIDFont descendante sont en désaccord sur Registry/Ordering, ou le Supplement de la CIDFont dépasse celui de la CMap), pvuaiCMapNotEmbedded (une CMap référencée par nom n’est pas une CMap prédéfinie du Tableau 118) et pvuaiCMapWModeMismatch (le WMode du dictionnaire d’une CMap intégrée diffère du contenu de son flux ; seuls les flux CMap lisibles octet par octet et non compressés peuvent être jugés), et élargit pvuaiCidFontMissingCidToGidMap pour signaler aussi un nom CIDToGIDMap autre que Identity. v1.93.0 ajoute la couche de modèle d’objet Pdfium — trois problèmes précis par police / par caractère calculés depuis l’arbre d’objets Pdfium live : pvuaiPdfiumFontNotEmbedded (§7.21.4, une police réellement utilisée par une page n’est pas intégrée selon FPDFFont_GetIsEmbedded), pvuaiPdfiumUnicodeMapError (§7.21.7, un caractère de page a un mappage Unicode invalide selon FPDFText_HasUnicodeMapError) et pvuaiPdfiumNotDefGlyph (§7.21.8, un caractère est rendu en Unicode 0 / .notdef). Ceux-ci complètent les heuristiques au niveau octet pvuaiFontNotEmbedded / pvuaiFontMissingToUnicode (qui ne se déclenchent que sur un signal à l’échelle du document de zéro police intégrée ou d’absence de /ToUnicode) ; le parcours court-circuite à trois niveaux (boucle de pages, boucle par objet, balayage de caractères). v1.94.0 ajoute six problèmes de seconde passe issus d’une réaudit clause par clause : pvuaiHeadingFormatInvalid (§7.4.3, une balise de titre commençant par H qui n’est ni le H générique ni H + chiffres arabes purs — séparateurs, espaces et chiffres romains interdits), pvuaiMissingDocumentOutline (§7.17, un document multipage sans plan de signets ; les documents d’une seule page sont exemptés), pvuaiStructElementLangInvalid (§7.2, une valeur /Lang d’élément de structure qui n’est pas une balise BCP 47 valide), pvuaiWidgetMissingPrintField (§7.14 / §7.18.4, un élément de structure Widget dépourvu du propriétaire d’attribut PrintField), pvuaiLinkNotInStructureTree (§7.18.5, un document avec des annotations /Subtype /Link dont l’arbre de structure n’expose aucun élément Link) et la couche d’annotations Pdfium pvuaiPdfiumAnnotationMissingContents / pvuaiPdfiumLinkMissingContents (§7.18.1 / §7.18.5, un balayage précis qui exempte les annotations masquées, hors du crop box, Popup et Widget, éliminant les faux positifs de l’heuristique au niveau octet). v1.95.0 améliore le rappel et la solidité : les contrôles §7.21.3.3 pvuaiCMapWModeMismatch et §7.21.7 pvuaiToUnicodeForbiddenValue décompressent désormais les flux CMap / ToUnicode compressés en FlateDecode avant le balayage (auparavant seuls les flux non compressés étaient jugés), et pvuaiSubsetCharSetEmpty (§7.21.4.2) signale un FontDescriptor de sous-ensemble Type 1 dont la valeur de chaîne /CharSet est vide (le contrôle de clé manquante ne détectait qu’une clé absente). v1.96.0 ajoute pvuaiAnnotationFlagsViolation (§7.18.1, une annotation non exemptée portant Hidden / Invisible / NoView) et pvuaiActionTargetMissing (§7.18.5, une action GoToR / URI / SubmitForm dont la clé cible est absente), tous deux portés depuis le validateur PDF/A, et corrige un bug de rebase ParentIndex inter-pages dans la fusion de l’arbre de structure ainsi qu’un analyseur RoleMap qui se terminait prématurément sur des valeurs de référence indirecte ou de tableauConformance est un vrai niveau PDF/UA et que Issues est videLa validation PDF/UA-2 exige en outre un
pdfuaid:rev à quatre chiffres, un PDF 2.0 effectif, un ordre de
tabulation d’annotations A/W/S, pas de XFA, des noms de configuration de contenu
optionnel non vides, pas d’annotations Sound ou Movie dépréciées en
PDF 2.0 et des types de structure de titres H1 à Hn numérotés
explicitement
Depuis v3.73.0, l’ensemble de problèmes peut aussi contenir pvuaiNaturalLanguageUncovered lorsqu’un texte de page non Artifact ou une chaîne de structure Title, Alt, ActualText ou Expansion n’a pas de déclaration /Lang effective valide
Depuis v3.74.0, l’ensemble de problèmes peut aussi contenir pvuaiArtifactInStructureTree lorsqu’un objet de page Artifact porte un MCID revendiqué par l’arbre de structure de la page, y compris les artefacts de pagination basés sur des chemins
Depuis v3.75.0, les problèmes de mappage Unicode proviennent d’une seule passe InspectPdfUaUnicodeCoverage à la portée d’un objet ; un ActualText valide ne couvre que les caractères de son objet texte d’origine, tandis que les caractères Artifact et générés par PDFium sont exclus de la couverture sémantique
ValidatePdfUa est une inspection en lecture seule — elle ne modifie pas
le document et peut être appelée en toute sécurité de façon répétée. Utilisez-la avant de remettre un
PDF à un système d’archivage ou à un contrôleur d’accessibilité pour faire remonter
la non-conformité à l’opérateur. Pour le contrôle courant « est-ce un PDF/UA-1 ? »
qui n’a pas besoin de la liste de problèmes, préférez la propriété plus légère
PdfUaConformance
Conformance = pucUnknown et un ensemble Issues videpvuaiSuspectsTrue que lorsqu’un /Suspects true explicite apparaît dans /MarkInfo. Les documents qui n’ont pas du tout la clé /Suspects sont considérés conformes sur ce point (la spécification n’interdit que true)N 0 R) ; les clés existantes sont préservées et le dictionnaire est normalisé en dictionnaire direct dans le catalogue réécrit
uses System.TypInfo;
var
Outcome: TPdfUaValidationResult;
Issue: TPdfUaValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\report.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfUa;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfUaConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfUaValidationIssue), Ord(Issue)));
end;