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 implementeert het PDF/VT-2s-transport uit de ISO 16612-2 Annex, waarin een PDF/VT-document samen met zijn gerefereerde herbruikbare PDF-content en ICC-profiel wordt verpakt als één MIME multipart-stream
In tegenstelling tot het TPdf.SaveAsPdfVT-pad dat een zelfstandig PDF/VT-1-bestand schrijft, werkt deze unit puur op bytestreams en laadt nooit pdfium.dll, zodat de unit kan draaien in headless servers en batchpijplijnen
BuildPdfVT2sStream stelt de chunks op volgorde samen en levert de StreamVersion-header, part-grenzen en per-part Content-Type-/Content-Disposition-headers; ValidatePdfVT2sStream parsert een bestaande stream terug en meldt structurele, printing-condition- en ICC-afwijkingen als een getypeerde probleemenset
InspectPdfVT2sStream geeft hetzelfde compatibiliteitsresultaat terug plus bewijs voor elke PDF/VT-part, waaronder PDF/VT-conformance, PDF/X-basis, OutputIntent-identiteit, profielherkomst, MD5 en SHA-256, ruwe ICC-metadata en DPart-pagina- en ontvangerrecord-aantallen
Elke PDF-part wordt eerst geclassificeerd met ValidatePdfVTCompliance; herbruikbare bijlagen die alleen PDF/X zijn blijven geschikte referentiedoelen maar vallen buiten de PDF/VT-hiërarchie en de printing-condition-vergelijkingen
Profielverpakking volgt de bestandsbasis: PDF/VT-1 met PDF/X-4 en PDF/VT-2 met PDF/X-5g gebruiken een ingesloten DestOutputProfile, terwijl PDF/VT-2 met PDF/X-4p of PDF/X-5pg DestOutputProfileRef gebruikt, geresolved naar een eerdere ICC MIME-part
| Value | MIME role |
|---|---|
vtckInlinePdf | Een PDF/VT-document dat als inline application/pdf-part wordt meegevoerd; minstens één is vereist |
vtckAttachmentPdf | Een herbruikbaar PDF-contentpart waarnaar het inline document verwijst, meegevoerd als attachment met een bestandsnaam |
vtckIccProfile | Een ICC-profielpart (application/vnd.iccprofile) aangeleverd als attachment met een bestandsnaam |
| Type | Purpose |
|---|---|
TPdfVT2sChunks | Dynamische array van geordende MIME-chunks die aan BuildPdfVT2sStream wordt aangeleverd |
TAnsiStrings | Dynamische bestandsnaamarray gebruikt bij het valideren van external-file-verwijzingen in het inline PDF-document |
TPdfVT2sValidationIssues | Set van TPdfVT2sValidationIssue-bevindingen die door validatie wordt teruggegeven |
TPdfVTPrintingConditionSource | Oorsprong van het profielbewijs: vtpcsNone wanneer onopgelost, vtpcsEmbeddedProfile voor een ingesloten DestOutputProfile-stream, vtpcsMimeProfile voor een DestOutputProfileRef geresolved vanuit een ICC MIME-part |
TPdfVTPrintingConditionEvidence | Per-part PDF/VT- en PDF/X-classificatie, OutputIntent, profielbron, identiteit, digest, ICC-header en DPart-feiten |
TPdfVT2sValidationReport | Gedetailleerd resultaat dat door InspectPdfVT2sStream wordt teruggegeven zonder de legacy-resultaatindeling te wijzigen |
| Value | Reported when |
|---|---|
vtmviNotMultipart | De stream is geen multipart MIME-container |
vtmviMissingStreamVersion | De vereiste PDF/VT StreamVersion-header ontbreekt |
vtmviStreamVersionValue | De StreamVersion-waarde is niet de verwachte 1 |
vtmviStreamVersionAfterCt | StreamVersion staat na de Content-Type-regel in plaats van ervoor |
vtmviMissingBoundary | De Content-Type boundary-parameter ontbreekt |
vtmviNoInlinePdf | Er is geen inline PDF/VT-part aanwezig |
vtmviInlinePdfNotPdfVT | De inline part is niet als PDF/VT gedeclareerd |
vtmviIccProfileBadDisposition | Een ICC-profielpart is geen attachment |
vtmviAttachmentMissingFilename | Aan een attachmentpart ontbreekt de vereiste bestandsnaam |
vtmviInlineHasFilename | Het inline PDF-part draagt een bestandsnaam, wat niet is toegestaan |
vtmviNodeNameListMismatch | Twee PDF/VT-bestanden in de stream tonen verschillende NodeNameList-waarden |
vtmviRecordLevelMismatch | DPart-recordniveaus zijn inconsistent binnen de container |
vtmviForwardReference | Er wordt naar een attachment verwezen voordat die in de stream verschijnt |
vtmviBoundaryInvalidChar | De boundary-string bevat tekens die RFC 2046 niet toestaat |
vtmviDuplicateFilename | Twee MIME-attachments tonen dezelfde hoofdlettergevoelige bestandsnaam |
vtmviOutputIntentAmbiguous | Een PDF-part heeft nul of meerdere autoritatieve GTS_PDFX-OutputIntents |
vtmviOutputProfilePackagingMismatch | De OutputIntent heeft beide profielvormen, geen van beide vormen, of een vorm die niet past bij de PDF/X-4-, PDF/X-4p-, PDF/X-5g- of PDF/X-5pg-basis |
vtmviOutputProfileReferenceInvalid | Een DestOutputProfileRef laat vereiste metadata of een URL file specification weg, of gebruikt een verboden ColorantTable |
vtmviReferencedPartWrongType | De gerefereerde bestandsnaam resolveert naar een MIME-part die geen ICC-profiel is |
vtmviIccProfileInvalid | De ICC-header, opgegeven grootte, signatuur, tagtabel of ondersteunde proceskleurruimte is ongeldig |
vtmviIccChecksumMismatch | De gedecodeerde 16-byte CheckSum verschilt van de MD5 van het volledige ICC-bestand |
vtmviIccVersionMismatch | De opgegeven vier ICCVersion-bytes verschillen van ICC-headerbytes 8 tot en met 11 |
vtmviIccColorSpaceMismatch | ProfileCS verschilt van ICC-headerbytes 16 tot en met 19 of is niet GRAY, RGB of CMYK |
vtmviIccProfileNameMismatch | ProfileName matcht geen enkele geldige profileDescriptionTag-locale-waarde |
vtmviPrintingConditionUnresolved | De autoritatieve OutputIntent, identificator of externe ICC-afhankelijkheid kan niet worden geresolved |
vtmviPrintingConditionMismatch | PDF/VT-parts zijn het oneens over OutputConditionIdentifier, RegistryName-aanwezigheid of -waarde, of proceskleurruimte |
vtmviIccDeviceClassMismatch | Een ingesloten of extern destination-profiel is geen output-device-prtr-profiel |
ValidatePdfVT2sStream aan op elke stream die door round-trip-testen met BuildPdfVT2sStream is geproduceerd, of op extern geschreven PDF/VT-2s-containers vóór verwerkingTPdfVT2sValidationResult.IsCompliant geeft alleen True terug wanneer de Issues-set leeg is
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;