function ValidatePdfUa: TPdfUaValidationResult;
ValidatePdfUa rileva PDF/UA-1 e PDF/UA-2 da XMP e applica le regole del profilo selezionato
pdfuaid:part = 1 e la descrizione pdfaExtension:schemas corrispondente (§5).dc:title all'interno del pacchetto XMP (§7.1).StructTreeRoot nel catalogo o altrove nel file (§7.1) — necessario affinché il documento possa portare il tagging./MarkInfo << /Marked true /Suspects false >> (§7.1)./ViewerPreferences << /DisplayDocTitle true >> (§7.1)./Lang con un tag di lingua BCP 47 (§7.2)./ID nel trailer e assenza di crittografia.xmp:CreateDate / xmp:ModifyDate (consigliati per la parità Info/XMP).Il risultato è un record TPdfUaValidationResult:
puc1, puc2, pucNone o pucUnknownTPdfUaValidationIssues contenente zero o più valori: pvuaiMissingXmpMetadata, pvuaiMissingPdfUaIdentifier, pvuaiMissingExtensionSchema, pvuaiMissingDcTitle, pvuaiMissingStructTreeRoot, pvuaiMissingMarkInfo, pvuaiSuspectsTrue, pvuaiMissingDisplayDocTitle, pvuaiMissingLang, pvuaiEncryptionPresent, pvuaiMissingTrailerId, pvuaiMissingXmpDates, pvuaiFontNotEmbedded, pvuaiFontMissingToUnicode, pvuaiMissingTabsOrder, pvuaiFigureMissingAlt, pvuaiFormulaMissingAlt, pvuaiNoteMissingId. Il round 1 (v1.66.0) aggiunge pvuaiRoleMapMissing (7.1), pvuaiOptionalContentAsKey (7.10), pvuaiXfaPresent (7.15), pvuaiTrapNetAnnotation (7.18.2), pvuaiReferenceXObject (7.20) e pvuaiEncryptionPBitMissing (7.16 — la violazione precisa della crittografia che sostituisce il vecchio flag su qualsiasi crittografia). Il round 2 (v1.67.0) aggiunge pvuaiLinkMissingContents (7.18.5), pvuaiAnnotationMissingContents (7.18.1), pvuaiEmbeddedFileMissingName (7.11), pvuaiMediaClipMissingAlt (7.18.6.2) e pvuaiCidFontMissingCidToGidMap (7.21.3.2). Il round 3 (v1.68.0) aggiunge pvuaiUriActionIsMap (7.18.5) e pvuaiHeadingSequenceViolation (7.4.2 — la prima regola a livello di structure tree; ValidatePdfUaStructureElements verifica ora la sequenza delle intestazioni numerate). Il round 4 (v1.69.0) aggiunge pvuaiWidgetOutsideForm (7.18.4 — annidamento dei Widget nel structure tree) e pvuaiSubsetMissingCharSet (7.21.4.2). Il round 5 (v1.70.0) aggiunge pvuaiSubsetMissingCidSet (7.21.4.2), pvuaiToUnicodeForbiddenValue (7.21.7), pvuaiLangInvalidFormat (7.2) e pvuaiOrderedListMissingListNumbering (7.6 — sollevato dalla v1.71.0 quando un elemento L dichiara un valore ListNumbering fuori dall'insieme della Table 347; un attributo assente non viene segnalato). Il round 7 (v1.80.0) aggiunge i controlli §7.5 sulle tabelle pvuaiTableStructureInvalid (TH/TD fuori da un TR, o TR/THead/TBody/TFoot fuori dal loro contenitore richiesto), pvuaiTableHeaderMissingScope (un TH privo sia di attributo Scope sia di ID in una tabella in cui nessuna cella usa un'associazione Headers) e pvuaiTableHeadersUndefinedId (le celle referenziano intestazioni tramite array Headers mentre nessun elemento di struttura del documento definisce un ID; una singola voce pendente accanto ad altre risolvibili è tollerata, in accordo con il validatore autorevole). v1.81.0 aggiunge il controllo §7.6 sull'annidamento degli elenchi pvuaiListStructureInvalid (un LI fuori da un contenitore L, o un Lbl/LBody fuori da un elemento LI; gli elenchi annidati e Lbl dentro Note/BibEntry sono accettati). v1.82.0 aggiunge i controlli §7.1 sulla risoluzione del RoleMap pvuaiRoleMapRemapsStandard (una voce RoleMap ridefinisce un tipo di struttura standard) e pvuaiRoleMapUnresolved (un tipo di struttura non standard usato non ha voce nel RoleMap, oppure la sua catena è pendente o ciclica; le catene indirette che raggiungono un tipo standard sono accettate e le voci RoleMap inutilizzate non vengono mai giudicate). v1.83.0 aggiunge i controlli §7.4.4 sul modello delle intestazioni pvuaiHeadingModelMixed (il tag generico H mescolato con intestazioni numerate H1..Hn) e pvuaiHeadingMultipleInNode (un nodo di struttura che porta più di una intestazione figlia H). v1.84.0 aggiunge il controllo §7.1 sul contenuto non taggato pvuaiUntaggedContent (un oggetto testo o immagine renderizzato né rivendicato dal structure tree della pagina tramite il suo marked-content ID né contrassegnato come Artifact; i path objects nudi sono esclusi dal controllo per evitare di segnalare le decorazioni onnipresenti). v1.85.0 aggiunge il controllo §7.15 sull'XFA dinamica pvuaiXfaDynamic (la configurazione XFA imposta dynamicRender a required) e ritira il candidato any-XFA pvuaiXfaPresent (l'XFA statica è conforme; il valore dell'enum resta ma non viene più sollevato). Dalla v1.85.1 il controllo §7.18.3 pvuaiMissingTabsOrder viene eseguito per pagina: ogni pagina annotata richiede /Tabs /S nel proprio dizionario. v1.86.0 aggiunge i controlli §7.21.6 sulla codifica TrueType pvuaiTrueTypeEncodingInvalid (un TrueType non simbolico è privo di Encoding, oppure non è né MacRomanEncoding né WinAnsiEncoding direttamente o tramite BaseEncoding) e pvuaiSymbolicTrueTypeEncoding (un TrueType simbolico porta un nome Encoding non standard; i nomi standard sono tollerati perché i documenti conformi etichettano di routine come simbolici i font con codifica standard). v1.87.0 aggiunge i controlli §7.21.3 sui font compositi pvuaiCidSystemInfoMismatch (il CMap incorporato e il CIDFont discendente non concordano su Registry/Ordering, oppure il Supplement del CIDFont supera quello del CMap), pvuaiCMapNotEmbedded (un CMap referenziato per nome non è un CMap predefinito della Table 118) e pvuaiCMapWModeMismatch (il WMode del dizionario di un CMap incorporato differisce dal contenuto del suo stream; solo gli stream CMap leggibili a byte e non compressi possono essere giudicati), ed estende pvuaiCidFontMissingCidToGidMap per segnalare anche un nome CIDToGIDMap diverso da Identity. v1.93.0 aggiunge il livello object-model di Pdfium — tre problemi precisi per font / per carattere calcolati dall'albero degli oggetti Pdfium attivo: pvuaiPdfiumFontNotEmbedded (§7.21.4, un font effettivamente usato da una pagina non è incorporato secondo FPDFFont_GetIsEmbedded), pvuaiPdfiumUnicodeMapError (§7.21.7, un carattere di pagina ha una mappatura Unicode non valida secondo FPDFText_HasUnicodeMapError) e pvuaiPdfiumNotDefGlyph (§7.21.8, un carattere viene renderizzato come Unicode 0 / .notdef). Questi si affiancano alle euristiche a livello di byte pvuaiFontNotEmbedded / pvuaiFontMissingToUnicode (che scattano solo su un segnale a livello di documento di zero font incorporati o assenza di /ToUnicode); il percorso si interrompe in corto circuito su tre livelli (ciclo sulle pagine, ciclo per oggetto, scansione dei caratteri). v1.94.0 aggiunge sei problemi di seconda passata derivanti da un ri-audit clausola per clausola: pvuaiHeadingFormatInvalid (§7.4.3, un tag di intestazione che inizia con H che non è né la H generica né H + cifre arabe pure — separatori, spazi e numeri romani sono vietati), pvuaiMissingDocumentOutline (§7.17, un documento multipagina privo di outline di bookmark; i documenti di una sola pagina sono esenti), pvuaiStructElementLangInvalid (§7.2, un valore /Lang di un elemento di struttura che non è un tag BCP 47 valido), pvuaiWidgetMissingPrintField (§7.14 / §7.18.4, un elemento di struttura Widget privo del proprietario di attributo PrintField), pvuaiLinkNotInStructureTree (§7.18.5, un documento con annotazioni /Subtype /Link il cui structure tree non espone alcun elemento Link) e il livello annotazioni di Pdfium pvuaiPdfiumAnnotationMissingContents / pvuaiPdfiumLinkMissingContents (§7.18.1 / §7.18.5, una scansione precisa che esenta le annotazioni nascoste, fuori dal crop box, Popup e Widget, eliminando i falsi positivi dell'euristica a livello di byte). v1.95.0 migliora richiamo e correttezza: i controlli §7.21.3.3 pvuaiCMapWModeMismatch e §7.21.7 pvuaiToUnicodeForbiddenValue ora decomprimono gli stream CMap / ToUnicode compressi con FlateDecode prima della scansione (in precedenza venivano giudicati solo gli stream non compressi), e pvuaiSubsetCharSetEmpty (§7.21.4.2) segnala un FontDescriptor di sottinsieme Type 1 il cui valore stringa /CharSet è vuoto (il controllo sulla chiave mancante intercettava solo una chiave assente). v1.96.0 aggiunge pvuaiAnnotationFlagsViolation (§7.18.1, un'annotazione non esente che porta Hidden / Invisible / NoView) e pvuaiActionTargetMissing (§7.18.5, un'azione GoToR / URI / SubmitForm priva della sua chiave di destinazione), entrambi portati dal validatore PDF/A, e corregge un bug di ribasamento cross-page di ParentIndex nella fusione del structure tree più un parser RoleMap che terminava prematuramente su valori indirect-reference o arrayConformance è un livello PDF/UA reale e Issues è vuotoLa validazione PDF/UA-2 richiede inoltre un
pdfuaid:rev a quattro cifre, PDF 2.0 effettivo, l'ordinamento
delle tab delle annotazioni A/W/S, nessuna XFA, nomi di configurazione
optional content non vuoti, nessuna annotazione Sound o Movie
deprecata in PDF 2.0 e tipi di struttura delle intestazioni
H1 fino a Hn esplicitamente numerati
Dalla v3.73.0 l'insieme dei problemi può anche contenere pvuaiNaturalLanguageUncovered quando il testo di pagina non Artifact o una stringa Title, Alt, ActualText o Expansion di struttura è priva di una dichiarazione /Lang effettiva valida
Dalla v3.74.0 l'insieme dei problemi può anche contenere pvuaiArtifactInStructureTree quando un oggetto di pagina Artifact porta un MCID rivendicato dal structure tree della pagina, inclusi gli artifact di paginazione basati su path
Dalla v3.75.0 i problemi di mappatura Unicode provengono da un unico passaggio con ambito oggetto InspectPdfUaUnicodeCoverage; un ActualText valido copre solo i caratteri provenienti dal suo oggetto testo di origine, mentre i caratteri Artifact e generati da PDFium sono esclusi dalla copertura semantica
ValidatePdfUa è un'ispezione in sola lettura — non modifica
il documento e può essere chiamato ripetutamente in sicurezza. Usarlo prima di consegnare un
PDF a un sistema di archiviazione o a un verificatore di accessibilità per evidenziare
al gestore la non conformità. Per il comune controllo "è un PDF/UA-1?"
che non richiede l'elenco dei problemi, preferire la proprietà più leggera
PdfUaConformance.
Conformance = pucUnknown e un insieme Issues vuoto.pvuaiSuspectsTrue solo quando un /Suspects true esplicito compare in /MarkInfo. I documenti privi completamente della chiave /Suspects sono considerati conformi su questo punto (la specifica vieta solo true).N 0 R); le chiavi esistenti sono preservate e il dizionario viene normalizzato a un dizionario diretto nel catalogo riscritto.
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;