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 چندبخشی واحد بستهبندی میشوند
برخلاف مسیر TPdf.SaveAsPdfVT که یک فایل مستقل PDF/VT-1 مینویسد، این واحد صرفاً روی جریانهای بایتی کار میکند و هرگز pdfium.dll را بارگذاری نمیکند؛ پس میتواند در سرورهای headless و خطوط لولهٔ دستهای اجرا شود
BuildPdfVT2sStream بخشها را به ترتیب سرهم میکند و هدر StreamVersion، مرزهای بخشها و هدرهای Content-Type / Content-Disposition هر بخش را تولید میکند؛ ValidatePdfVT2sStream یک جریان موجود را دوباره تجزیه میکند و انحرافهای ساختاری، شرط چاپ و ICC را بهصورت مجموعهای نوعدار از مسائل گزارش میکند
InspectPdfVT2sStream همان نتیجهٔ سازگاری را بهعلاوهٔ شواهد هر بخش PDF/VT برمیگرداند؛ شامل انطباق PDF/VT، پایهٔ PDF/X، هویت OutputIntent، منشأ پروفایل، MD5 و SHA-256، فرادادهٔ خام 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 استفاده میکند که به یک بخش ICC پیشین حل میشود
| Value | MIME role |
|---|---|
vtckInlinePdf | یک سند PDF/VT بهعنوان بخشی درونخطی از نوع application/pdf؛ دستکم یکی لازم است |
vtckAttachmentPdf | یک بخش محتوای PDF قابل استفادهٔ مجدد که سند درونخطی به آن ارجاع میدهد و بهصورت attachment همراه با نام فایل حمل میشود |
vtckIccProfile | یک بخش پروفایل ICC (application/vnd.iccprofile) که بهصورت پیوست همراه با نام فایل داده میشود |
| Type | Purpose |
|---|---|
TPdfVT2sChunks | آرایهٔ پویای بخشهای MIME مرتب که به BuildPdfVT2sStream داده میشود |
TAnsiStrings | آرایهٔ پویای نام فایل که هنگام اعتبارسنجی ارجاعات فایل بیرونی در PDF درونخطی استفاده میشود |
TPdfVT2sValidationIssues | مجموعهٔ یافتههای TPdfVT2sValidationIssue که اعتبارسنجی برمیگرداند |
TPdfVTPrintingConditionSource | خاستگاه شواهد پروفایل: vtpcsNone وقتی حل نشده، vtpcsEmbeddedProfile برای جریان DestOutputProfile جاسازیشده و vtpcsMimeProfile برای DestOutputProfileRefای که از یک بخش ICC حل شده است |
TPdfVTPrintingConditionEvidence | طبقهبندی هر-بخشی PDF/VT و PDF/X، OutputIntent، منبع پروفایل، هویت، هش، هدر ICC و دادههای DPart |
TPdfVT2sValidationReport | نتیجهٔ تفصیلی که InspectPdfVT2sStream برمیگرداند، بدون تغییر چیدمان نتیجهٔ قدیمی |
| Value | Reported when |
|---|---|
vtmviNotMultipart | جریان یک ظرف MIME چندبخشی نباشد |
vtmviMissingStreamVersion | هدر الزامی PDF/VT StreamVersion غایب باشد |
vtmviStreamVersionValue | مقدار StreamVersion همان 1 مورد انتظار نباشد |
vtmviStreamVersionAfterCt | StreamVersion پس از خط Content-Type بیاید نه پیش از آن |
vtmviMissingBoundary | پارامتر مرز Content-Type غایب باشد |
vtmviNoInlinePdf | هیچ بخش PDF/VT درونخطیای حاضر نباشد |
vtmviInlinePdfNotPdfVT | بخش درونخطی بهعنوان PDF/VT اعلان نشده باشد |
vtmviIccProfileBadDisposition | یک بخش پروفایل ICC پیوست نباشد |
vtmviAttachmentMissingFilename | یک بخش پیوست، نام فایل الزامی را نداشته باشد |
vtmviInlineHasFilename | بخش PDF درونخطی نام فایل حمل کند، که مجاز نیست |
vtmviNodeNameListMismatch | دو فایل PDF/VT در جریان مقادیر NodeNameList متفاوتی افشا کنند |
vtmviRecordLevelMismatch | سطوح رکورد DPart در سراسر ظرف ناسازگار باشند |
vtmviForwardReference | به یک پیوست پیش از ظهورش در جریان ارجاع شود |
vtmviBoundaryInvalidChar | رشتهٔ مرز نویسههایی داشته باشد که RFC 2046 اجازه نمیدهد |
vtmviDuplicateFilename | دو پیوست MIME همان نام فایل حساس به بزرگی حروف را افشا کنند |
vtmviOutputIntentAmbiguous | یک بخش PDF صفر یا چند OutputIntent مرجع 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، اندازهٔ اعلانشده، امضا، جدول تگ یا فضای رنگ فرایندی پشتیبانیشده نامعتبر باشد |
vtmviIccChecksumMismatch | CheckSum رمزگشاییشدهٔ ۱۶ بایتی با MD5 کل فایل ICC تفاوت داشته باشد |
vtmviIccVersionMismatch | چهار بایت اعلانشدهٔ ICCVersion با بایتهای ۸ تا ۱۱ هدر ICC تفاوت داشته باشد |
vtmviIccColorSpaceMismatch | ProfileCS با بایتهای ۱۶ تا ۱۹ هدر ICC تفاوت داشته باشد یا GRAY، RGB یا CMYK نباشد |
vtmviIccProfileNameMismatch | ProfileName با هیچ مقدار locale معتبر profileDescriptionTag مطابق نباشد |
vtmviPrintingConditionUnresolved | OutputIntent مرجع، شناسه یا وابستگی ICC بیرونی قابل حل نباشد |
vtmviPrintingConditionMismatch | بخشهای PDF/VT در OutputConditionIdentifier، حضور یا مقدار RegistryName یا فضای رنگ فرایندی همنظر نباشند |
vtmviIccDeviceClassMismatch | پروفایل مقصد جاسازیشده یا بیرونی، پروفایل دستگاه خروجی از نوع prtr نباشد |
ValidatePdfVT2sStream را روی هر جریانی که BuildPdfVT2sStream تولید میکند در آزمونهای رفتوبرگشت، یا روی ظرفهای PDF/VT-2s تألیفشده از بیرون پیش از پردازش فراخوانی کنیدTPdfVT2sValidationResult.IsCompliant تنها وقتی مجموعهٔ Issues خالی باشد True برمیگرداند
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;