تقرأ ConvertPdfDocumentColours مراجعة PDF النشطة، وتحول معاملات المكونات وعينات الصور الأصلية عبر IPdfColourTransform، ثم تضيف مراجعة متسقة إلى تدفق إخراج مستقل
تدعم معاملات ملء وحدود النص والمتجهات في DeviceGray و DeviceRGB و DeviceCMYK و ICCBased، والموارد الموروثة وأسماء فضاءات اللون الافتراضية و Form XObjects المتداخلة والصور الخام أو ذات المرشحات العامة بمكونات 8-bit أو 16-bit
تشارك مصفوفات المحتوى محلل معاملات ومكدس حالة رسومية واحدًا مع مسافة بين التدفقات؛ تبقى q/Q وافتراضات اللون وأعداد المكونات مرتبطة بفضاء المصدر الأصلي طوال التحويل
تأتي معاملات CMYK من محتوى PDF وتدفقات الصور، لا من getters RGB بعد التصيير؛ وفّر DeviceCMYKProfile لمصدر DeviceCMYK بلا ملف لوني
تُحل ملفات ICCBased في نطاق مواردها الأصلي؛ يُقبل فقط غياب /Range [0 1 ...] أو قيمته الافتراضية، وتُطبق مصفوفات /Decode قبل التحويل ثم تُحذف من الصورة الناتجة
تحتفظ عينات 16-bit بترتيب PDF big-endian؛ تُفحص هندسة البايتات الدقيقة وتوسع الهدف قبل تخصيص العينات، دون اختراع stride أو padding
تكون PreserveAllSpotColours true افتراضيًا؛ وإلا املأ PreservedSpotColours بأسماء colorants PDF المفكوكة؛ لا يُحفظ Separation أو DeviceN إلا إذا اختيرت جميع colorants المسردة
تبقى معاملات الألوان الموضعية المحفوظة ودوال tint ومواردها سليمة؛ تحتاج الألوان غير المختارة إلى backend مخصص وتُبلغ غير مدعومة
تبقى أقنعة stencil وبيانات الأقنعة المرجعية سليمة؛ تحتاج أقنعة color-key والأقنعة الصريحة ومكونات matte للأقنعة الناعمة إلى سياسات منفصلة
يشمل غير المدعوم DCT/JPX دون فك المكونات الأصلية، وصور 1/2/4-bit وحشو صفوفها، ونطاقات ICC غير الافتراضية، و Indexed/Cal/Lab/Pattern، والصور inline، ودوال shading، وبرامج glyphs Type3، وألوان قواميس التعليقات و DA للنماذج، وألوان XFA، ومجموعات الشفافية و blend غير الطبيعي و overprint ودوال نقل الرسوم أو rendering intents
يجب أن يحدد Form ذو الموارد الخاصة فضاء لونه قبل معاملات sc/scn المجردة؛ تُرفض Forms أو الصور المشتركة ذات سياقات المصدر الموروثة المختلفة، وينتقل الفشل المخزن إلى كل نطاق يستدعيها
تكون FailOnUnsupported true افتراضيًا وتحفظ الوجهة عند الفشل؛ تسمح false بالتغييرات المدعومة المستقلة، وتضع Complete على false ولا تكتب OutputIntent جديدًا للتحويل الجزئي
قد يحتفظ الناتج الجزئي بـ OutputIntent المصدر؛ تشير OutputIntentWritten تحديدًا إلى تثبيت إعلان هدف جديد خلال هذه العملية
تضمّن النتيجة الكاملة ملف ICC الهدف وتكتب OutputIntent بالمعرف المطلوب؛ لا يثبت ذلك مطابقة PDF/X أو PDF/A أو أي معيار آخر
يجب اختلاف تدفقي المصدر والوجهة؛ تُستعاد موضعية المصدر، ويترك فشل التحضير الوجهة سليمة، ويحتفظ الإلغاء بـ EPdfOperationCancelled
تستبدل مرحلة النشر الوجهة عبر API تدفقها؛ قد يترك استثناء أثناء التقليص أو الكتابة نتيجة جزئية؛ للنشر الذري في ملف، اكتب مؤقتًا ثم أعد التسمية بعد النجاح
تحتاج التشفيرات والتوقيعات إلى مصدر غير مشفر وغير موقع مجهز بصورة مستقلة؛ لا يحفظ التحويل اللوني التزايدي صلاحية التوقيع
الافتراضات 64 MiB لكل تدفق محتوى/صورة مفكوك و 512 MiB للتحضير و 10,000 بلاغ مشكلة وعمق 64، إضافة إلى ميزانيات قارئ الكائنات النشطة
تحسب ميزانية الإخراج تحفظيًا بايتات المصدر وكائنات الاستبدال المجهزة وحجز xref/trailer قبل تجميع التحديثات؛ تُحسب طول trailer بالكامل قبل التسلسل، ويرفض التدفق المحدود الكتابة فوق السقف قبل نمو حجمه المنطقي
يحد ذلك تحضير الإخراج المنطقي لا ذاكرة العملية كلها أو تقريب سعة allocator؛ يُعاد فحص الحجم المسلسل النهائي قبل النشر
تم التحقق باستخدام Delphi و FPC على Win32 و Win64 من تحويل صور RGB و CMYK و ICCBased الفعلية والنص والمتجهات و Forms المتداخلة وحفظ Separation و DeviceN و OutputIntent وتدفقات الكائنات المضغوطة وحفظ PDF وإعادة فتحه وتصييره
ProviderOptions := TPdfLittleCmsOptions.Default; Provider := CreatePdfLittleCmsColourTransform(LibraryPath, ProviderOptions); Options := TPdfDocumentColourOptions.Default; Options.DeviceCMYKProfile := SourceCmykProfile; TargetProfile := CreatePdfLittleCmsGrayProfile(LibraryPath); if not ConvertPdfDocumentColours(Source, Destination, pcsDeviceGray, TargetProfile, Provider, Options, Report, CancellationToken) then raise Exception.Create(Report.ErrorText);
type
TPdfSpotColourNames = array of AnsiString;
TPdfDocumentColourOptions = record
ReadOptions: TPdfActiveObjectReadOptions;
MaxDecodedStreamBytes: Integer;
MaxOutputBytes: Int64;
MaxIssues: Integer;
MaxDepth: Integer;
FailOnUnsupported: Boolean;
PreserveAllSpotColours: Boolean;
PreservedSpotColours: TPdfSpotColourNames;
DeviceGrayProfile, DeviceRGBProfile, DeviceCMYKProfile: TBytes;
OutputIntentIdentifier: string;
class function Default: TPdfDocumentColourOptions; static;
end;
TPdfDocumentColourIssue = record
ObjectNumber: Integer;
Reason: string;
end;
TPdfDocumentColourIssues = array of TPdfDocumentColourIssue;
TPdfDocumentColourReport = record
Succeeded: Boolean;
Complete: Boolean;
ContentStreamsConverted, FormsConverted, ImagesConverted: Integer;
ColourOperatorsConverted, PreservedSpotSelections, PreservedMasks: Integer;
UnsupportedCount: Integer;
OutputIntentWritten: Boolean;
Issues: TPdfDocumentColourIssues;
ErrorText: string;
end;
function ConvertPdfDocumentColours(Source, Destination: TStream;
TargetSpace: TPdfColourSpace; const TargetProfile: TBytes;
Transform: IPdfColourTransform; const Options: TPdfDocumentColourOptions;
out Report: TPdfDocumentColourReport;
CancellationToken: IPdfCancellationToken = nil): Boolean;