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 реализира транспорта PDF/VT-2s, дефиниран в ISO 16612-2 Annex, където PDF/VT документ заедно с соченото от него преизползваемо PDF съдържание и ICC профил се опаковат като един MIME multipart поток
За разлика от пътя TPdf.SaveAsPdfVT, който записва самостоятелен PDF/VT-1 файл, този модул работи изцяло върху байтови потоци и никога не зарежда pdfium.dll, така че може да се изпълнява в headless сървъри и batch тръбопроводи
BuildPdfVT2sStream сглобява частите в подредбата им и излъчва header StreamVersion, границите между частите и header Content-Type / Content-Disposition за всяка част; ValidatePdfVT2sStream парсва обратно съществуващ поток и докладва структурни отклонения, отклонения в printing condition и в ICC като типизирано множество от проблеми
InspectPdfVT2sStream връща същия резултат за съвместимост плюс доказателства за всяка PDF/VT част, включително PDF/VT съответствие, PDF/X основа, идентичност на OutputIntent, произход на профила, MD5 и SHA-256, сурови ICC метаданни и брояци за DPart страници и записи на получатели
Всяка PDF част първо се класифицира с ValidatePdfVTCompliance; преизползваемите прикачени файлове само с PDF/X остават допустими цели за препратки, но са изключени от PDF/VT йерархията и сравненията на printing conditions
Опаковането на профила следва основата на файла: PDF/VT-1 с PDF/X-4 и PDF/VT-2 с PDF/X-5g използват вграден DestOutputProfile, докато PDF/VT-2 с PDF/X-4p или PDF/X-5pg използва DestOutputProfileRef, разрешен към по-ранна ICC MIME част
| Value | MIME роля |
|---|---|
vtckInlinePdf | PDF/VT документ, носен като inline част application/pdf; поне една е задължителна |
vtckAttachmentPdf | Преизползваема PDF част за съдържание, сочена от inline документа, носена като attachment с име на файл |
vtckIccProfile | Част с ICC профил (application/vnd.iccprofile), подадена като прикачен файл с име на файл |
| Тип | Предназначение |
|---|---|
TPdfVT2sChunks | Динамичен масив от подредени MIME части, подавани на BuildPdfVT2sStream |
TAnsiStrings | Динамичен масив от имена на файлове, използван при валидиране на препратки към външни файлове в inline PDF |
TPdfVT2sValidationIssues | Множество от находки TPdfVT2sValidationIssue, връщано от валидацията |
TPdfVTPrintingConditionSource | Произход на доказателствата за профила: vtpcsNone когато не е разрешен, vtpcsEmbeddedProfile за вграден поток DestOutputProfile, vtpcsMimeProfile за DestOutputProfileRef, разрешен от ICC MIME част |
TPdfVTPrintingConditionEvidence | Класификация PDF/VT и PDF/X за всяка част, OutputIntent, произход на профила, идентичност, digest, ICC header и факти за DPart |
TPdfVT2sValidationReport | Подробен резултат, връщан от InspectPdfVT2sStream, без да променя legacy подредбата на резултата |
| Value | Докладва се, когато |
|---|---|
vtmviNotMultipart | Потокът не е multipart MIME контейнер |
vtmviMissingStreamVersion | Задължителният header PDF/VT StreamVersion липсва |
vtmviStreamVersionValue | Стойността StreamVersion не е очакваната 1 |
vtmviStreamVersionAfterCt | StreamVersion се появява след реда Content-Type, вместо преди него |
vtmviMissingBoundary | Параметърът boundary на Content-Type липсва |
vtmviNoInlinePdf | Липсва inline PDF/VT част |
vtmviInlinePdfNotPdfVT | Inline частта не е декларирана като PDF/VT |
vtmviIccProfileBadDisposition | Част с ICC профил не е прикачен файл |
vtmviAttachmentMissingFilename | Прикачена част липсва задължителното име на файл |
vtmviInlineHasFilename | Inline PDF частта носи име на файл, което не е позволено |
vtmviNodeNameListMismatch | Два PDF/VT файла в потока излагат различни стойности NodeNameList |
vtmviRecordLevelMismatch | Нивата на DPart записите са непоследователни в контейнера |
vtmviForwardReference | Прикачен файл е сочен, преди да се появи в потока |
vtmviBoundaryInvalidChar | Низът boundary съдържа знаци, непозволени от RFC 2046 |
vtmviDuplicateFilename | Две MIME прикачени файлове излагат едно и също име на файл, чувствително към регистъра |
vtmviOutputIntentAmbiguous | PDF част има нула или повече авторитетни GTS_PDFX OutputIntents |
vtmviOutputProfilePackagingMismatch | OutputIntent има и двете форми на профила, нито една форма или форма, несъвместима с основата PDF/X-4, PDF/X-4p, PDF/X-5g или PDF/X-5pg |
vtmviOutputProfileReferenceInvalid | DestOutputProfileRef пропуска нужните метаданни или URL file specification, или използва забранен ColorantTable |
vtmviReferencedPartWrongType | Соченото име на файл се разрешава към MIME част, която не е ICC профил |
vtmviIccProfileInvalid | ICC header, декларираният размер, подписът, tag таблицата или поддържаното process цветово пространство е невалидно |
vtmviIccChecksumMismatch | Декодираният 16-байтов CheckSum се различава от MD5 на пълния ICC файл |
vtmviIccVersionMismatch | Декларираните четири байта ICCVersion се различават от байтове 8 до 11 на ICC header |
vtmviIccColorSpaceMismatch | ProfileCS се различава от байтове 16 до 19 на ICC header или не е GRAY, RGB или CMYK |
vtmviIccProfileNameMismatch | ProfileName не съвпада с нито една валидна locale стойност на profileDescriptionTag |
vtmviPrintingConditionUnresolved | Авторитетният OutputIntent, идентификаторът или външната ICC зависимост не могат да се разрешат |
vtmviPrintingConditionMismatch | PDF/VT частите не са съгласни за OutputConditionIdentifier, наличието или стойността на RegistryName или process цветовото пространство |
vtmviIccDeviceClassMismatch | Вграден или външен дестинационен профил не е профил на изходно устройство prtr |
ValidatePdfVT2sStream върху всеки поток, произведен от BuildPdfVT2sStream при round-trip тестване, или върху външно авторски PDF/VT-2s контейнери преди обработкаTPdfVT2sValidationResult.IsCompliant връща True само когато множеството Issues е празно
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;