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 مستقلًا، تعمل هذه الوحدة على تيارات البايتات بحتة ولا تحمّل pdfium.dll أبدًا، فيمكنها العمل في خوادم بلا واجهة وخطوط معالجة دفعية
يجمع 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 MIME سابق
| القيمة | دور MIME |
|---|---|
vtckInlinePdf | مستند PDF/VT يحمل كجزء application/pdf مضمّن؛ ويُشترط واحد على الأقل |
vtckAttachmentPdf | جزء محتوى PDF قابل لإعادة الاستخدام تشير إليه الوثيقة المضمّنة، يحمل كـ attachment مع اسم ملف |
vtckIccProfile | جزء ملف تعريف ICC (application/vnd.iccprofile) يزوَّد كمرفق مع اسم ملف |
| النوع | الغرض |
|---|---|
TPdfVT2sChunks | مصفوفة ديناميكية من قطع MIME مرتبة تزوَّد إلى BuildPdfVT2sStream |
TAnsiStrings | مصفوفة أسماء ملفات ديناميكية تستخدم عند التحقق من مراجع الملفات الخارجية في PDF المضمّن |
TPdfVT2sValidationIssues | مجموعة نتائج TPdfVT2sValidationIssue تعيدها عملية التحقق |
TPdfVTPrintingConditionSource | أصل أدلة ملف التعريف: vtpcsNone عند عدم الحل، و vtpcsEmbeddedProfile لتيار DestOutputProfile مضمّن، و vtpcsMimeProfile لـ DestOutputProfileRef يُحل من جزء ICC MIME |
TPdfVTPrintingConditionEvidence | تصنيف PDF/VT و PDF/X لكل جزء، و OutputIntent، ومصدر ملف التعريف، والهُوية، والملخص، وترويسة ICC، ومعطيات DPart |
TPdfVT2sValidationReport | نتيجة مفصلة يعيدها InspectPdfVT2sStream دون تغيير تخطيط النتيجة القديم |
| القيمة | يُبلَّغ عنها عند |
|---|---|
vtmviNotMultipart | التيار ليس حاوية MIME متعددة الأجزاء |
vtmviMissingStreamVersion | ترويسة StreamVersion الخاصة بـ PDF/VT المطلوبة غائبة |
vtmviStreamVersionValue | قيمة StreamVersion ليست 1 المتوقعة |
vtmviStreamVersionAfterCt | يظهر StreamVersion بعد سطر Content-Type بدلًا من قبله |
vtmviMissingBoundary | معامل boundary في Content-Type مفقود |
vtmviNoInlinePdf | لا يوجد أي جزء PDF/VT مضمّن |
vtmviInlinePdfNotPdfVT | الجزء المضمّن غير معلَن كـ PDF/VT |
vtmviIccProfileBadDisposition | جزء ملف تعريف ICC ليس مرفقًا |
vtmviAttachmentMissingFilename | جزء مرفق ينقصه اسم الملف المطلوب |
vtmviInlineHasFilename | جزء PDF المضمّن يحمل اسم ملف، وهو غير مسموح |
vtmviNodeNameListMismatch | ملفا PDF/VT في التيار يكشفان قيم NodeNameList مختلفة |
vtmviRecordLevelMismatch | مستويات سجلات DPart غير متسقة عبر الحاوية |
vtmviForwardReference | مرفق يُشار إليه قبل ظهوره في التيار |
vtmviBoundaryInvalidChar | سلسلة boundary تحتوي محارف لا يسمح بها 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 بطول 16 بايتًا المفكوك عن MD5 لملف ICC الكامل |
vtmviIccVersionMismatch | تختلف بايتات ICCVersion الأربعة المعلنة عن بايتات ترويسة ICC من 8 إلى 11 |
vtmviIccColorSpaceMismatch | يختلف ProfileCS عن بايتات ترويسة ICC من 16 إلى 19 أو ليس GRAY أو RGB أو CMYK |
vtmviIccProfileNameMismatch | لا يطابق ProfileName أي قيمة locale صالحة في profileDescriptionTag |
vtmviPrintingConditionUnresolved | تعذّر حل OutputIntent المرجعي أو المعرِّف أو تبعية ICC الخارجية |
vtmviPrintingConditionMismatch | تختلف أجزاء PDF/VT في OutputConditionIdentifier أو وجود RegistryName أو قيمته أو فضاء لون العملية |
vtmviIccDeviceClassMismatch | ملف تعريف وجهة مضمّن أو خارجي ليس ملف تعريف جهاز إخراج prtr |
ValidatePdfVT2sStream على أي تيار أنتجه اختبار دورة كاملة لـ BuildPdfVT2sStream، أو على حاويات 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;