لقد اعتاد ملف PDF الذي يحمل رأس صفحته خلفية متدرجة بأسلوب Word أو Excel، عند عرضه على صورة، أن يعود بمستطيل أبيض فارغ حيث ينبغي أن يكون مزيج الألوان؛ والآن يحترم عارض صفحات HotPDF معامل sh (التظليل) لملفات PDF للتدرجات المحورية من النوع ٢ والدائرية من النوع ٣: حيث يقوم بتقييم دالة التظليل على طول محور التدرج ويرسم المزيج، بينما كانت الإصدارات السابقة تسقط المعامل بصمت وتترك المنطقة بيضاء كالورق؛ وإن نوعي التظليل اللذين يغطيان تدرج كل مستند مكتبي تقريبًا مدعومان، بينما أنواع الشبكات (mesh) ليست كذلك، وهذا المقال صريح بشأن أين يقع هذا الحد
لماذا يعرض تدرج PDF كمربع أبيض؟
التدرج في PDF هو بناء متجه، وليس صورة نقطية يمكن للعارض رسمها؛ ويصف قاموس التظليل (المواصفة ISO 32000-1 الفقرة 8.7.4.5) الهندسة — كمحور أو زوج من الدوائر في مصفوفة Coords — بالإضافة إلى دالة ألوان، ويقوم المعامل sh برسم هذا التظليل عبر منطقة القطع الحالية، وهو نفس نموذج الرسومات الذي يعرضه HotPDF عندما تقوم بـ رسم المسارات والتعبئة على لوحة الصفحة؛ ويمر عارض صفحات HotPDF عبر دفق المحتوى معاملًا تلو الآخر، ويتم تخطي أي معامل ليس له مسار كود بحيث يستمر عرض بقية الصفحة؛ وقبل الإصدار 2.335.0، كان sh يعيش في هذه المجموعة المتخطاة: حيث لم يساهم تدرج الرأس أو تدرج الصفحة الكاملة بشيء في المخرجات، وبذلك ظهرت الخلفية باللون الأبيض؛ ولم يكن الملف تالفًا أبدًا، بل لم يكن لدى العارض ببساطة معالج لهذا المعامل الفردي، والمربع الأبيض هو بالضبط ما يبدو عليه المعالج المفقود
سلسلة تقييم الدالة خلف التظليل
تحمل تظليلات التدرج المحوري من النوع ٢ والدائري من النوع ٣ كلاهما /Function تطابق موضعًا وسيطًا (parametric) على طول التدرج مع لون (المواصفة ISO 32000-1 الفقرة 7.10)، ويقوم مقيم الدالة لـ HotPDF بحل FunctionType وتوزيعه؛ حيث يحسب الاستيفاء الأسي للنوع ٢ (الفقرة 7.10.3) التعبير C0 + t^N * (C1 - C0) مع تحديد Domain و Range؛ وتقرأ الدوال المأخوذة عينات من النوع ٠ (الفقرة 7.10.2) شبكة من عينات ٨ أو ١٦ أو ٣٢ بت وتختار الأقرب من خلال خريطة Encode، وهي الحالة المغطاة بالتفصيل في شرحنا لعمليات البحث عن الألوان المأخوذة عينات من النوع ٠؛ وتختار دوال التجميع للنوع ٣ (الفقرة 7.10.4) دالة فرعية بواسطة مصفوفة Bounds وتتداخل فيها؛ ولا يتم تقييم دوال حاسبة PostScript من النوع ٤ (الفقرة 7.10.5) — بل تتراجع بلطف إلى تقييم فاشل بدلاً من لون خاطئ، متبعة السياسة المتحفظة التي يتخذها HotPDF عبر مسار العرض؛ وتم شحن هذا المقيم في الإصدار 2.334.0، قبل إصدار المعامل نفسه بمرة واحدة، لأن رسام التظليل يعتمد تمامًا على الدالة الموجودة تحته
كيف يحول HotPDF التدرج المستمر إلى بكسلات؟
يقرب HotPDF المزيج المستمر مع تشغيل محدود من أشرطة الألوان المصمتة؛ حيث يمر رسام التظليل عبر محور التدرج، ويقسمه إلى ما يصل إلى ٦٤ شريطًا — أقل عندما يكون المحور قصيرًا ببكسلات الجهاز — ويقيم الدالة عند الموضع الوسيط لكل شريط، ويملأ مستطيلاً عموديًا على المحور بفرشاة مصمتة؛ والمفاضلة هنا هي عدد الأشرطة مقابل النعومة: فالمزيد من الأشرطة يتتبع المزيج عن كثب ولكنه يكلف عمليات تعبئة أكثر، و ٦٤ هو السقف المتعمد؛ ولأن العدد يتناسب أيضًا مع طول المحور ببكسلات الجهاز، فإن الدقة تهم؛ وعرض نفس الصفحة بدقة DPI أعلى يطيل المحور، وبذلك يكتسب التدرج القصير أشرطة وتنعيم أشرطته حتى يتم الوصول إلى سقف ٦٤ شريطًا
// يستخدم مقسم التظليل ما يصل إلى ٦٤ شريط ألوان على طول محور التدرج
// ولكنه لا يتجاوز طول المحور ببكسلات الجهاز. وعرض
// نفس الصفحة بدقة DPI أعلى يطيل ذلك المحور، وبذلك يكتسب التدرج القصير
// أشرطة وينعم التدرج الأشرطي حتى يتم الوصول إلى سقف ٦٤ شريطًا.
Thumb := Pdf.RenderLoadedPageToBitmap(PageIndex, 96); // أشرطة خشنة
Proof := Pdf.RenderLoadedPageToBitmap(PageIndex, 300); // ما يصل إلى ٦٤ شريطًا
عرض صفحة مظللة إلى صورة نقطية
تظل نقطة الدخول العامة دون تغيير: حيث تأخذ RenderLoadedPageToBitmap فهرس صفحة يبدأ من الصفر وقيمة DPI، وترجع صورة نقطية ٢٤ بت مملوكة للمستدعي، وتسلم nil عند الفشل بدلاً من إثارة استثناء، بحيث يكون دعم التظليل شفافًا للكود المكتوب لديك بالفعل؛ والصفحة التي كانت تعرض رأس تدرجها فارغًا ترجع الآن نفس الصورة النقطية مع طلاء المزيج فيها، ولا يلزم أي تغيير في واجهة برمجة التطبيقات للحصول عليها؛ والشيء الوحيد الذي يستحق التذكر هو الملكية: فالمستدعي يقوم بتحرير الصورة النقطية المرتجعة؛ وخط أنابيب العرض الكامل — كمترجم دفق المحتوى، والرموز المدمجة، وتخزين الصفحة المؤقت — مغطى في دليل عرض صفحات PDF إلى صورة نقطية في Delphi
var
Pdf: THotPDF;
Bmp: TBitmap;
begin
Pdf := THotPDF.Create(nil);
try
if Pdf.LoadFromFile('quarterly-report.pdf') > 0 then
begin
// الصفحة ١ (تبدأ من الصفر) بدقة ١٥٠ DPI. رأس الصفحة المليء بالتدرج الذي
// اعتاد أن يعود فارغًا يحمل الآن مزيج ألوانه.
Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
if Assigned(Bmp) then
try
Bmp.SaveToFile('page1.bmp');
finally
Bmp.Free;
end;
end;
finally
Pdf.Free;
end;
end;
وينتج واقي تراجع بسيط من نفس الاستدعاء؛ قم بعرض الصفحة، واختبر بكسلًا حيث ينتمي شريط التدرج، وتأكد من أنه لم يعد أبيضًا كالورق وهو ما اعتاد العارض التراجع إليه — وهو فحص من سطر واحد يكتشف العودة الصامتة إلى السلوك القديم عديم التأثير
Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
if Assigned(Bmp) then
try
// True عندما يرسم معامل sh؛ False إذا تراجعت المنطقة إلى اللون الأبيض.
HeaderPainted := Bmp.Canvas.Pixels[Bmp.Width div 2, 8] <> clWhite;
finally
Bmp.Free;
end;
ما لا يرسمه HotPDF: تظليلات الشبكة وحواف القطع
إن أنواع تظليلات الشبكة الأربعة هي خارج النطاق، ويجب معرفة ذلك عند التعامل مع المستندات؛ حيث لا يتم عرض شبكات مثلث غورو الحرة (النوع ٤)، وشبكات غورو ذات الشكل الشعري (النوع ٥)، وشبكات تصحيح كونز (النوع ٦)، وشبكات تصحيح ناتج الموتر (النوع ٧)، والمحددة عبر المواصفة ISO 32000-1 الفقرات من 8.7.4.5.5 إلى 8.7.4.5.8؛ والصفحة التي تستخدم إحداثيات إحداها لا تزال تُعرض، فقط تُترك تلك المنطقة كما هي؛ وهناك حدان آخران يستحقان الذكر بوضوح: تغطي مستطيلات الأشرطة شريط التظليل بدلاً من أن يتم قطعها بالضبط لتناسب مسار القطع الحالي، لذا فإن التدرج المقنع بشكل دائري أو غير منتظم يرسم كشريطه المحيط حتى يصل قطع المنطقة الدقيق في جولة لاحقة؛ ويفترض HotPDF أيضًا أن مخرجات الدالة هي RGB أو تدرج رمادي، لذا فإن التظليل المكتوب بـ CMYK أو مساحة ألوان غريبة يقرب بدلاً من إدارته بالألوان؛ وبالنسبة للمستندات التي تعالجها معظم فرق Delphi و C++Builder فعليًا — كالتقارير والفواتير والبيانات والعروض التقديمية المصدرة إلى PDF — فإن التدرج المحوري والدائري يغطيان تقريبًا كل تدرج ستصادفه، وتعد تجارب التصميم كثيفة الشبكات هي الحالة التي يجب معاملتها كمعاينة بدلاً من تجربة دقيقة
يتم شحن عارض صفحات HotPDF، ودعم معامل sh الموصوف هنا، ومقيم دوال النوع ٠/٢/٣ الموجود تحته كجزء من مكون HotPDF لـ Delphi و C++Builder — وهي مكتبة VCL أصلية بدون تبعيات DLL خارجية، وتغطي إنشاء وتحرير واستخراج النصوص وعرض صفحات PDF في حزمة واحدة