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, όπου ένα έγγραφο PDF/VT συν το αναφερόμενο επαναχρησιμοποιήσιμο περιεχόμενο PDF και το προφίλ ICC συσκευάζονται ως μία ροή MIME multipart
Σε αντίθεση με τη διαδρομή TPdf.SaveAsPdfVT που γράφει αυτόνομο αρχείο PDF/VT-1, αυτή η μονάδα λειτουργεί καθαρά σε ροές byte και δεν φορτώνει ποτέ pdfium.dll, ώστε μπορεί να τρέξει σε headless διακομιστές και batch pipelines
Το BuildPdfVT2sStream συναρμολογεί τα chunks με τη σειρά και εκπέμπει την κεφαλίδα StreamVersion, τα όρια τμημάτων και τις κεφαλίδες Content-Type / Content-Disposition ανά τμήμα· το ValidatePdfVT2sStream αναλύει υπάρχουσα ροή και αναφέρει δομικές, συνθήκης-εκτύπωσης και ICC αποκλίσεις ως τυποποιημένο σύνολο ζητημάτων
Το InspectPdfVT2sStream επιστρέφει το ίδιο αποτέλεσμα συμβατότητας συν τεκμήρια για κάθε τμήμα PDF/VT, συμπεριλαμβανομένων συμμόρφωσης PDF/VT, βάσης PDF/X, ταυτότητας OutputIntent, προέλευσης προφίλ, MD5 και SHA-256, raw μεταδεδομένων ICC και πλήθους σελίδων και εγγραφών παραληπτών DPart
Κάθε τμήμα PDF ταξινομείται πρώτα με ValidatePdfVTCompliance· επαναχρησιμοποιήσιμες επισυνάψεις μόνο PDF/X παραμένουν επιλέξιμοι στόχοι αναφοράς αλλά εξαιρούνται από σύγκρισεις ιεραρχίας PDF/VT και συνθήκης εκτύπωσης
Η συσκευασία προφίλ ακολουθεί τη βάση αρχείου: PDF/VT-1 με PDF/X-4 και PDF/VT-2 με PDF/X-5g χρησιμοποιούν ενσωματωμένο DestOutputProfile, ενώ PDF/VT-2 με PDF/X-4p ή PDF/X-5pg χρησιμοποιεί DestOutputProfileRef που επιλύεται σε προγενέστερο τμήμα MIME ICC
| Τιμή | Ρόλος MIME |
|---|---|
vtckInlinePdf | Έγγραφο PDF/VT που μεταφέρεται ως inline τμήμα application/pdf· απαιτείται τουλάχιστον ένα |
vtckAttachmentPdf | Τμήμα επαναχρησιμοποιήσιμου περιεχομένου PDF που αναφέρει το inline έγγραφο, μεταφερόμενο ως attachment με όνομα αρχείου |
vtckIccProfile | Τμήμα προφίλ ICC (application/vnd.iccprofile) που παρέχεται ως επισύναψη με όνομα αρχείου |
| Τύπος | Σκοπός |
|---|---|
TPdfVT2sChunks | Δυναμικός πίνακας διατεταγμένων MIME chunks που παρέχεται στο BuildPdfVT2sStream |
TAnsiStrings | Δυναμικός πίνακας ονομάτων αρχείων που χρησιμοποιείται στην επικύρωση αναφορών εξωτερικών αρχείων στο inline PDF |
TPdfVT2sValidationIssues | Σύνολο ευρημάτων TPdfVT2sValidationIssue που επιστρέφει η επικύρωση |
TPdfVTPrintingConditionSource | Προέλευση τεκμηρίων προφίλ: vtpcsNone όταν δεν επιλύεται, vtpcsEmbeddedProfile για ενσωματωμένη ροή DestOutputProfile, vtpcsMimeProfile για DestOutputProfileRef που επιλύεται από τμήμα MIME ICC |
TPdfVTPrintingConditionEvidence | Ταξινόμηση PDF/VT και PDF/X ανά τμήμα, OutputIntent, πηγή προφίλ, ταυτότητα, digest, κεφαλίδα ICC και δεδομένα DPart |
TPdfVT2sValidationReport | Λεπτομερές αποτέλεσμα που επιστρέφει το InspectPdfVT2sStream χωρίς αλλαγή της διάταξης του legacy αποτελέσματος |
| Τιμή | Αναφέρεται όταν |
|---|---|
vtmviNotMultipart | Η ροή δεν είναι multipart MIME container |
vtmviMissingStreamVersion | Η απαιτούμενη κεφαλίδα 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 δεν είναι συνεπή σε όλο το container |
vtmviForwardReference | Μία επισύναψη αναφέρεται πριν εμφανιστεί στη ροή |
vtmviBoundaryInvalidChar | Η συμβολοσειρά boundary περιέχει χαρακτήρες που δεν επιτρέπει το RFC 2046 |
vtmviDuplicateFilename | Δύο MIME επισυνάψεις εκθέτουν το ίδιο όνομα αρχείου με διάκριση πεζών-κεφαλαίων |
vtmviOutputIntentAmbiguous | Ένα τμήμα PDF έχει μηδενικά ή πολλαπλά αυθεντικά OutputIntents GTS_PDFX |
vtmviOutputProfilePackagingMismatch | Το OutputIntent έχει και τις δύο μορφές προφίλ, καμία μορφή ή μορφή ασυμβίβαστη με τη βάση PDF/X-4, PDF/X-4p, PDF/X-5g ή PDF/X-5pg |
vtmviOutputProfileReferenceInvalid | Ένα DestOutputProfileRef παραλείπει απαιτούμενα μεταδεδομένα, προδιαγραφή αρχείου URL ή χρησιμοποιεί απαγορευμένο ColorantTable |
vtmviReferencedPartWrongType | Το αναφερόμενο όνομα αρχείου επιλύεται σε τμήμα MIME που δεν είναι προφίλ ICC |
vtmviIccProfileInvalid | Η κεφαλίδα ICC, το δηλωμένο μέγεθος, η υπογραφή, ο πίνακας tags ή ο υποστηριζόμενος process χρωματικός χώρος είναι άκυρα |
vtmviIccChecksumMismatch | Το αποκωδικοποιημένο CheckSum 16 byte διαφέρει από το MD5 του πλήρους αρχείου ICC |
vtmviIccVersionMismatch | Τα τέσσερα δηλωμένα bytes ICCVersion διαφέρουν από τα bytes 8 έως 11 της κεφαλίδας ICC |
vtmviIccColorSpaceMismatch | Το ProfileCS διαφέρει από τα bytes 16 έως 19 της κεφαλίδας ICC ή δεν είναι GRAY, RGB ή CMYK |
vtmviIccProfileNameMismatch | Το ProfileName δεν ταιριάζει με καμία έγκυρη τιμή locale profileDescriptionTag |
vtmviPrintingConditionUnresolved | Το αυθεντικό OutputIntent, το αναγνωριστικό ή η εξωτερική εξάρτηση ICC δεν μπορεί να επιλυθεί |
vtmviPrintingConditionMismatch | Τα τμήματα PDF/VT διαφωνούν σε OutputConditionIdentifier, παρουσία ή τιμή RegistryName ή process χρωματικό χώρο |
vtmviIccDeviceClassMismatch | Ένα ενσωματωμένο ή εξωτερικό προφίλ προορισμού δεν είναι προφίλ output-device prtr |
ValidatePdfVT2sStream σε οποιαδήποτε ροή που παρήγαγε το BuildPdfVT2sStream σε δοκιμές round-trip ή σε εξωτερικά συγγραφμένα containers 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;