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 hiện thực cơ chế vận chuyển PDF/VT-2s định nghĩa trong Phụ lục của ISO 16612-2, nơi một tài liệu PDF/VT cùng nội dung PDF tái sử dụng được mà nó tham chiếu và hồ sơ ICC được đóng gói thành một stream MIME multipart duy nhất
Khác với đường TPdf.SaveAsPdfVT ghi một tệp PDF/VT-1 độc lập, unit này chỉ làm việc thuần túy trên byte stream và không bao giờ nạp pdfium.dll, nhờ vậy chạy được trên các máy chủ headless và các pipeline xử lý hàng loạt
BuildPdfVT2sStream lắp các chunk theo thứ tự và phát ra header StreamVersion, các biên part, và các header Content-Type / Content-Disposition cho từng part; ValidatePdfVT2sStream parse ngược một stream hiện có và báo cáo các sai lệch cấu trúc, printing-condition và ICC dưới dạng một tập vấn đề có kiểu
InspectPdfVT2sStream trả về cùng kết quả tương thích cộng bằng chứng cho từng part PDF/VT, gồm mức tuân thủ PDF/VT, nền PDF/X, định danh OutputIntent, nguồn gốc hồ sơ, MD5 và SHA-256, siêu dữ liệu ICC thô, và số lượng trang cùng bản ghi người nhận của DPart
Mỗi part PDF được phân loại trước bằng ValidatePdfVTCompliance; các đính kèm tái sử dụng được chỉ thuộc PDF/X vẫn đủ điều kiện làm mục tiêu tham chiếu nhưng bị loại khỏi hệ phân cấp PDF/VT và các phép so sánh printing-condition
Cách đóng gói hồ sơ đi theo nền tệp: PDF/VT-1 với PDF/X-4 và PDF/VT-2 với PDF/X-5g dùng một DestOutputProfile nhúng, trong khi PDF/VT-2 với PDF/X-4p hay PDF/X-5pg dùng DestOutputProfileRef phân giải tới một part ICC MIME đứng trước
| Value | MIME role |
|---|---|
vtckInlinePdf | Một tài liệu PDF/VT được mang dưới dạng part application/pdf inline; cần ít nhất một |
vtckAttachmentPdf | Một part nội dung PDF tái sử dụng được mà tài liệu inline tham chiếu, được mang dưới dạng attachment kèm tên tệp |
vtckIccProfile | Một part hồ sơ ICC (application/vnd.iccprofile) được cung cấp dưới dạng đính kèm kèm tên tệp |
| Type | Purpose |
|---|---|
TPdfVT2sChunks | Mảng động các MIME chunk có thứ tự được cung cấp cho BuildPdfVT2sStream |
TAnsiStrings | Mảng tên tệp động dùng khi kiểm tra các tham chiếu tệp ngoài trong PDF inline |
TPdfVT2sValidationIssues | Tập các phát hiện TPdfVT2sValidationIssue được kiểm tra trả về |
TPdfVTPrintingConditionSource | Nguồn gốc của bằng chứng hồ sơ: vtpcsNone khi chưa phân giải được, vtpcsEmbeddedProfile cho một stream DestOutputProfile nhúng, vtpcsMimeProfile cho một DestOutputProfileRef phân giải từ một part ICC MIME |
TPdfVTPrintingConditionEvidence | Phân loại PDF/VT và PDF/X cho từng part, OutputIntent, nguồn hồ sơ, định danh, digest, header ICC và các sự thật DPart |
TPdfVT2sValidationReport | Kết quả chi tiết do InspectPdfVT2sStream trả về mà không đổi bố cục kết quả cũ |
| Value | Reported when |
|---|---|
vtmviNotMultipart | Stream không phải một container MIME multipart |
vtmviMissingStreamVersion | Thiếu header StreamVersion PDF/VT bắt buộc |
vtmviStreamVersionValue | Giá trị StreamVersion không phải 1 như mong đợi |
vtmviStreamVersionAfterCt | StreamVersion xuất hiện sau dòng Content-Type thay vì trước |
vtmviMissingBoundary | Thiếu tham số boundary trong Content-Type |
vtmviNoInlinePdf | Không có part PDF/VT inline nào |
vtmviInlinePdfNotPdfVT | Part inline không được khai báo là PDF/VT |
vtmviIccProfileBadDisposition | Một part hồ sơ ICC không phải attachment |
vtmviAttachmentMissingFilename | Một part đính kèm thiếu tên tệp bắt buộc |
vtmviInlineHasFilename | Part PDF inline mang tên tệp, điều không được phép |
vtmviNodeNameListMismatch | Hai tệp PDF/VT trong stream phơi bày các giá trị NodeNameList khác nhau |
vtmviRecordLevelMismatch | Các mức bản ghi DPart không nhất quán trong container |
vtmviForwardReference | Một đính kèm được tham chiếu trước khi nó xuất hiện trong stream |
vtmviBoundaryInvalidChar | Chuỗi boundary chứa các ký tự RFC 2046 không cho phép |
vtmviDuplicateFilename | Hai đính kèm MIME phơi bày cùng một tên tệp phân biệt chữ hoa chữ thường |
vtmviOutputIntentAmbiguous | Một part PDF có không hay nhiều OutputIntent GTS_PDFX có thẩm quyền |
vtmviOutputProfilePackagingMismatch | OutputIntent có cả hai dạng hồ sơ, không dạng nào, hoặc một dạng không tương thích với nền PDF/X-4, PDF/X-4p, PDF/X-5g hay PDF/X-5pg |
vtmviOutputProfileReferenceInvalid | Một DestOutputProfileRef thiếu siêu dữ liệu bắt buộc, một đặc tả tệp URL, hoặc dùng một ColorantTable bị cấm |
vtmviReferencedPartWrongType | Tên tệp được tham chiếu phân giải tới một part MIME không phải hồ sơ ICC |
vtmviIccProfileInvalid | Header ICC, kích thước đã khai báo, chữ ký, bảng tag hay không gian màu process được hỗ trợ không hợp lệ |
vtmviIccChecksumMismatch | CheckSum 16 byte đã giải mã khác MD5 của toàn bộ tệp ICC |
vtmviIccVersionMismatch | Bốn byte ICCVersion đã khai báo khác byte 8 tới 11 của header ICC |
vtmviIccColorSpaceMismatch | ProfileCS khác byte 16 tới 19 của header ICC hoặc không phải GRAY, RGB hay CMYK |
vtmviIccProfileNameMismatch | ProfileName không khớp bất kỳ giá trị locale profileDescriptionTag hợp lệ nào |
vtmviPrintingConditionUnresolved | OutputIntent có thẩm quyền, định danh, hay phụ thuộc ICC ngoài không thể phân giải được |
vtmviPrintingConditionMismatch | Các part PDF/VT bất đồng về OutputConditionIdentifier, sự hiện diện hay giá trị của RegistryName, hoặc không gian màu process |
vtmviIccDeviceClassMismatch | Một hồ sơ đích nhúng hay ngoài không phải hồ sơ thiết bị đầu ra prtr |
ValidatePdfVT2sStream trên bất kỳ stream nào do BuildPdfVT2sStream tạo ra trong kiểm thử vòng lặp, hoặc trên các container PDF/VT-2s được tác giả bên ngoài trước khi xử lýTPdfVT2sValidationResult.IsCompliant chỉ trả về True khi tập Issues rỗng
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;