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 implementuje transport PDF/VT-2s zdefiniowany w załączniku ISO 16612-2, w którym dokument PDF/VT wraz z przywoływaną wielokrotnego użytku treścią PDF i profilem ICC jest pakowany jako pojedynczy strumień MIME multipart
W odróżnieniu od ścieżki TPdf.SaveAsPdfVT, która zapisuje samodzielny plik PDF/VT-1, ten moduł działa czysto na strumieniach bajtów i nigdy nie ładuje pdfium.dll, więc może działać na serwerach headless i w potokach wsadowych
BuildPdfVT2sStream składa kawałki w kolejności i emituje nagłówek StreamVersion, granice części oraz nagłówki Content-Type / Content-Disposition każdej części; ValidatePdfVT2sStream parsuje istniejący strumień z powrotem i raportuje odchylenia strukturalne, warunków drukowania i ICC jako typowany zbiór problemów
InspectPdfVT2sStream zwraca ten sam wynik zgodności plus dowody dla każdej części PDF/VT, w tym zgodność PDF/VT, bazę PDF/X, tożsamość OutputIntent, pochodzenie profilu, MD5 i SHA-256, surowe metadane ICC oraz liczniki stron DPart i rekordów adresatów
Każda część PDF jest najpierw klasyfikowana przez ValidatePdfVTCompliance; wielokrotnego użytku załączniki wyłącznie PDF/X pozostają kwalifikującymi się celami odwołań, ale są wykluczane z porównań hierarchii PDF/VT i warunków drukowania
Pakowanie profilu podąża za bazą pliku: PDF/VT-1 z PDF/X-4 oraz PDF/VT-2 z PDF/X-5g używają osadzonego DestOutputProfile, podczas gdy PDF/VT-2 z PDF/X-4p lub PDF/X-5pg używa DestOutputProfileRef rozwiązywanego do wcześniejszej części MIME z profilem ICC
| Value | MIME role |
|---|---|
vtckInlinePdf | Dokument PDF/VT przenoszony jako część application/pdf inline; wymagany jest co najmniej jeden |
vtckAttachmentPdf | Część wielokrotnego użytku treści PDF przywoływana przez dokument inline, przenoszona jako attachment z nazwą pliku |
vtckIccProfile | Część z profilem ICC (application/vnd.iccprofile) dostarczana jako załącznik z nazwą pliku |
| Type | Purpose |
|---|---|
TPdfVT2sChunks | Tablica dynamiczna uporządkowanych kawałków MIME dostarczanych do BuildPdfVT2sStream |
TAnsiStrings | Tablica dynamiczna nazw plików używana przy walidacji odwołań do plików zewnętrznych w dokumencie inline |
TPdfVT2sValidationIssues | Zbiór ustaleń TPdfVT2sValidationIssue zwracany przez walidację |
TPdfVTPrintingConditionSource | Pochodzenie dowodów profilu: vtpcsNone, gdy nierozwiązane, vtpcsEmbeddedProfile dla osadzonego strumienia DestOutputProfile, vtpcsMimeProfile dla DestOutputProfileRef rozwiązanego z części MIME z profilem ICC |
TPdfVTPrintingConditionEvidence | Klasyfikacja PDF/VT i PDF/X per część, OutputIntent, źródło profilu, tożsamość, skrót, nagłówek ICC i fakty DPart |
TPdfVT2sValidationReport | Szczegółowy wynik zwracany przez InspectPdfVT2sStream bez zmiany układu wyniku legacy |
| Value | Reported when |
|---|---|
vtmviNotMultipart | Strumień nie jest kontenerem MIME multipart |
vtmviMissingStreamVersion | Brakuje wymaganego nagłówka PDF/VT StreamVersion |
vtmviStreamVersionValue | Wartość StreamVersion nie jest oczekiwanym 1 |
vtmviStreamVersionAfterCt | StreamVersion pojawia się za wierszem Content-Type zamiast przed nim |
vtmviMissingBoundary | Brakuje parametru boundary w Content-Type |
vtmviNoInlinePdf | Nie ma części z dokumentem PDF/VT inline |
vtmviInlinePdfNotPdfVT | Część inline nie jest zadeklarowana jako PDF/VT |
vtmviIccProfileBadDisposition | Część z profilem ICC nie jest załącznikiem |
vtmviAttachmentMissingFilename | Część załącznika nie ma wymaganej nazwy pliku |
vtmviInlineHasFilename | Część PDF inline niesie nazwę pliku, czego nie wolno |
vtmviNodeNameListMismatch | Dwa pliki PDF/VT w strumieniu podają różne wartości NodeNameList |
vtmviRecordLevelMismatch | Poziomy rekordów DPart są niespójne wewnątrz kontenera |
vtmviForwardReference | Załącznik jest przywoływany, zanim pojawi się w strumieniu |
vtmviBoundaryInvalidChar | Łańcuch boundary zawiera znaki niedozwolone przez RFC 2046 |
vtmviDuplicateFilename | Dwa załączniki MIME podają tę samą nazwę pliku z rozróżnianiem wielkości liter |
vtmviOutputIntentAmbiguous | Część PDF ma zero albo wiele autorytatywnych OutputIntentów GTS_PDFX |
vtmviOutputProfilePackagingMismatch | OutputIntent ma obie formy profilu, żadną formę albo formę niezgodną z bazą PDF/X-4, PDF/X-4p, PDF/X-5g lub PDF/X-5pg |
vtmviOutputProfileReferenceInvalid | DestOutputProfileRef pomija wymagane metadane albo specyfikację pliku URL albo używa zabronionego ColorantTable |
vtmviReferencedPartWrongType | Przywoływana nazwa pliku rozwiązuje do części MIME, która nie jest profilem ICC |
vtmviIccProfileInvalid | Nagłówek ICC, zadeklarowany rozmiar, podpis, tablica tagów lub obsługiwana przestrzeń kolorów procesowych jest niepoprawna |
vtmviIccChecksumMismatch | Zdekodowane 16-bajtowe CheckSum różni się od MD5 kompletnego pliku ICC |
vtmviIccVersionMismatch | Zadeklarowane cztery bajty ICCVersion różnią się od bajtów 8 do 11 nagłówka ICC |
vtmviIccColorSpaceMismatch | ProfileCS różni się od bajtów 16 do 19 nagłówka ICC albo nie jest GRAY, RGB ani CMYK |
vtmviIccProfileNameMismatch | ProfileName nie pasuje do żadnej poprawnej wartości locale profileDescriptionTag |
vtmviPrintingConditionUnresolved | Autorytatywny OutputIntent, identyfikator albo zewnętrzna zależność ICC nie dają się rozwiązać |
vtmviPrintingConditionMismatch | Części PDF/VT różnią się co do OutputConditionIdentifier, obecności lub wartości RegistryName albo przestrzeni kolorów procesowych |
vtmviIccDeviceClassMismatch | Osadzony albo zewnętrzny profil docelowy nie jest profilem urządzenia wyjściowego prtr |
ValidatePdfVT2sStream na każdym strumieniu produkowanym przez BuildPdfVT2sStream w testach w obie strony albo na zewnętrznie autorowanych kontenerach PDF/VT-2s przed przetwarzaniemTPdfVT2sValidationResult.IsCompliant zwraca True tylko wtedy, gdy zbiór Issues jest pusty
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;