function ValidatePdfA: TPdfAValidationResult;
ValidatePdfA durchläuft das geöffnete Dokument und sucht nach jedem in ISO 19005-1 (mit Cor.1:2007) definierten PDF/A-Konformitätsmarker:
pdfaid:part- und pdfaid:conformance-Einträgen, der dem Validator mitteilt, gegen welche PDF/A-Stufe das Dokument erstellt wurde (1a, 1b, 2b, 3b, ...)/ID-Array (gemäß ISO 19005-1 6.1.3 verpflichtend)xmp:CreateDate und xmp:ModifyDate im XMP-Paket (erforderlich, wenn das Info-Dictionary CreationDate-/ModDate-Werte enthält, gemäß 6.7.3 Beispiel 2)pdfaExtension:schemas-Container, der das pdfaid-Erweiterungsschema beschreibt (gefordert von 6.7.8 / Cor.1)Das Ergebnis ist ein TPdfAValidationResult-Record:
pac1a, pac1b, pac2a, pac2b, pac2u, pac3a, pac3b, pac3u, pacNone oder pacUnknown für einen PDF/A-Marker ohne erkannte Stufe)TPdfAValidationIssues-Menge von TPdfAValidationIssue-Werten, die jedes gefundene Problem beschreibt. Die strukturellen Marker sind pvaiMissingXmpMetadata, pvaiMissingPdfAIdentifier, pvaiMissingOutputIntent, pvaiMissingIccProfile, pvaiEncryptionPresent, pvaiMissingTrailerId, pvaiMissingXmpDates und pvaiMissingExtensionSchema. Sie meldet auch Verstöße auf Inhaltsebene, die eine Marker-Injektion nicht beheben kann: pvaiLevelAStructureMissing (Level-A-Angabe ohne getaggte Struktur), pvaiJavaScriptPresent, pvaiForbiddenAction, pvaiAdditionalActions, pvaiEmbeddedFilesNonConforming, pvaiLzwUsed, pvaiTransparencyForbidden, pvaiOptionalContentForbidden, pvaiForbiddenAnnotation, pvaiNeedAppearancesTrue, pvaiXfaPresent, pvaiFontNotEmbedded und pvaiUnicodeMappingMissing (eine PDF/A-2u- oder PDF/A-3u-Angabe, deren Schriftarten kein /ToUnicode besitzen). Strengere ISO-19005-Prüfungen ergänzen pvaiTrappedTrue, pvaiForbiddenActionSubtype, pvaiTransparentColorSpace, pvaiAnnotationDictViolation, pvaiUnembeddedFont, pvaiMixedDeviceColorSpaces, pvaiUndefinedContentOperator, pvaiForbiddenRenderingIntent, pvaiExtGStateTransferFunction, pvaiImageDictionaryViolation, pvaiFormXObjectViolation, pvaiPostScriptOrRefXObject, pvaiAnnotationFlagsViolation, pvaiDeprecatedAction, pvaiMetadataFilterForbidden, pvaiStructElemTypeMissing und pvaiRoleMapMissing. Runde 4 ergänzt 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 Anhang E.2) und pvaiJpeg2000Violation (PDF/A-2 6.2.8.3). Runde 5 ergänzt pvaiCidFontMissingCidToGidMap (6.3.3.2), pvaiSubsetMissingCharSet (6.3.5), pvaiSubsetMissingCidSet (6.3.5), pvaiWidgetActionForbidden (6.6.1) und pvaiOptionalContentAsKey (PDF/A-2 6.9). Runde 6 ergänzt pvaiNeedsRenderingPresent (PDF/A-2 6.4.2), pvaiDestOutputProfileRef (PDF/A-3 6.2.3), pvaiEmbeddedFileMissingUF (PDF/A-3 6.8), pvaiXmpPacketBytesAttr (6.7.5) und pvaiAnnotationToggleNoView (PDF/A-2 6.3.2). Runde 7 (v1.73.0) ergänzt die Pdfium-Objektmodellebene: pvaiPdfiumFontNotEmbedded (6.3.4, je Schriftart FPDFFont_GetIsEmbedded) und pvaiPdfiumUnicodeMapError (6.3.8, je Zeichen FPDFText_HasUnicodeMapError); diese werden von TPdf.ValidatePdfA gesetzt, nicht vom eigenständigen Byte-Level-Check ValidatePdfACompliance. Runde 8 (v1.74.0) ergänzt pvaiPermissionsViolation (6.1.12), pvaiTransActionForbidden (PDF/A-2 6.5.1) und pvaiPdfiumObjectTransparency (PDF/A-1 6.4 über FPDFPageObj_HasTransparency). Runde 9 (v1.75.0) ergänzt pvaiIntegerImplementationLimit (PDF/A-2 6.1.13), pvaiBlendModeNotWhitelisted (PDF/A-2 6.2.10) und pvaiHexStringOddDigits (6.1.6). Runde 10 (v1.76.0) ergänzt pvaiNameNotValidUtf8 (PDF/A-2 6.1.8), pvaiInlineImageLzwForbidden (PDF/A-2 6.1.10) und pvaiTrueTypeDifferencesForbidden (6.3.7). Runde 11 (v1.77.0) ergänzt pvaiPdfiumNotDefGlyph (PDF/A-2 6.2.11.8, Pdfium-Objektmodell), pvaiWordBreakMissing (Level A 6.8.3.2) und pvaiLinkActionMissingTarget (6.6.3)pvaiMissingXmpMetadata bedeutet, dass der Catalog-/Metadata-Schlüssel fehlt, unlesbar ist oder nicht zu einem Stream-Dictionary mit /Type /Metadata und /Subtype /XML auflöstpvaiPdfA1Pdf15Structure meldet PDF/A-1-Dokumente, die PDF-1.5-XRef-Streams oder Object-Streams enthalten; diese Strukturen bleiben für PDF/A-2 und PDF/A-3 gültigpvaiInlineImageLzwForbidden gilt für Inline-Bildfilter in jedem PDF/A-Teil: PDF/A-1 lehnt /LZWDecode ab, und PDF/A-2 / PDF/A-3 lehnen zusätzlich die Inline-Bildfilterwerte /LZW, /LZWDecode und /Crypt abpvaiImageDictionaryViolation deckt zusätzlich zu den Dictionary-Verstößen /Alternates, /OPI und /Interpolate true bei Image-XObjects auch PDF/A-2- und PDF/A-3-Inline-Bilder ab, deren /I- oder /Interpolate-Wert true istpvaiAnnotationApDictViolation erfasst sowohl fehlerhafte Appearance-Dictionarys von Anmerkungen, deren /AP-Eintrag andere Schlüssel als /N enthält, als auch Anmerkungen, die ein Appearance-Dictionary benötigen, aber keines besitzenpvaiInfoXmpValueMismatch meldet mindestens einen vorhandenen Info-Wert, dessen zugeordnete XMP-Eigenschaft fehlt, die falsche RDF-Containerform hat, als Unicode-Text abweicht, ein ungültiges Datum enthält oder einen anderen UTC-Zeitpunkt darstelltConformance eine echte PDF/A-Stufe ist und Issues leer istValidatePdfA 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 übergeben wird, um dem
Bediener Konformitätsverstöße offenzulegen. Für die häufige Prüfung
„Welche Stufe hat dieses Dokument?“, die keine Problemliste
benötigt, ziehen Sie die schlankere Eigenschaft
PdfAConformance vor
Conformance = pacNone und einem leeren Issues-Array
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;