function ValidatePdfA: TPdfAValidationResult;
ValidatePdfA recorre el documento abierto buscando todos los marcadores de conformidad PDF/A definidos por ISO 19005-1 (con Cor.1:2007):
pdfaid:part y pdfaid:conformance, que indica al validador frente a qué nivel de PDF/A se creó el documento (1a, 1b, 2b, 3b, ...)/ID en el trailer (obligatoria según ISO 19005-1 6.1.3)xmp:CreateDate y xmp:ModifyDate en el paquete XMP (obligatorios cuando el diccionario Info contiene valores CreationDate / ModDate según 6.7.3 Example 2)pdfaExtension:schemas que describe el esquema de extensión pdfaid (requerido por 6.7.8 / Cor.1)El resultado es un registro TPdfAValidationResult:
pac1a, pac1b, pac2a, pac2b, pac2u, pac3a, pac3b, pac3u, pacNone, o pacUnknown para un marcador PDF/A sin un nivel reconocido)TPdfAValidationIssues de valores TPdfAValidationIssue que describe cada problema encontrado. Los marcadores estructurales son pvaiMissingXmpMetadata, pvaiMissingPdfAIdentifier, pvaiMissingOutputIntent, pvaiMissingIccProfile, pvaiEncryptionPresent, pvaiMissingTrailerId, pvaiMissingXmpDates y pvaiMissingExtensionSchema. También informa de violaciones a nivel de contenido que la inyección de marcadores no puede corregir: pvaiLevelAStructureMissing (una declaración de Level A sin estructura etiquetada), pvaiJavaScriptPresent, pvaiForbiddenAction, pvaiAdditionalActions, pvaiEmbeddedFilesNonConforming, pvaiLzwUsed, pvaiTransparencyForbidden, pvaiOptionalContentForbidden, pvaiForbiddenAnnotation, pvaiNeedAppearancesTrue, pvaiXfaPresent, pvaiFontNotEmbedded y pvaiUnicodeMappingMissing (una declaración PDF/A-2u / PDF/A-3u cuyas fuentes carecen de /ToUnicode). Las comprobaciones más estrictas de ISO 19005 añaden pvaiTrappedTrue, pvaiForbiddenActionSubtype, pvaiTransparentColorSpace, pvaiAnnotationDictViolation, pvaiUnembeddedFont, pvaiMixedDeviceColorSpaces, pvaiUndefinedContentOperator, pvaiForbiddenRenderingIntent, pvaiExtGStateTransferFunction, pvaiImageDictionaryViolation, pvaiFormXObjectViolation, pvaiPostScriptOrRefXObject, pvaiAnnotationFlagsViolation, pvaiDeprecatedAction, pvaiMetadataFilterForbidden, pvaiStructElemTypeMissing y pvaiRoleMapMissing. La ronda 4 añade pvaiHeaderBinaryMarkerMissing (6.1.2), pvaiExternalStreamRef (6.1.7), pvaiOutputIntentScheme (6.2.2), pvaiInfoXmpDateMismatch (6.7.3), pvaiMarkInfoMissing (6.8.2.2 Level A), pvaiAnnotationApDictViolation (6.5.3), pvaiEmbeddedFileMissingAFRelationship (PDF/A-3 Annex E.2) y pvaiJpeg2000Violation (PDF/A-2 6.2.8.3). La ronda 5 añade pvaiCidFontMissingCidToGidMap (6.3.3.2), pvaiSubsetMissingCharSet (6.3.5), pvaiSubsetMissingCidSet (6.3.5), pvaiWidgetActionForbidden (6.6.1) y pvaiOptionalContentAsKey (PDF/A-2 6.9). La ronda 6 añade pvaiNeedsRenderingPresent (PDF/A-2 6.4.2), pvaiDestOutputProfileRef (PDF/A-3 6.2.3), pvaiEmbeddedFileMissingUF (PDF/A-3 6.8), pvaiXmpPacketBytesAttr (6.7.5) y pvaiAnnotationToggleNoView (PDF/A-2 6.3.2). La ronda 7 (v1.73.0) añade la capa del modelo de objetos de Pdfium: pvaiPdfiumFontNotEmbedded (6.3.4, por fuente FPDFFont_GetIsEmbedded) y pvaiPdfiumUnicodeMapError (6.3.8, por carácter FPDFText_HasUnicodeMapError); estos los establece TPdf.ValidatePdfA, no la inspección independiente a nivel de bytes ValidatePdfACompliance. La ronda 8 (v1.74.0) añade pvaiPermissionsViolation (6.1.12), pvaiTransActionForbidden (PDF/A-2 6.5.1) y pvaiPdfiumObjectTransparency (PDF/A-1 6.4 vía FPDFPageObj_HasTransparency). La ronda 9 (v1.75.0) añade pvaiIntegerImplementationLimit (PDF/A-2 6.1.13), pvaiBlendModeNotWhitelisted (PDF/A-2 6.2.10) y pvaiHexStringOddDigits (6.1.6). La ronda 10 (v1.76.0) añade pvaiNameNotValidUtf8 (PDF/A-2 6.1.8), pvaiInlineImageLzwForbidden (PDF/A-2 6.1.10) y pvaiTrueTypeDifferencesForbidden (6.3.7). La ronda 11 (v1.77.0) añade pvaiPdfiumNotDefGlyph (PDF/A-2 6.2.11.8, modelo de objetos de Pdfium), pvaiWordBreakMissing (Level A 6.8.3.2) y pvaiLinkActionMissingTarget (6.6.3)pvaiMissingXmpMetadata significa que la clave /Metadata del catálogo está ausente, es ilegible o no resuelve a un diccionario de flujo con /Type /Metadata y /Subtype /XMLpvaiPdfA1Pdf15Structure informa de documentos PDF/A-1 que contienen flujos de referencias cruzadas o flujos de objetos de PDF 1.5; estas estructuras siguen siendo válidas para PDF/A-2 y PDF/A-3pvaiInlineImageLzwForbidden se aplica a los filtros de imágenes en línea en todas las partes de PDF/A: PDF/A-1 rechaza /LZWDecode y PDF/A-2 / PDF/A-3 también rechazan los valores de filtro de imágenes en línea /LZW, /LZWDecode y /CryptpvaiImageDictionaryViolation cubre también las imágenes en línea de PDF/A-2 y PDF/A-3 cuyo valor /I o /Interpolate es true, además de las violaciones de diccionario /Alternates, /OPI y /Interpolate true de Image XObjectpvaiAnnotationApDictViolation cubre tanto los diccionarios de apariencia de anotaciones mal formados cuya entrada /AP contiene claves distintas de /N como las anotaciones que exigen y carecen de un diccionario de aparienciapvaiInfoXmpValueMismatch informa de al menos un valor Info presente cuya propiedad XMP asignada está ausente, tiene una forma de contenedor RDF incorrecta, difiere como texto Unicode, contiene una fecha inválida o representa un instante UTC diferenteConformance es un nivel real de PDF/A y Issues está vacíoValidatePdfA 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 para hacer visibles las no conformidades al
operador. Para la comprobación común de "¿qué nivel es este?" que no
necesita la lista de problemas, prefiera la propiedad más ligera
PdfAConformance
Conformance = pacNone y una matriz Issues vacía
uses System.TypInfo;
var
Outcome: TPdfAValidationResult;
Issue: TPdfAValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\report.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfA;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfAConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfAValidationIssue), Ord(Issue)));
end;