function ValidatePdfVT: TPdfVTValidationResult;
ValidatePdfVT durchläuft das geöffnete Dokument und sucht nach den auf Dateiformat-Ebene definierten Markern gemäß ISO 16612-2:2010:
pdfvtid:GTS_PDFVTVersion (§6.3 Table 2) und pdfvtid:GTS_PDFVTModDatepdfvtid:GTS_PDFVTModDate und xmp:ModifyDate (§6.3 NOTE 1)pdfxid:GTS_PDFXVersion — PDF/VT-1 muss PDF/X-4 sein (§6.2.1), während PDF/VT-2 eine der Dateisatz-Basen PDF/X-4p, PDF/X-5g oder PDF/X-5pg verwenden muss (§6.2.2)pdfaExtension:schemas-Beschreibung für beide Namespaces pdfvtid und pdfxid/DPartRoot mit einem brauchbaren §6.5-DPart-Baum: Der /DPartRootNode, die zu XML-NMTOKEN kompatible /NodeNameList, Elternverknüpfungen, das /DParts-Array-von-Arrays, die Blattbereiche /Start//End und die seitenweisen /DPart-Referenzen müssen den Seitenbaum genau einmal in Tiefensuche abdeckenGTS_XID, GTS_Scope und GTS_Env, das indirekte DPartRoot-RecordLevel für den Record-Scope und die nur für PDF/VT-2s geltende Grenze für den Stream-ScopeFlateDecode Seite- bzw. Form-XObject-Streams, wobei jeder Do-Operand über die effektiv vererbten Ressourcen aufgelöst wird, um SingleUse-Zähler, Ressourcensichtbarkeit und Einzel-Empfänger-Eigentum für den Record-Scope durchzusetzenIntent, die erforderliche isolierte Transparenz-Group mit einem Blending-Farbraum und Optional-Content-Marked-Operatoren in direktem oder verschachteltem Form-Inhalt/OutputIntents mit einem OutputIntent, der ein eingebettetes /DestOutputProfile oder eine zur PDF/X-Base passende externe /DestOutputProfileRef besitzt/ID-Array und die Abwesenheit von /Encrypt (PDF/X untersagt Verschlüsselung)xmp:CreateDate- und xmp:ModifyDate-Einträge in XMP für Info-/XMP-ParitätDas Ergebnis ist ein TPdfVTValidationResult-Record:
pvc1 (PDF/VT-1-Marker), pvc2 (PDF/VT-2-Marker), pvcNone (kein PDF/VT-Marker) oder pvcUnknown (Marker vorhanden, aber Datei-Level-Version nicht erkannt)TPdfVTValidationIssues-Menge ohne oder mit mehreren Marker-, DPart-, PDF/X-Vererbungs-, wiederkehrende-Objekte- und Kapselungs-Issue-WertenpvviGtsScopeInvalidValue, pvviGtsScopeRecordWithoutRecordLevel, pvviGtsXidNotUuid, pvviGtsEnvMissing, pvviGtsXidInvalidType, pvviGtsEnvInvalidType, pvviGtsScopeStreamInVT1, pvviGtsScopeSingleUseRepeated, pvviGtsScopeRecordCrossesRecords und pvviGtsResourceNotVisiblepvviGtsEncapsulatedInvalidType, pvviGtsEncapsulatedMissingScope, pvviGtsEncapsulatedImageMissingIntent, pvviGtsEncapsulatedGroupInvalid und pvviGtsEncapsulatedOptionalContentConformance eine echte PDF/VT-Stufe ist und Issues leer istValidatePdfVT ist rein lesend. Es prüft die Dateiformat-Marker,
die ausgewählte DPart-Baum-Semantik, Scope und Kapselung wiederkehrender
XObjects, die exakte Paarung PDF/VT-zu-PDF/X-Basis und die
XMP-Eigenschaften, gleich ob sie als Elemente oder RDF-Attribute
geschrieben sind. Kombinieren Sie es für eine vollständige Prüfung auf
Inhaltsebene mit einer PDF/X-Preflight-Engine und für PDF/VT-2 mit
InspectPdfVT2sStream oder einem anderen vollständigen Dateisatz-Validator. PDF/VT-2s ist ein
MIME-Stream-Konformitätslevel, dessen Version durch den MIME-Stream-Header
in ISO 16612-2 Annex A signalisiert wird und nicht durch einen
Datei-Level-Wert pdfvtid:GTS_PDFVTVersion
pvviMissingDPartRoot wird ausgegeben, wenn dem Catalog eine brauchbare /DPartRoot-Hierarchie fehlt oder wenn der Baum §6.5-Anforderungen verletzt, etwa durch fehlerhafte /DParts-Arrays, gemischte /Start- und /DParts-Angaben, doppelte Kinder-Zuordnung, ungültige /NodeNameList-Namen oder Tiefenkonflikte, Seitenbereiche, die nicht der Seitenbaum-Reihenfolge folgen, Einseitenbereiche, die /Start als /End wiederholen, oder Seiten-/DPart-Verknüpfungen, die nicht auf das abdeckende Blatt-DPart zeigenFlateDecode-Streams; Content-Streams mit anderen oder verketteten Filtern bleiben dedizierten vollwertigen Preflight-Engines vorbehaltenpvviModDateMismatch wird nur ausgegeben, wenn sowohl pdfvtid:GTS_PDFVTModDate als auch xmp:ModifyDate vorhanden sind und ihre Werte abweichen; SaveAsPdfVT schreibt sie immer mit demselben WertConformance = pvcUnknown und einer leeren Issues-Menge
uses System.TypInfo;
var
Outcome: TPdfVTValidationResult;
Issue: TPdfVTValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\statements.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfVT;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfVTConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfVTValidationIssue), Ord(Issue)));
end;