function ValidatePdfUa: TPdfUaValidationResult;
ValidatePdfUa detecta PDF/UA-1 y PDF/UA-2 a partir de XMP y aplica las reglas del perfil seleccionado
pdfuaid:part = 1 y la descripción pdfaExtension:schemas correspondiente (§5)dc:title dentro del paquete XMP (§7.1)StructTreeRoot en el catálogo o en algún lugar del archivo (§7.1) — necesario para que el documento pueda contener etiquetado en absoluto/MarkInfo << /Marked true /Suspects false >> (§7.1)/ViewerPreferences << /DisplayDocTitle true >> (§7.1)/Lang con una etiqueta de idioma BCP 47 (§7.2)/ID en el trailer y ausencia de cifradoxmp:CreateDate / xmp:ModifyDate (recomendados para la paridad Info/XMP)El resultado es un registro TPdfUaValidationResult:
puc1, puc2, pucNone o pucUnknownTPdfUaValidationIssues que contiene cero o más valores: pvuaiMissingXmpMetadata, pvuaiMissingPdfUaIdentifier, pvuaiMissingExtensionSchema, pvuaiMissingDcTitle, pvuaiMissingStructTreeRoot, pvuaiMissingMarkInfo, pvuaiSuspectsTrue, pvuaiMissingDisplayDocTitle, pvuaiMissingLang, pvuaiEncryptionPresent, pvuaiMissingTrailerId, pvuaiMissingXmpDates, pvuaiFontNotEmbedded, pvuaiFontMissingToUnicode, pvuaiMissingTabsOrder, pvuaiFigureMissingAlt, pvuaiFormulaMissingAlt, pvuaiNoteMissingId. La ronda 1 (v1.66.0) añade pvuaiRoleMapMissing (7.1), pvuaiOptionalContentAsKey (7.10), pvuaiXfaPresent (7.15), pvuaiTrapNetAnnotation (7.18.2), pvuaiReferenceXObject (7.20) y pvuaiEncryptionPBitMissing (7.16 — la violación de cifrado precisa que sustituye al antiguo indicador de cualquier cifrado). La ronda 2 (v1.67.0) añade pvuaiLinkMissingContents (7.18.5), pvuaiAnnotationMissingContents (7.18.1), pvuaiEmbeddedFileMissingName (7.11), pvuaiMediaClipMissingAlt (7.18.6.2) y pvuaiCidFontMissingCidToGidMap (7.21.3.2). La ronda 3 (v1.68.0) añade pvuaiUriActionIsMap (7.18.5) y pvuaiHeadingSequenceViolation (7.4.2 — la primera regla a nivel de árbol de estructura; ValidatePdfUaStructureElements ahora verifica la secuencia de encabezados numerados). La ronda 4 (v1.69.0) añade pvuaiWidgetOutsideForm (7.18.4 — anidamiento de Widget en el árbol de estructura) y pvuaiSubsetMissingCharSet (7.21.4.2). La ronda 5 (v1.70.0) añade pvuaiSubsetMissingCidSet (7.21.4.2), pvuaiToUnicodeForbiddenValue (7.21.7), pvuaiLangInvalidFormat (7.2) y pvuaiOrderedListMissingListNumbering (7.6 — generada desde v1.71.0 cuando un elemento L declara un valor ListNumbering fuera del conjunto de la Table 347; un atributo ausente no se señala). La ronda 7 (v1.80.0) añade las comprobaciones de tablas de §7.5 pvuaiTableStructureInvalid (TH/TD fuera de un TR, o TR/THead/TBody/TFoot fuera de su contenedor requerido), pvuaiTableHeaderMissingScope (un TH que no lleva ni un atributo Scope ni un ID, en una tabla donde ninguna celda usa una asociación Headers) y pvuaiTableHeadersUndefinedId (las celdas referencian encabezados mediante matrices Headers mientras ningún elemento de estructura del documento define un ID; se tolera una entrada colgante individual junto a otras resolubles, igual que el validador de referencia). v1.81.0 añade la comprobación de anidamiento de listas de §7.6 pvuaiListStructureInvalid (un LI fuera de un contenedor L, o un Lbl/LBody fuera de un elemento LI; las listas anidadas y los Lbl dentro de Note/BibEntry se aceptan). v1.82.0 añade las comprobaciones de resolución de RoleMap de §7.1 pvuaiRoleMapRemapsStandard (una entrada RoleMap redefine un tipo de estructura estándar) y pvuaiRoleMapUnresolved (un tipo de estructura no estándar usado no tiene entrada RoleMap, o su cadena es colgante o cíclica; las cadenas indirectas que alcanzan un tipo estándar se aceptan y las entradas RoleMap no usadas nunca se juzgan). v1.83.0 añade las comprobaciones del modelo de encabezados de §7.4.4 pvuaiHeadingModelMixed (la etiqueta genérica H mezclada con encabezados numerados H1..Hn) y pvuaiHeadingMultipleInNode (un nodo de estructura con más de un encabezado hijo H). v1.84.0 añade la comprobación de contenido sin etiquetar de §7.1 pvuaiUntaggedContent (un objeto de texto o imagen renderizado que ni el árbol de estructura de la página reclama mediante su ID de contenido marcado ni está marcado como Artifact; los objetos de trazado simples quedan fuera de la comprobación para evitar señalar la decoración ubicua). v1.85.0 añade la comprobación de XFA dinámico de §7.15 pvuaiXfaDynamic (la configuración XFA establece dynamicRender en required) y retira al candidato de cualquier XFA pvuaiXfaPresent (el XFA estático es conforme; el valor del enum permanece pero ya no se genera). Desde v1.85.1 la comprobación pvuaiMissingTabsOrder de §7.18.3 se ejecuta por página: cada página anotada necesita /Tabs /S en su propio diccionario. v1.86.0 añade las comprobaciones de codificación TrueType de §7.21.6 pvuaiTrueTypeEncodingInvalid (un TrueType no simbólico carece de Encoding, o este no es ni MacRomanEncoding ni WinAnsiEncoding directamente ni vía BaseEncoding) y pvuaiSymbolicTrueTypeEncoding (un TrueType simbólico lleva un nombre de Encoding no estándar; los nombres estándar se toleran porque los documentos conformes habitualmente etiquetan erróneamente como simbólicas fuentes con codificación estándar). v1.87.0 añade las comprobaciones de fuentes compuestas de §7.21.3 pvuaiCidSystemInfoMismatch (el CMap incrustado y el CIDFont descendente discrepan en Registry/Ordering, o el Supplement del CIDFont excede el del CMap), pvuaiCMapNotEmbedded (un CMap referenciado por nombre no es un CMap predefinido de la Table 118) y pvuaiCMapWModeMismatch (el WMode del diccionario de un CMap incrustado difiere de su contenido de flujo; solo se pueden juzgar flujos CMap legibles por bytes y sin comprimir), y amplía pvuaiCidFontMissingCidToGidMap para señalar también un nombre de CIDToGIDMap distinto de Identity. v1.93.0 añade la capa del modelo de objetos de Pdfium — tres problemas precisos por fuente / por carácter calculados desde el árbol de objetos vivo de Pdfium: pvuaiPdfiumFontNotEmbedded (§7.21.4, una fuente que una página realmente usa no está incrustada según FPDFFont_GetIsEmbedded), pvuaiPdfiumUnicodeMapError (§7.21.7, un carácter de página tiene un mapeo Unicode inválido según FPDFText_HasUnicodeMapError) y pvuaiPdfiumNotDefGlyph (§7.21.8, un carácter se renderiza a Unicode 0 / .notdef). Estos complementan las heurísticas a nivel de bytes pvuaiFontNotEmbedded / pvuaiFontMissingToUnicode (que solo se activan ante una señal de cero fuentes incrustadas o de ausencia de /ToUnicode en todo el documento); el recorrido corta en cortocircuito a tres niveles (bucle de páginas, bucle por objeto, barrido de caracteres). v1.94.0 añade seis problemas de una segunda pasada procedente de una reauditoría cláusula por cláusula: pvuaiHeadingFormatInvalid (§7.4.3, una etiqueta de encabezado que empieza por H que no es ni la H genérica ni H + dígitos arábigos puros — los separadores, espacios y números romanos están prohibidos), pvuaiMissingDocumentOutline (§7.17, un documento multipágina sin esquema de marcadores; los documentos de una sola página están exentos), pvuaiStructElementLangInvalid (§7.2, un valor /Lang de un elemento de estructura que no es una etiqueta BCP 47 válida), pvuaiWidgetMissingPrintField (§7.14 / §7.18.4, un elemento de estructura Widget que carece del propietario de atributo PrintField), pvuaiLinkNotInStructureTree (§7.18.5, un documento con anotaciones /Subtype /Link cuyo árbol de estructura no expone ningún elemento Link) y la capa de anotaciones de Pdfium pvuaiPdfiumAnnotationMissingContents / pvuaiPdfiumLinkMissingContents (§7.18.1 / §7.18.5, un barrido preciso que exime a las anotaciones ocultas, fuera del crop box, Popup y Widget, eliminando los falsos positivos de la heurística a nivel de bytes). v1.95.0 mejora la exhaustividad y la solidez: las comprobaciones §7.21.3.3 pvuaiCMapWModeMismatch y §7.21.7 pvuaiToUnicodeForbiddenValue ahora descomprimen los flujos CMap / ToUnicode comprimidos con FlateDecode antes del barrido (antes solo se juzgaban los flujos sin comprimir), y pvuaiSubsetCharSetEmpty (§7.21.4.2) señala un FontDescriptor de subconjunto Type 1 cuyo valor de cadena /CharSet está vacío (la comprobación de clave ausente solo detectaba una clave inexistente). v1.96.0 añade pvuaiAnnotationFlagsViolation (§7.18.1, una anotación no exenta que lleva Hidden / Invisible / NoView) y pvuaiActionTargetMissing (§7.18.5, una acción GoToR / URI / SubmitForm sin su clave de destino), ambos portados desde el validador de PDF/A, y corrige un error de rebase de ParentIndex entre páginas en la fusión del árbol de estructura además de un analizador RoleMap que terminaba prematuramente ante valores de referencia indirecta o de matrizConformance es un nivel real de PDF/UA y Issues está vacíoLa validación de PDF/UA-2 exige además un pdfuaid:rev de cuatro
dígitos, PDF 2.0 efectivo, ordenación de pestañas de anotaciones A/W/S, ausencia
de XFA, nombres de configuración de contenido opcional no vacíos, ausencia de
anotaciones Sound o Movie en desuso por PDF 2.0, y tipos de estructura de
encabezados H1 a Hn numerados explícitamente
Desde v3.73.0 el conjunto de problemas también puede contener pvuaiNaturalLanguageUncovered cuando el texto de página no Artifact o una cadena de estructura Title, Alt, ActualText o Expansion carece de una declaración /Lang efectiva válida
Desde v3.74.0 el conjunto de problemas también puede contener pvuaiArtifactInStructureTree cuando un objeto de página Artifact lleva un MCID reclamado por el árbol de estructura de la página, incluidos los artefactos de paginación basados en trazados
Desde v3.75.0 los problemas de mapeo Unicode provienen de una única pasada InspectPdfUaUnicodeCoverage con ámbito de objeto; un ActualText válido cubre solo los caracteres de su objeto de texto de origen, mientras que los caracteres Artifact y generados por PDFium quedan excluidos de la cobertura semántica
ValidatePdfUa es una inspección de solo lectura — no modifica
el documento y es seguro llamarla repetidamente. Úsela antes de entregar un
PDF a un sistema de archivo o a un verificador de accesibilidad para hacer visibles
las no conformidades al operador. Para la comprobación común de "¿es este PDF/UA-1?"
que no necesita la lista de problemas, prefiera la propiedad más ligera
PdfUaConformance
Conformance = pucUnknown y un conjunto Issues vacíopvuaiSuspectsTrue cuando aparece un /Suspects true explícito en /MarkInfo. Los documentos que carecen por completo de la clave /Suspects se consideran conformes en ese punto (la especificación solo prohíbe true)N 0 R); las claves existentes se conservan y el diccionario se normaliza a un diccionario directo en el catálogo reescrito
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;