function ValidatePdfUa: TPdfUaValidationResult;
ValidatePdfUa detecteert PDF/UA-1 en PDF/UA-2 via XMP en past de regels van het geselecteerde profiel toe
pdfuaid:part = 1 en de bijbehorende pdfaExtension:schemas-beschrijving (§5)dc:title-item in het XMP-pakket (§7.1)StructTreeRoot in de catalogus of ergens in het bestand (§7.1) — vereist zodat het document überhaupt tagging kan dragen/MarkInfo << /Marked true /Suspects false >> (§7.1)/ViewerPreferences << /DisplayDocTitle true >> (§7.1)/Lang met een BCP 47-taalcode (§7.2)/ID-array en de afwezigheid van versleutelingxmp:CreateDate / xmp:ModifyDate (aanbevolen voor Info/XMP-pariteit)Het resultaat is een TPdfUaValidationResult-record:
puc1, puc2, pucNone of pucUnknownTPdfUaValidationIssues-verzameling met nul of meer waarden: pvuaiMissingXmpMetadata, pvuaiMissingPdfUaIdentifier, pvuaiMissingExtensionSchema, pvuaiMissingDcTitle, pvuaiMissingStructTreeRoot, pvuaiMissingMarkInfo, pvuaiSuspectsTrue, pvuaiMissingDisplayDocTitle, pvuaiMissingLang, pvuaiEncryptionPresent, pvuaiMissingTrailerId, pvuaiMissingXmpDates, pvuaiFontNotEmbedded, pvuaiFontMissingToUnicode, pvuaiMissingTabsOrder, pvuaiFigureMissingAlt, pvuaiFormulaMissingAlt, pvuaiNoteMissingId. Round 1 (v1.66.0) voegt pvuaiRoleMapMissing (7.1), pvuaiOptionalContentAsKey (7.10), pvuaiXfaPresent (7.15), pvuaiTrapNetAnnotation (7.18.2), pvuaiReferenceXObject (7.20) en pvuaiEncryptionPBitMissing (7.16 — de precieze versleutelingsschending die de oude any-encryption-vlag vervangt) toe. Round 2 (v1.67.0) voegt pvuaiLinkMissingContents (7.18.5), pvuaiAnnotationMissingContents (7.18.1), pvuaiEmbeddedFileMissingName (7.11), pvuaiMediaClipMissingAlt (7.18.6.2) en pvuaiCidFontMissingCidToGidMap (7.21.3.2) toe. Round 3 (v1.68.0) voegt pvuaiUriActionIsMap (7.18.5) en pvuaiHeadingSequenceViolation (7.4.2 — de eerste regel op structuurboomniveau; ValidatePdfUaStructureElements controleert nu de genummerde kopvolgorde) toe. Round 4 (v1.69.0) voegt pvuaiWidgetOutsideForm (7.18.4 — Widget-nesting in de structuurboom) en pvuaiSubsetMissingCharSet (7.21.4.2) toe. Round 5 (v1.70.0) voegt pvuaiSubsetMissingCidSet (7.21.4.2), pvuaiToUnicodeForbiddenValue (7.21.7), pvuaiLangInvalidFormat (7.2) en pvuaiOrderedListMissingListNumbering (7.6 — verhoogd sinds v1.71.0 wanneer een L-element een ListNumbering-waarde buiten de Table 347-verzameling declareert; een ontbrekend attribuut wordt niet gemarkeerd) toe. Round 7 (v1.80.0) voegt de §7.5-tabelcontroles pvuaiTableStructureInvalid (TH/TD buiten een TR, of TR/THead/TBody/TFoot buiten hun vereiste container), pvuaiTableHeaderMissingScope (een TH met zowel geen Scope-attribuut als geen ID, in een tabel waar geen enkele cel een Headers-koppeling gebruikt) en pvuaiTableHeadersUndefinedId (cellen verwijzen via Headers-arrays naar headers terwijl geen enkel structuurelement in het document een ID definieert; een losse dangling ingang naast resolveerbare wordt getolereerd, in lijn met de autoritatieve validator) toe. v1.81.0 voegt de §7.6-controle op list-nesting pvuaiListStructureInvalid toe (een LI buiten een L-container, of een Lbl/LBody buiten een LI-item; geneste lijsten en Lbl binnen Note/BibEntry worden geaccepteerd). v1.82.0 voegt de §7.1-controles op RoleMap-resolutie pvuaiRoleMapRemapsStandard (een RoleMap-ingang herdefinieert een standaard structuurtype) en pvuaiRoleMapUnresolved (een gebruikt niet-standaard structuurtype heeft geen RoleMap-ingang, of zijn keten is dangling of cyclisch; indirecte ketens die bij een standaard type uitkomen worden geaccepteerd en ongebruikte RoleMap-ingangen worden nooit beoordeeld) toe. v1.83.0 voegt de §7.4.4-controles op het kopmodel pvuaiHeadingModelMixed (de generieke H-tag gemengd met genummerde H1..Hn-koppen) en pvuaiHeadingMultipleInNode (een structuurknoop met meer dan één kind-H-kop) toe. v1.84.0 voegt de §7.1-controle op niet-getagde content pvuaiUntaggedContent toe (een geredereerd tekst- of afbeeldingsobject dat niet via zijn marked-content ID wordt geclaimd door de structuurboom van de pagina en ook niet als Artifact is gemarkeerd; kale padobjecten vallen buiten de controle om alomtekkende decoratie niet te vlaggen). v1.85.0 voegt de §7.15-controle op dynamische XFA pvuaiXfaDynamic toe (de XFA-configuratie zet dynamicRender op required) en retireert de any-XFA-kandidaat pvuaiXfaPresent (statische XFA is conform; de enum-waarde blijft bestaan maar wordt niet meer verhoogd). Sinds v1.85.1 draait de §7.18.3-controle pvuaiMissingTabsOrder per pagina: elke geannoteerde pagina heeft /Tabs /S in zijn eigen dictionary nodig. v1.86.0 voegt de §7.21.6-controles op TrueType-encoding pvuaiTrueTypeEncodingInvalid (een niet-symbolische TrueType mist Encoding, of die is niet direct of via BaseEncoding gelijk aan MacRomanEncoding of WinAnsiEncoding) en pvuaiSymbolicTrueTypeEncoding (een symbolische TrueType draagt een niet-standaard Encoding-naam; standaardnamen worden getolereerd omdat conforme documenten standaardgeëncodeerde fonts routinematig als symbolisch labelen) toe. v1.87.0 voegt de §7.21.3-controles op samengestelde fonts pvuaiCidSystemInfoMismatch (ingesloten CMap en afgeleide CIDFont verschillen op Registry/Ordering, of de Supplement van de CIDFont overtreft die van de CMap), pvuaiCMapNotEmbedded (een bij naam gerefereerde CMap is geen predefined CMap uit Table 118) en pvuaiCMapWModeMismatch (het dictionary-WMode van een ingesloten CMap wijkt af van zijn streamcontent; alleen byte-leesbare, ongecomprimeerde CMap-streams kunnen worden beoordeeld) toe, en verbreedt pvuaiCidFontMissingCidToGidMap zodat ook een CIDToGIDMap-naam anders dan Identity wordt gemarkeerd. v1.93.0 voegt de Pdfium-objectmodellaag toe — drie precieze problemen per font / per character, berekend uit de levende Pdfium-objectboom: pvuaiPdfiumFontNotEmbedded (§7.21.4, een font dat een pagina daadwerkelijk gebruikt is niet ingesloten volgens FPDFFont_GetIsEmbedded), pvuaiPdfiumUnicodeMapError (§7.21.7, een character op een pagina heeft een ongeldige Unicode-mapping volgens FPDFText_HasUnicodeMapError) en pvuaiPdfiumNotDefGlyph (§7.21.8, een character rendert naar Unicode 0 / .notdef). Deze vullen de heuristieken op byteniveau pvuaiFontNotEmbedded / pvuaiFontMissingToUnicode aan (die alleen aanslaan op een documentbreed signaal van nul ingesloten fonts of geen /ToUnicode); de traversatie kortsluit op drie niveaus (paginalus, lus per object, characterscan). v1.94.0 voegt zes tweede-pass-problemen toe uit een clausule-voor-clausule-heraudit: pvuaiHeadingFormatInvalid (§7.4.3, een koptag die met H begint maar niet de generieke H is en ook niet H + pure Arabische cijfers — scheidingstekens, spaties en Romeinse cijfers zijn verboden), pvuaiMissingDocumentOutline (§7.17, een document met meerdere pagina's zonder bookmark-overzicht; documenten van één pagina zijn vrijgesteld), pvuaiStructElementLangInvalid (§7.2, een /Lang-waarde van een structuurelement die geen geldige BCP 47-code is), pvuaiWidgetMissingPrintField (§7.14 / §7.18.4, een Widget-structuurelement zonder de PrintField-attribuuteigenaar), pvuaiLinkNotInStructureTree (§7.18.5, een document met /Subtype /Link-annotaties waarvan de structuurboom geen Link-element toont), en de Pdfium-annotatielaag pvuaiPdfiumAnnotationMissingContents / pvuaiPdfiumLinkMissingContents (§7.18.1 / §7.18.5, een precieze scan die verborgen, buiten de crop box vallende, Popup- en Widget-annotaties vrijstelt, waarmee de false positives van de heuristiek op byteniveau verdwijnen). v1.95.0 verbetert recall en soundness: de §7.21.3.3-controle pvuaiCMapWModeMismatch en de §7.21.7-controle pvuaiToUnicodeForbiddenValue poffen nu FlateDecode-gecomprimeerde CMap-/ToUnicode-streams op vóór het scannen (voorheen werden alleen ongecomprimeerde streams beoordeeld), en pvuaiSubsetCharSetEmpty (§7.21.4.2) vlagt een Type 1-subset-FontDescriptor waarvan de /CharSet-stringwaarde leeg is (de ontbrekende-sleutelcontrole ving alleen een afwezige sleutel). v1.96.0 voegt pvuaiAnnotationFlagsViolation (§7.18.1, een niet-vrijgestelde annotatie met Hidden / Invisible / NoView) en pvuaiActionTargetMissing (§7.18.5, een GoToR / URI / SubmitForm-actie zonder zijn doelsleutel) toe, beide geporteerd vanuit de PDF/A-validator, en fixt een bug in het rebasen van ParentIndex over pagina's heen in de structuurboommerge plus een RoleMap-parser die voortijdig stopte op indirect-referentie- of arraywaardenConformance een echt PDF/UA-niveau is en Issues leeg isPDF/UA-2-validatie vereist bovendien een viercijferige pdfuaid:rev, effectief PDF 2.0, A/W/S-annotatietabvolgorde, geen XFA, niet-lege namen in optional-content-configuraties, geen door PDF 2.0 afgeschafte Sound- of Movie-annotaties en expliciet genummerde structuurtypen H1 tot en met Hn voor de koppenstructuur
Sinds v3.73.0 kan de verzameling problemen ook pvuaiNaturalLanguageUncovered bevatten wanneer niet-Artifact-paginatekst of een structuur-Title-, Alt-, ActualText- of Expansion-string geen geldige effectieve /Lang-declaratie heeft
Sinds v3.74.0 kan de verzameling problemen ook pvuaiArtifactInStructureTree bevatten wanneer een Artifact-paginaobject een MCID draagt die door de structuurboom van de pagina wordt geclaimd, inclusief padgebaseerde pagineringsartifacts
Sinds v3.75.0 komen de Unicode-mappingproblemen uit één object-scoped InspectPdfUaUnicodeCoverage-pass; geldige ActualText dekt alleen characters uit het tekstobject waaruit hij afkomstig is, terwijl Artifact- en door PDFium gegenereerde characters buiten semantische dekking blijven
ValidatePdfUa is een alleen-lezen inspectie — het document wordt niet gewijzigd en herhaalde aanroepen zijn veilig. Gebruik het voordat een PDF naar een archiefsysteem of toegankelijkheidschecker gaat om niet-conformiteit aan de beheerder te tonen. Voor de gebruikelijke check "is dit PDF/UA-1?" die de problemenlijst niet nodig heeft, verdient de lichtere eigenschap PdfUaConformance de voorkeur
Conformance = pucUnknown en een lege Issues-verzamelingpvuaiSuspectsTrue alleen wanneer een expliciete /Suspects true in /MarkInfo staat. Documenten waarin de /Suspects-sleutel volledig ontbreekt worden op dit punt als conform beschouwd (de specificatie verbiedt alleen true)N 0 R); bestaande sleutels blijven behouden en het dictionary wordt genormaliseerd naar een direct dictionary in de herschreven catalogus
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;