TVt2sChunkKind = (vtckInlinePdf, vtckAttachmentPdf, vtckIccProfile);
TPdfVT2sChunk = record
Kind: TVt2sChunkKind;
Bytes: TBytes;
FileName: AnsiString;
end;
TPdfVT2sChunks = array of TPdfVT2sChunk;
TAnsiStrings = array of AnsiString;
TPdfVT2sValidationResult = record
Issues: TPdfVT2sValidationIssues;
function IsCompliant: Boolean;
end;
TPdfVTPrintingConditionSource = (vtpcsNone, vtpcsEmbeddedProfile, vtpcsMimeProfile);
TPdfVTPrintingConditionEvidence = record
PartIndex: Integer;
Conformance: TPdfVTConformance;
PdfXVersion: AnsiString;
OutputIntentObjectNumber: Integer;
OutputConditionIdentifier: AnsiString;
RegistryName: AnsiString;
Source: TPdfVTPrintingConditionSource;
ProfileFileName: AnsiString;
ProfileName: AnsiString;
ProfileColorSpace: AnsiString;
ProfileByteSize: Int64;
ProfileMd5: string;
ProfileSha256: string;
ProfileVersion: string;
ProfileDeviceClass: string;
ProfilePcs: string;
ProfileComponentCount: Integer;
Resolved: Boolean;
ProfileValid: Boolean;
DPart: TPdfVTDPartEvidence;
end;
TPdfVT2sValidationReport = record
Validation: TPdfVT2sValidationResult;
PrintingConditions: TPdfVTPrintingConditionEvidenceArray;
end;
procedure BuildPdfVT2sStream(const Chunks: TPdfVT2sChunks; Dest: TStream);
function ValidatePdfVT2sStream(Source: TStream): TPdfVT2sValidationResult;
function InspectPdfVT2sStream(Source: TStream): TPdfVT2sValidationReport;
FPdfPdfvtMime implémente le transport PDF/VT-2s défini dans l’annexe d’ISO 16612-2, où un document PDF/VT plus son contenu PDF réutilisable référencé et son profil ICC sont empaquetés en un unique flux MIME multipart
Contrairement au chemin TPdf.SaveAsPdfVT qui écrit un fichier PDF/VT-1 autonome, cette unité opère purement sur des flux d’octets et ne charge jamais pdfium.dll, de sorte qu’elle peut s’exécuter dans des serveurs headless et des pipelines de traitement par lots
BuildPdfVT2sStream assemble les fragments dans l’ordre et émet l’en-tête StreamVersion, les frontières de parties et les en-têtes Content-Type / Content-Disposition par partie ; ValidatePdfVT2sStream analyse un flux existant en retour et signale les écarts structurels, de condition d’impression et ICC comme un ensemble de problèmes typé
InspectPdfVT2sStream renvoie le même résultat de compatibilité plus des preuves pour chaque partie PDF/VT, y compris la conformité PDF/VT, la base PDF/X, l’identité OutputIntent, la provenance du profil, MD5 et SHA-256, les métadonnées ICC brutes et les comptages de pages et d’enregistrements de destinataires DPart
Chaque partie PDF est d’abord classée avec ValidatePdfVTCompliance ; les pièces jointes réutilisables uniquement PDF/X restent des cibles de référence éligibles mais sont exclues de la hiérarchie PDF/VT et des comparaisons de conditions d’impression
L’empaquetage du profil suit la base du fichier : PDF/VT-1 avec PDF/X-4 et PDF/VT-2 avec PDF/X-5g utilisent un DestOutputProfile intégré, tandis que PDF/VT-2 avec PDF/X-4p ou PDF/X-5pg utilise un DestOutputProfileRef résolu vers une partie MIME ICC antérieure
| Value | MIME role |
|---|---|
vtckInlinePdf | Un document PDF/VT transporté comme partie application/pdf en ligne ; au moins un est requis |
vtckAttachmentPdf | Une partie de contenu PDF réutilisable référencée par le document en ligne, transportée comme attachment avec un nom de fichier |
vtckIccProfile | Une partie de profil ICC (application/vnd.iccprofile) fournie comme pièce jointe avec un nom de fichier |
| Type | Purpose |
|---|---|
TPdfVT2sChunks | Tableau dynamique de fragments MIME ordonnés fournis à BuildPdfVT2sStream |
TAnsiStrings | Tableau dynamique de noms de fichiers utilisé lors de la validation des références de fichiers externes dans le PDF en ligne |
TPdfVT2sValidationIssues | Ensemble de constats TPdfVT2sValidationIssue renvoyé par la validation |
TPdfVTPrintingConditionSource | Origine des preuves de profil : vtpcsNone lorsqu’il n’est pas résolu, vtpcsEmbeddedProfile pour un flux DestOutputProfile intégré, vtpcsMimeProfile pour un DestOutputProfileRef résolu depuis une partie MIME ICC |
TPdfVTPrintingConditionEvidence | Classification PDF/VT et PDF/X par partie, OutputIntent, source de profil, identité, empreinte, en-tête ICC et informations DPart |
TPdfVT2sValidationReport | Résultat détaillé renvoyé par InspectPdfVT2sStream sans modifier la disposition du résultat historique |
| Value | Reported when |
|---|---|
vtmviNotMultipart | Le flux n’est pas un conteneur MIME multipart |
vtmviMissingStreamVersion | L’en-tête StreamVersion PDF/VT requis est absent |
vtmviStreamVersionValue | La valeur StreamVersion n’est pas la valeur 1 attendue |
vtmviStreamVersionAfterCt | StreamVersion apparaît après la ligne Content-Type au lieu d’avant |
vtmviMissingBoundary | Le paramètre boundary du Content-Type est manquant |
vtmviNoInlinePdf | Aucune partie PDF/VT en ligne n’est présente |
vtmviInlinePdfNotPdfVT | La partie en ligne n’est pas déclarée comme PDF/VT |
vtmviIccProfileBadDisposition | Une partie de profil ICC n’est pas une pièce jointe |
vtmviAttachmentMissingFilename | Une partie jointe manque du nom de fichier requis |
vtmviInlineHasFilename | La partie PDF en ligne porte un nom de fichier, ce qui n’est pas permis |
vtmviNodeNameListMismatch | Deux fichiers PDF/VT du flux exposent des valeurs NodeNameList différentes |
vtmviRecordLevelMismatch | Les niveaux d’enregistrements DPart sont incohérents dans le conteneur |
vtmviForwardReference | Une pièce jointe est référencée avant d’apparaître dans le flux |
vtmviBoundaryInvalidChar | La chaîne boundary contient des caractères non autorisés par la RFC 2046 |
vtmviDuplicateFilename | Deux pièces jointes MIME exposent le même nom de fichier sensible à la casse |
vtmviOutputIntentAmbiguous | Une partie PDF a zéro ou plusieurs OutputIntents GTS_PDFX faisant autorité |
vtmviOutputProfilePackagingMismatch | L’OutputIntent a les deux formes de profil, aucune forme, ou une forme incompatible avec la base PDF/X-4, PDF/X-4p, PDF/X-5g ou PDF/X-5pg |
vtmviOutputProfileReferenceInvalid | Un DestOutputProfileRef omet des métadonnées requises, une spécification de fichier URL, ou utilise un ColorantTable interdit |
vtmviReferencedPartWrongType | Le nom de fichier référencé se résout en une partie MIME qui n’est pas un profil ICC |
vtmviIccProfileInvalid | L’en-tête ICC, la taille déclarée, la signature, la table de tags ou l’espace colorimétrique primaire pris en charge est invalide |
vtmviIccChecksumMismatch | Le CheckSum décodé de 16 octets diffère du MD5 du fichier ICC complet |
vtmviIccVersionMismatch | Les quatre octets ICCVersion déclarés diffèrent des octets 8 à 11 de l’en-tête ICC |
vtmviIccColorSpaceMismatch | ProfileCS diffère des octets 16 à 19 de l’en-tête ICC ou n’est pas GRAY, RGB ou CMYK |
vtmviIccProfileNameMismatch | ProfileName ne correspond à aucune valeur de locale valide du profileDescriptionTag |
vtmviPrintingConditionUnresolved | L’OutputIntent faisant autorité, l’identifiant ou la dépendance ICC externe ne peut pas être résolu |
vtmviPrintingConditionMismatch | Les parties PDF/VT divergent sur OutputConditionIdentifier, la présence ou la valeur de RegistryName, ou l’espace colorimétrique primaire |
vtmviIccDeviceClassMismatch | Un profil de destination intégré ou externe n’est pas un profil de périphérique de sortie prtr |
ValidatePdfVT2sStream sur tout flux produit par des tests aller-retour de BuildPdfVT2sStream, ou sur des conteneurs PDF/VT-2s créés de l’extérieur avant traitementTPdfVT2sValidationResult.IsCompliant renvoie True uniquement lorsque l’ensemble Issues est vide
var Chunks: TPdfVT2sChunks;
begin
SetLength(Chunks, 2);
Chunks[0].Kind := vtckIccProfile;
Chunks[0].FileName := 'profile.icc';
Chunks[0].Bytes := IccBytes;
Chunks[1].Kind := vtckInlinePdf;
Chunks[1].Bytes := InlinePdfBytes;
BuildPdfVT2sStream(Chunks, MimeStream);
end;