function ValidatePdfUa: TPdfUaValidationResult;
ValidatePdfUa erkennt PDF/UA-1 und PDF/UA-2 über XMP und wendet die Regeln des erkannten Profils an
pdfuaid:part = 1 und der passenden pdfaExtension:schemas-Beschreibung (§5)dc:title-Eintrag im XMP-Paket (§7.1)StructTreeRoot im Catalog oder sonst irgendwo in der Datei (§7.1) — erforderlich, damit das Dokument überhaupt Tagging tragen kann/MarkInfo << /Marked true /Suspects false >> (§7.1)/ViewerPreferences << /DisplayDocTitle true >> (§7.1)/Lang mit einem BCP-47-Sprachtag (§7.2)/ID-Array und die Abwesenheit von Verschlüsselungxmp:CreateDate / xmp:ModifyDate (empfohlen für Info/XMP-Parität)Das Ergebnis ist ein TPdfUaValidationResult-Record:
puc1, puc2, pucNone oder pucUnknownTPdfUaValidationIssues-Menge, die keinen oder mehrere der Werte enthält: pvuaiMissingXmpMetadata, pvuaiMissingPdfUaIdentifier, pvuaiMissingExtensionSchema, pvuaiMissingDcTitle, pvuaiMissingStructTreeRoot, pvuaiMissingMarkInfo, pvuaiSuspectsTrue, pvuaiMissingDisplayDocTitle, pvuaiMissingLang, pvuaiEncryptionPresent, pvuaiMissingTrailerId, pvuaiMissingXmpDates, pvuaiFontNotEmbedded, pvuaiFontMissingToUnicode, pvuaiMissingTabsOrder, pvuaiFigureMissingAlt, pvuaiFormulaMissingAlt, pvuaiNoteMissingId. Runde 1 (v1.66.0) ergänzt pvuaiRoleMapMissing (7.1), pvuaiOptionalContentAsKey (7.10), pvuaiXfaPresent (7.15), pvuaiTrapNetAnnotation (7.18.2), pvuaiReferenceXObject (7.20) und pvuaiEncryptionPBitMissing (7.16 — der präzise Verschlüsselungsverstoß, der das frühere Beliebig-Verschlüsselung-Flag ablöst). Runde 2 (v1.67.0) ergänzt pvuaiLinkMissingContents (7.18.5), pvuaiAnnotationMissingContents (7.18.1), pvuaiEmbeddedFileMissingName (7.11), pvuaiMediaClipMissingAlt (7.18.6.2) und pvuaiCidFontMissingCidToGidMap (7.21.3.2). Runde 3 (v1.68.0) ergänzt pvuaiUriActionIsMap (7.18.5) und pvuaiHeadingSequenceViolation (7.4.2 — die erste Regel auf Strukturbaum-Ebene; ValidatePdfUaStructureElements prüft nun die nummerierte Überschriftensequenz). Runde 4 (v1.69.0) ergänzt pvuaiWidgetOutsideForm (7.18.4 — Widget-Verschachtelung im Strukturbaum) und pvuaiSubsetMissingCharSet (7.21.4.2). Runde 5 (v1.70.0) ergänzt pvuaiSubsetMissingCidSet (7.21.4.2), pvuaiToUnicodeForbiddenValue (7.21.7), pvuaiLangInvalidFormat (7.2) und pvuaiOrderedListMissingListNumbering (7.6 — wird seit v1.71.0 ausgelöst, wenn ein L-Element einen ListNumbering-Wert außerhalb der Table-347-Menge deklariert; ein fehlendes Attribut wird nicht markiert). Runde 7 (v1.80.0) ergänzt die §7.5-Tabellenprüfungen pvuaiTableStructureInvalid (TH/TD außerhalb eines TR oder TR/THead/TBody/TFoot außerhalb ihres erforderlichen Containers), pvuaiTableHeaderMissingScope (ein TH ohne Scope-Attribut und ohne ID in einer Tabelle, in der keine Zelle eine Headers-Assoziation nutzt) und pvuaiTableHeadersUndefinedId (Zellen verweisen über Headers-Arrays auf Überschriften, während kein Strukturelement im Dokument eine ID definiert; ein einzelner verwaister Eintrag neben auflösbaren wird toleriert, passend zum maßgeblichen Validator). v1.81.0 ergänzt die §7.6-Listenverschachtelungsprüfung pvuaiListStructureInvalid (ein LI außerhalb eines L-Containers oder ein Lbl/LBody außerhalb eines LI-Elements; verschachtelte Listen und Lbl innerhalb von Note/BibEntry werden akzeptiert). v1.82.0 ergänzt die §7.1-RoleMap-Auflösungsprüfungen pvuaiRoleMapRemapsStandard (ein RoleMap-Eintrag definiert einen Standard-Strukturtyp um) und pvuaiRoleMapUnresolved (ein verwendeter nicht-standardmäßiger Strukturtyp hat keinen RoleMap-Eintrag, oder seine Kette ist verwaist oder zyklisch; indirekte Ketten, die bei einem Standardtyp ankommen, werden akzeptiert, und ungenutzte RoleMap-Einträge werden nie bewertet). v1.83.0 ergänzt die §7.4.4-Prüfungen des Überschriftenmodells pvuaiHeadingModelMixed (das generische H-Tag vermischt mit nummerierten H1..Hn-Überschriften) und pvuaiHeadingMultipleInNode (ein Strukturknoten mit mehr als einem untergeordneten H-Kopf). v1.84.0 ergänzt die §7.1-Prüfung auf ungetaggten Inhalt pvuaiUntaggedContent (ein gerendertes Text- oder Bildobjekt, das weder vom Strukturbaum der Seite über seine Marked-Content-ID beansprucht noch als Artifact markiert ist; bloße Pfadobjekte liegen außerhalb der Prüfung, um allgegenwärtige Dekoration nicht zu markieren). v1.85.0 ergänzt die §7.15-Prüfung für dynamisches XFA pvuaiXfaDynamic (die XFA-Konfiguration setzt dynamicRender auf required) und setzt den Beliebig-XFA-Kandidaten pvuaiXfaPresent ab (statisches XFA ist konform; der Enum-Wert bleibt bestehen, wird aber nicht mehr ausgelöst). Seit v1.85.1 läuft die §7.18.3-Prüfung pvuaiMissingTabsOrder seitenweise: Jede annotierte Seite benötigt /Tabs /S in ihrem eigenen Dictionary. v1.86.0 ergänzt die §7.21.6-TrueType-Kodierungsprüfungen pvuaiTrueTypeEncodingInvalid (einem nicht-symbolischen TrueType fehlt Encoding, oder es ist weder MacRomanEncoding noch WinAnsiEncoding, weder direkt noch über BaseEncoding) und pvuaiSymbolicTrueTypeEncoding (ein symbolisches TrueType trägt einen nicht standardmäßigen Encoding-Namen; Standardnamen werden toleriert, weil konforme Dokumente standardkodierten Schriftarten regelmäßig fälschlich symbolischen Charakter bescheinigen). v1.87.0 ergänzt die §7.21.3-Prüfungen für zusammengesetzte Schriftarten pvuaiCidSystemInfoMismatch (eingebettete CMap und nachgelagerter CIDFont widersprechen sich bei Registry/Ordering, oder der CIDFont-Supplement übersteigt den der CMap), pvuaiCMapNotEmbedded (eine namentlich referenzierte CMap ist keine in Table 118 vordefinierte CMap) und pvuaiCMapWModeMismatch (das Dictionary-WMode einer eingebetteten CMap weicht von ihrem Stream-Inhalt ab; nur bytelesbare, unkomprimierte CMap-Streams können bewertet werden) und weitet pvuaiCidFontMissingCidToGidMap darauf aus, auch einen CIDToGIDMap-Namen ungleich Identity zu markieren. v1.93.0 ergänzt die Pdfium-Objektmodellebene — drei präzise Probleme je Schriftart bzw. je Zeichen, berechnet aus dem lebendigen Pdfium-Objektbaum: pvuaiPdfiumFontNotEmbedded (§7.21.4, eine von einer Seite tatsächlich verwendete Schriftart ist gemäß FPDFFont_GetIsEmbedded nicht eingebettet), pvuaiPdfiumUnicodeMapError (§7.21.7, ein Seitenzeichen hat gemäß FPDFText_HasUnicodeMapError eine ungültige Unicode-Zuordnung) und pvuaiPdfiumNotDefGlyph (§7.21.8, ein Zeichen rendert als Unicode 0 / .notdef). Diese ergänzen die Byte-Level-Heuristiken pvuaiFontNotEmbedded / pvuaiFontMissingToUnicode (die nur bei einem dokumentweiten Null-Einbettungs- oder Kein-/ToUnicode-Signal anschlagen); der Durchlauf bricht auf drei Ebenen kurz (Seitenschleife, Objektschleife, Zeichenscan). v1.94.0 ergänzt sechs Probleme eines zweiten Durchlaufs aus einer klauselweisen Nachprüfung: pvuaiHeadingFormatInvalid (§7.4.3, ein Überschriften-Tag mit Anfangsbuchstabe H, das weder das generische H noch H plus reine arabische Ziffern ist — Trennzeichen, Leerzeichen und römische Ziffern sind verboten), pvuaiMissingDocumentOutline (§7.17, ein mehrseitiges Dokument ohne Lesezeichen-Gliederung; einseitige Dokumente sind ausgenommen), pvuaiStructElementLangInvalid (§7.2, ein Strukturelement-/Lang-Wert, der kein gültiges BCP-47-Tag ist), pvuaiWidgetMissingPrintField (§7.14 / §7.18.4, ein Widget-Strukturelement ohne PrintField-Attributbesitzer), pvuaiLinkNotInStructureTree (§7.18.5, ein Dokument mit /Subtype /Link-Anmerkungen, dessen Strukturbaum kein Link-Element enthält) und die Pdfium-Anmerkungsebene pvuaiPdfiumAnnotationMissingContents / pvuaiPdfiumLinkMissingContents (§7.18.1 / §7.18.5, ein präziser Scan, der versteckte, außerhalb der Crop-Box liegende, Popup- und Widget-Anmerkungen ausnimmt und so die Fehlalarme der Byte-Level-Heuristik beseitigt). v1.95.0 verbessert Treue und Korrektheit: Die §7.21.3.3-Prüfung pvuaiCMapWModeMismatch und die §7.21.7-Prüfung pvuaiToUnicodeForbiddenValue expandieren FlateDecode-komprimierte CMap-/ToUnicode-Streams nun vor dem Scan (zuvor wurden nur unkomprimierte Streams bewertet), und pvuaiSubsetCharSetEmpty (§7.21.4.2) markiert einen Type-1-Subset-FontDescriptor, dessen /CharSet-Stringwert leer ist (die Prüfung auf fehlende Schlüssel erfasste nur einen abwesenden Schlüssel). v1.96.0 ergänzt pvuaiAnnotationFlagsViolation (§7.18.1, eine nicht ausgenommene Anmerkung mit Hidden / Invisible / NoView) und pvuaiActionTargetMissing (§7.18.5, eine GoToR-/URI-/SubmitForm-Aktion ohne ihren Zielschlüssel), beide aus dem PDF/A-Validator übernommen, und behebt einen seitenübergreifenden ParentIndex-Rebasing-Fehler in der Strukturbaum-Zusammenführung sowie einen RoleMap-Parser, der bei Indirekt-Referenz- oder Array-Werten vorzeitig abbrachConformance eine echte PDF/UA-Stufe ist und Issues leer istDie PDF/UA-2-Validierung verlangt zusätzlich eine vierstellige
pdfuaid:rev, effektives PDF 2.0, eine A/W/S-Tabulatorordnung
für Anmerkungen, kein XFA, nicht leere Optional-Content-Konfigurationsnamen,
keine in PDF 2.0 abgekündigten Sound- oder Movie-Anmerkungen sowie
explizit nummerierte H1 bis Hn als
Überschriften-Strukturtypen
Seit v3.73.0 kann die Problemmenge zusätzlich pvuaiNaturalLanguageUncovered enthalten, wenn Nicht-Artifact-Seitentext oder ein Struktur-Title-, Alt-, ActualText- oder Expansion-String keine gültige effektive /Lang-Deklaration hat
Seit v3.74.0 kann die Problemmenge zusätzlich pvuaiArtifactInStructureTree enthalten, wenn ein Artifact-Seitenobjekt eine MCID trägt, die vom Seitenstrukturbaum beansprucht wird, einschließlich pfadbasierter Paginierungs-Artefakte
Seit v3.75.0 stammen die Unicode-Zuordnungsprobleme aus einem einzigen objektbezogenen InspectPdfUaUnicodeCoverage-Durchlauf; gültiges ActualText deckt nur Zeichen aus seinem ursprünglichen Textobjekt ab, während Artifact- und PDFium-generierte Zeichen von der semantischen Abdeckung ausgeschlossen sind
ValidatePdfUa ist eine rein lesende Prüfung — sie verändert das
Dokument nicht und kann gefahrlos wiederholt aufgerufen werden. Setzen
Sie sie ein, bevor ein PDF an ein Archivsystem oder einen
Barrierefreiheits-Prüfer übergeben wird, um dem Bediener
Konformitätsverstöße offenzulegen. Für die häufige Prüfung
„Ist das PDF/UA-1?“, die keine Problemliste benötigt,
ziehen Sie die schlankere Eigenschaft PdfUaConformance vor
Conformance = pucUnknown und einer leeren Issues-MengepvuaiSuspectsTrue nur, wenn ein explizites /Suspects true in /MarkInfo steht. Dokumenten, denen der /Suspects-Schlüssel vollständig fehlt, wird in diesem Punkt Konformität bescheinigt (die Spezifikation verbietet nur true)N 0 R) bereitstellt; vorhandene Schlüssel bleiben erhalten und das Dictionary wird im neu geschriebenen Catalog zu einem direkten Dictionary normalisiert
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;