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 implementa il trasporto PDF/VT-2s definito nell'Allegato di ISO 16612-2, in cui un documento PDF/VT insieme al suo contenuto PDF riutilizzabile referenziato e al profilo ICC viene confezionato come un unico stream MIME multipart
A differenza del percorso TPdf.SaveAsPdfVT che scrive un file PDF/VT-1 autonomo, questa unit opera puramente su stream di byte e non carica mai pdfium.dll, quindi può girare in server headless e pipeline batch
BuildPdfVT2sStream assembla i chunk in ordine ed emette l'header StreamVersion, i confini delle parti e gli header Content-Type / Content-Disposition per ogni parte; ValidatePdfVT2sStream analizza nuovamente uno stream esistente e riporta deviazioni strutturali, di condizione di stampa e ICC come un insieme tipizzato di problemi
InspectPdfVT2sStream restituisce lo stesso risultato di compatibilità più le evidenze per ogni parte PDF/VT, inclusa la conformità PDF/VT, la base PDF/X, l'identità dell'OutputIntent, la provenienza del profilo, MD5 e SHA-256, i metadati ICC grezzi e i conteggi di pagine e record di destinatari DPart
Ogni parte PDF viene prima classificata con ValidatePdfVTCompliance; gli allegati riutilizzabili solo PDF/X restano destinazioni di riferimento idonee ma sono esclusi dal confronto della gerarchia PDF/VT e delle condizioni di stampa
Il confezionamento del profilo segue la base del file: PDF/VT-1 con PDF/X-4 e PDF/VT-2 con PDF/X-5g usano un DestOutputProfile incorporato, mentre PDF/VT-2 con PDF/X-4p o PDF/X-5pg usa DestOutputProfileRef risolto su una parte MIME ICC precedente
| Value | MIME role |
|---|---|
vtckInlinePdf | Un documento PDF/VT trasportato come parte inline application/pdf; almeno uno è richiesto |
vtckAttachmentPdf | Una parte di contenuto PDF riutilizzabile referenziata dal documento inline, trasportata come attachment con un nome di file |
vtckIccProfile | Una parte profilo ICC (application/vnd.iccprofile) fornita come allegato con un nome di file |
| Type | Purpose |
|---|---|
TPdfVT2sChunks | Array dinamico di chunk MIME ordinati forniti a BuildPdfVT2sStream |
TAnsiStrings | Array dinamico di nomi di file usato quando si validano riferimenti a file esterni nel PDF inline |
TPdfVT2sValidationIssues | Insieme dei riscontri TPdfVT2sValidationIssue restituito dalla validazione |
TPdfVTPrintingConditionSource | Origine delle evidenze del profilo: vtpcsNone quando non risolto, vtpcsEmbeddedProfile per uno stream DestOutputProfile incorporato, vtpcsMimeProfile per un DestOutputProfileRef risolto su una parte MIME ICC |
TPdfVTPrintingConditionEvidence | Classificazione PDF/VT e PDF/X per parte, OutputIntent, sorgente del profilo, identità, digest, header ICC e informazioni DPart |
TPdfVT2sValidationReport | Risultato dettagliato restituito da InspectPdfVT2sStream senza modificare il layout legacy del risultato |
| Value | Reported when |
|---|---|
vtmviNotMultipart | Lo stream non è un contenitore MIME multipart |
vtmviMissingStreamVersion | L'header StreamVersion PDF/VT richiesto è assente |
vtmviStreamVersionValue | Il valore StreamVersion non è il 1 atteso |
vtmviStreamVersionAfterCt | StreamVersion compare dopo la riga Content-Type invece che prima |
vtmviMissingBoundary | Il parametro boundary del Content-Type manca |
vtmviNoInlinePdf | Nessuna parte PDF/VT inline è presente |
vtmviInlinePdfNotPdfVT | La parte inline non è dichiarata come PDF/VT |
vtmviIccProfileBadDisposition | Una parte profilo ICC non è un attachment |
vtmviAttachmentMissingFilename | Una parte attachment è priva del nome di file richiesto |
vtmviInlineHasFilename | La parte PDF inline porta un nome di file, cosa non consentita |
vtmviNodeNameListMismatch | Due file PDF/VT nello stream espongono valori NodeNameList diversi |
vtmviRecordLevelMismatch | I livelli di record DPart sono incoerenti attraverso il contenitore |
vtmviForwardReference | Un allegato è referenziato prima di comparire nello stream |
vtmviBoundaryInvalidChar | La stringa boundary contiene caratteri non ammessi da RFC 2046 |
vtmviDuplicateFilename | Due allegati MIME espongono lo stesso nome di file, confronto sensibile alle maiuscole |
vtmviOutputIntentAmbiguous | Una parte PDF ha zero o più OutputIntents autorevoli GTS_PDFX |
vtmviOutputProfilePackagingMismatch | L'OutputIntent ha entrambe le forme di profilo, nessuna delle due, oppure una forma incompatibile con la base PDF/X-4, PDF/X-4p, PDF/X-5g o PDF/X-5pg |
vtmviOutputProfileReferenceInvalid | Un DestOutputProfileRef omette metadati richiesti o una specifica di file URL, oppure usa un ColorantTable vietato |
vtmviReferencedPartWrongType | Il nome di file referenziato si risolve in una parte MIME che non è un profilo ICC |
vtmviIccProfileInvalid | L'header ICC, la dimensione dichiarata, la firma, la tabella dei tag o lo spazio colore di processo supportato non è valido |
vtmviIccChecksumMismatch | Il CheckSum decodificato di 16 byte differisce dall'MD5 del file ICC completo |
vtmviIccVersionMismatch | I quattro byte ICCVersion dichiarati differiscono dai byte da 8 a 11 dell'header ICC |
vtmviIccColorSpaceMismatch | ProfileCS differisce dai byte da 16 a 19 dell'header ICC oppure non è GRAY, RGB o CMYK |
vtmviIccProfileNameMismatch | ProfileName non corrisponde a nessun valore locale valido del profileDescriptionTag |
vtmviPrintingConditionUnresolved | L'OutputIntent autorevole, l'identificatore o la dipendenza ICC esterna non possono essere risolti |
vtmviPrintingConditionMismatch | Le parti PDF/VT discordano su OutputConditionIdentifier, presenza o valore di RegistryName, oppure spazio colore di processo |
vtmviIccDeviceClassMismatch | Un profilo di destinazione incorporato o esterno non è un profilo di dispositivo di output prtr |
ValidatePdfVT2sStream su qualsiasi stream prodotto da BuildPdfVT2sStream nei test di round-trip, oppure su contenitori PDF/VT-2s redatti esternamente prima dell'elaborazioneTPdfVT2sValidationResult.IsCompliant restituisce True solo quando l'insieme Issues è vuoto
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;