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 implementerar PDF/VT-2s-transporten som definieras i ISO 16612-2 Annex, där ett PDF/VT-dokument plus dess refererade återanvändbara PDF-innehåll och ICC-profil paketeras som en enda MIME multipart-ström
Till skillnad från TPdf.SaveAsPdfVT-vägen som skriver en fristående PDF/VT-1-fil arbetar den här enheten enbart på byteströmmar och läser aldrig in pdfium.dll, så den kan köras i headless-servrar och batchpipelines
BuildPdfVT2sStream sätter samman chunkarna i ordning och genererar StreamVersion-rubriken, partgränser och per-part Content-Type-/Content-Disposition-rubriker; ValidatePdfVT2sStream tolkar en befintlig ström tillbaka och rapporterar strukturella, printing-condition- och ICC-avvikelser som en typad uppsättning problem
InspectPdfVT2sStream returnerar samma kompatibilitetsresultat plus bevis för varje PDF/VT-part, inklusive PDF/VT-efterlevnad, PDF/X-bas, OutputIntent-identitet, profilursprung, MD5 och SHA-256, rå ICC-metadata samt DPart-sidor och mottagarposter
Varje PDF-part klassificeras först med ValidatePdfVTCompliance; återanvändbara bilagor som enbart är PDF/X förblir godtagbara referensmål men undantas från PDF/VT-hierarkin och printing-condition-jämförelserna
Profilpaketeringen följer filbasen: PDF/VT-1 med PDF/X-4 och PDF/VT-2 med PDF/X-5g använder en inbäddad DestOutputProfile, medan PDF/VT-2 med PDF/X-4p eller PDF/X-5pg använder DestOutputProfileRef som slås upp till en tidigare ICC MIME-part
| Value | MIME role |
|---|---|
vtckInlinePdf | Ett PDF/VT-dokument som bärs som en inline application/pdf-part; minst en krävs |
vtckAttachmentPdf | En återanvändbar PDF-innehållsdel som refereras av inline-dokumentet och bärs som en attachment med filnamn |
vtckIccProfile | En ICC-profilpart (application/vnd.iccprofile) som levereras som en bilaga med filnamn |
| Type | Purpose |
|---|---|
TPdfVT2sChunks | Dynamisk array av ordnade MIME-chunker som levereras till BuildPdfVT2sStream |
TAnsiStrings | Dynamisk array av filnamn som används när externa filreferenser i inline-PDF:en valideras |
TPdfVT2sValidationIssues | Uppsättning av TPdfVT2sValidationIssue-fynd som returneras av valideringen |
TPdfVTPrintingConditionSource | Ursprung till profilbevisen: vtpcsNone när olöst, vtpcsEmbeddedProfile för en inbäddad DestOutputProfile-ström, vtpcsMimeProfile för en DestOutputProfileRef som slagits upp från en ICC MIME-part |
TPdfVTPrintingConditionEvidence | Per-part-klassificering i PDF/VT och PDF/X, OutputIntent, profilursprung, identitet, digest, ICC-rubrik och DPart-fakta |
TPdfVT2sValidationReport | Detaljerat resultat som returneras av InspectPdfVT2sStream utan att ändra den tidigare resultatlayouten |
| Value | Reported when |
|---|---|
vtmviNotMultipart | Strömmen inte är en MIME multipart-behållare |
vtmviMissingStreamVersion | Den obligatoriska PDF/VT StreamVersion-rubriken saknas |
vtmviStreamVersionValue | StreamVersion-värdet inte är det förväntade 1 |
vtmviStreamVersionAfterCt | StreamVersion förekommer efter Content-Type-raden i stället för före den |
vtmviMissingBoundary | Content-Type boundary-parametern saknas |
vtmviNoInlinePdf | Ingen inline PDF/VT-part finns |
vtmviInlinePdfNotPdfVT | Inline-delen inte är deklarerad som PDF/VT |
vtmviIccProfileBadDisposition | En ICC-profilpart inte är en bilaga |
vtmviAttachmentMissingFilename | En bilagapart saknar det obligatoriska filnamnet |
vtmviInlineHasFilename | Inline-PDF-delen bär ett filnamn, vilket inte är tillåtet |
vtmviNodeNameListMismatch | Två PDF/VT-filer i strömmen exponerar olika NodeNameList-värden |
vtmviRecordLevelMismatch | DPart-postnivåerna är inkonsekventa i behållaren |
vtmviForwardReference | En bilaga refereras innan den förekommer i strömmen |
vtmviBoundaryInvalidChar | Gränssträngen innehåller tecken som inte tillåts av RFC 2046 |
vtmviDuplicateFilename | Två MIME-bilagor exponerar samma skiftlägeskänsliga filnamn |
vtmviOutputIntentAmbiguous | En PDF-part har noll eller flera auktoritativa GTS_PDFX-OutputIntents |
vtmviOutputProfilePackagingMismatch | OutputIntenten har båda profilformerna, ingen form eller en form som är inkompatibel med PDF/X-4-, PDF/X-4p-, PDF/X-5g- eller PDF/X-5pg-basen |
vtmviOutputProfileReferenceInvalid | En DestOutputProfileRef utelämnar obligatorisk metadata eller en URL-filspecifikation, eller använder en förbjuden ColorantTable |
vtmviReferencedPartWrongType | Det refererade filnamnet leder till en MIME-part som inte är en ICC-profil |
vtmviIccProfileInvalid | ICC-rubriken, den deklarerade storleken, signaturen, taggtabellen eller den stödda processfärgrymden är ogiltig |
vtmviIccChecksumMismatch | Den avkodade 16 byte stora CheckSum skiljer sig från MD5 av hela ICC-filen |
vtmviIccVersionMismatch | De fyra deklarerade ICCVersion-bytes skiljer sig från ICC-rubrikens bytes 8 till 11 |
vtmviIccColorSpaceMismatch | ProfileCS skiljer sig från ICC-rubrikens bytes 16 till 19 eller inte är GRAY, RGB eller CMYK |
vtmviIccProfileNameMismatch | ProfileName matchar inget giltigt profileDescriptionTag-locale-värde |
vtmviPrintingConditionUnresolved | Den auktoritativa OutputIntenten, identifieraren eller det externa ICC-beroendet inte kan lösas upp |
vtmviPrintingConditionMismatch | PDF/VT-delarna är oeniga om OutputConditionIdentifier, RegistryName-närvaro eller -värde, eller processfärgrymd |
vtmviIccDeviceClassMismatch | En inbäddad eller extern målprofil inte är en utmatningsenhetsprofil av typen prtr |
ValidatePdfVT2sStream på alla strömmar som BuildPdfVT2sStream producerar vid round-trip-testning, eller på externt författade PDF/VT-2s-behållare före bearbetningTPdfVT2sValidationResult.IsCompliant returnerar True endast när Issues-uppsättningen är tom
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;