ما تراكب PDF (Overlay)؟ تدفق المحتوى ومنطق الطبقات
6 دقيقة للقراءة
ماذا يحدث داخل الملف حين تراكب ملف PDF فوق آخر؟ لا تُلصق صفحتان إحداهما فوق الأخرى، لأن الصفحة في PDF ليست صورة بل تدفق مؤلف من أوامر رسم. نشرح في هذا المقال كيف تتدخل عملية التراكب في هذا التدفق، وما فائدة كائنات XObject form، ولماذا يحدد ترتيب الرسم كل شيء.
محتوى الصفحة: تدفق رسم مرتب
لكل صفحة PDF تدفق محتوى (content stream). وهذا التدفق قائمة مرتبة بالأوامر التي تصف كيفية رسم الصفحة:
q % save graphics state
1 0 0 RG % set stroke color to red
50 700 200 100 re % define rectangle
f % fill
Q % restore graphics state
BT % begin text block
/F1 12 Tf % select font F1 at 12 pt
72 650 Td % move to position
(Hello) Tj % draw text
ET % end text block
والخاصية الحاسمة: تُطبَّق الأوامر بالترتيب ويأتي الرسم اللاحق فوق السابق. كأنك تضع طلاءً على لوحة — فما وضعته أولاً يُغطّى.
وهذه الحقيقة وحدها تفسّر منطق التراكب كله.
كيف يُضاف التراكب إلى التدفق
تضيف عملية التراكب محتوى صفحة ملف التراكب إلى تدفق صفحة المستند الأساسي. ويُختار أحد موضعين:
المقدمة (overlay): تُضاف أوامر التراكب إلى نهاية التدفق. ولأنها تُرسَم لاحقاً تأتي فوق المحتوى الأساسي.
الخلفية (underlay): تُضاف أوامر التراكب إلى بداية التدفق. ولأنها تُرسَم أولاً يأتي المحتوى الأساسي فوقها.
بهذه البساطة. ومفهوم «الطبقة» هنا مجازي — إذ لا تنشأ في الملف طبقة قابلة للتشغيل والإيقاف، بل يتغير ترتيب الأوامر فحسب.
لكن ثمة تفصيلة تقنية ينبغي الانتباه إليها: تسرّب حالة الرسوميات. فإن غيّر تدفق التراكب لوناً أو مصفوفة تحويل وانتهى دون إعادتها، رُسم المحتوى الأساسي التالي بتلك الإعدادات وفسد المستند. ولذلك تغلّف التطبيقات السليمة تدفق التراكب بالأمرين q (حفظ) وQ (استعادة). فإن رأيت في مستندك بعد التراكب تغيرات لونية أو انزياحات غير متوقعة فالسبب هذا عادةً.
XObject form: البنية التي تحل مشكلة التكرار
تخيّل أنك تراكب ترويسة على مستند من 80 صفحة. ومن الممكن نسخ أوامر الترويسة إلى تدفق كل صفحة من الثمانين على حدة لكنه إهدار — خصوصاً إن كان في الترويسة شعار متجهي معقد أو صورة مضمّنة.
والحل هو كائن XObject form. فالـ Form XObject أشبه بـ«كتلة رسم قابلة لإعادة الاستخدام»: كائن مستقل له تدفق محتواه وموارده الخاصة. وتستدعيه الصفحة بأمر واحد:
q
1 0 0 1 0 0 cm % transformation matrix (position/scale)
/Header Do % draw the Header form
Q
فتحوّل أداة التراكب صفحة ملف التراكب إلى form XObject وتضعه في الملف مرة واحدة. ثم تضيف إلى كل صفحة ذلك الاستدعاء المؤلف من سطرين فقط.
والنتيجة العملية: أن الزيادة في حجم الملف مستقلة عن عدد الصفحات. فسواء راكبت على 10 صفحات أو 500، تُخزَّن بيانات الترويسة مرة واحدة. والزيادة تأتي من موارد ملف التراكب نفسه — الخط المضمّن، وصورة الشعار.
مصفوفة التحويل: كيف يتم التموضع
يحدد الأمر cm في استدعاء النموذج مصفوفة تحويل. وتتألف هذه المصفوفة من ستة أعداد وتعرّف التحجيم والإزاحة والدوران معاً:
a b c d e f cm
ويُستخدم في الحالة البسيطة 1 0 0 1 0 0 — أي بلا أي تحويل، فيُرسَم النموذج بإحداثياته الخاصة. وإن أردت إزاحة التراكب 20 وحدة يميناً و30 وحدة أعلى كُتب 1 0 0 1 20 30. ولرسمه بنصف المقياس 0.5 0 0 0.5 0 0.
ونقطة الأصل في نظام إحداثيات PDF هي الزاوية السفلية اليسرى للصفحة ويتزايد المحور y إلى أعلى. وهذا عكس إحداثيات الشاشة (أصلها أعلى اليسار وy يتزايد إلى أسفل) وهو مصدر شائع للالتباس في محاذاة التراكب.
وتظهر المشكلة هنا إن اختلفت مقاسات الصفحات. فإن كان المستند الأساسي A4 (595 × 842 نقطة) والتراكب Letter (612 × 792 نقطة) وكانت مصفوفة التحويل مصفوفة الوحدة، حوذي التراكب من الزاوية السفلية اليسرى. والنتيجة: يبقى الجزء العلوي من التراكب أخفض بـ 50 نقطة ويفيض جانبه الأيمن 17 نقطة. ولذلك فإعداد ملف التراكب بالمقاس الهدف أوثق بكثير من محاولة المحاذاة لاحقاً.
تعارض الموارد وحلّه
قد يمتلك ملف التراكب والمستند الأساسي موارد مختلفة تستخدم الأسماء الداخلية نفسها. فقد يوجد في كليهما خط باسم /F1 وصورة باسم /Im1 — لكنها خطوط مختلفة وصور مختلفة.
ويضطر الأداة إلى حل ذلك أثناء الدمج. والنهج المعياري: إعادة تسمية الأسماء المتعارضة عند نسخ موارد ملف التراكب إلى المستند الأساسي (مثل /F1 ← /Ov_F1) وتحديث المراجع داخل الـ form XObject تبعاً لذلك.
ولهذا أثر جانبي: قد يوجد الخط نفسه مرتين في الملف. فإن كان Arial مضمّناً في المستند الأساسي ومضمّناً في ملف التراكب أيضاً، بقيا ككائنين منفصلين. ويزيد حجم الملف قليلاً. وتمريره عبر أداة ضغط بعد التراكب ينظّف هذا النوع من التكرارات عادةً.
الشفافية: لماذا لا يمكن إضافتها لاحقاً
حين تضع التراكب في المقدمة ويكون محتواه معتماً، غطّى كل ما تحته. وإن أردت أثراً شبيهاً بالعلامة المائية لزمت الشفافية.
وتُعرَّف الشفافية في PDF بقاموس ExtGState (حالة الرسوميات الموسّعة). فيُضبَط ما يلي قبل أمر الرسم:
/GS1 gs % apply graphics state GS1
ويوجد في قاموس GS1 قيم مثل /ca 0.3 (شفافية التعبئة) أو /CA 0.3 (شفافية الخط).
وتنقل أدوات التراكب عادةً محتوى ملف التراكب كما هو ولا تتدخل في هذه الإعدادات. ولذلك ينبغي ضبط الشفافية عند إنتاج ملف PDF الخاص بالتراكب — فاخفض عتامة العنصر في برنامج التصميم وصدّره إلى PDF على هذا النحو.
كما توضَع المحتويات التي تستخدم الشفافية عادةً داخل مجموعة شفافية. وهذا يضمن إجراء حسابات المزج بصورة صحيحة لكنه قد يُعالَج معالجة مختلفة في بعض العارضات القديمة وبعض مشغّلات الطابعات. وفي أعمال الطباعة الحساسة ينبغي اختبار المخرجات على طابعة حقيقية بعد التراكب.
هل يبقى نصاً؟
نعم. فعملية التراكب لا تحوّل النص إلى صورة؛ وإن كان النص في ملف التراكب نصاً حقيقياً بقي قابلاً للتحديد والبحث في الملف المدموج أيضاً.
ولهذا وجهان:
فائدته: أن اسم المؤسسة في الترويسة يظهر في نتائج البحث، ويمكن نسخ التاريخ في الختم، وتستطيع أنظمة معالجة المستندات قراءة هذه المعلومات.
وما ينبغي الانتباه إليه: أن التراكب ليس أداة إخفاء. فإن غطيت معلومة في المستند الأساسي بالتراكب، بقيت تلك المعلومة في الملف وظهرت بعمليات تحديد النص أو استخراجه. ويلزم التنقيح لإزالة المعلومات السرية — فتلك العملية تحذف المحتوى من الملف فعلياً.
الطبقات الحقيقية: مجموعات المحتوى الاختياري
توجد في PDF طبقات حقيقية قابلة للتشغيل والإيقاف أيضاً: مجموعات المحتوى الاختياري (OCG - Optional Content Groups). وتُستخدم في الرسوم التقنية والخرائط؛ إذ تستطيع تشغيل الطبقات وإيقافها من لوحة في العارض.
ولا تستخدم أدوات التراكب ذلك عادةً — بل تضبط ترتيب الرسم فحسب. أي أنك لا تستطيع إيقاف الترويسة المتراكبة لاحقاً في العارض؛ فقد صارت جزءاً دائماً من تدفق المحتوى.
وإن أردت طبقة قابلة للفصل فستحتاج إلى أدوات مخصصة تضيف التراكب كمجموعة OCG. وقد يكون هذا مفيداً في التعليمات المؤقتة مثل ختم المسودة لكنه نادراً ما يلزم في الاستخدام اليومي.
الخلاصة
التراكب ليس إلا إضافة أوامر رسم جديدة إلى تدفق محتوى صفحة PDF — فإن أُضيفت إلى نهاية التدفق ظهرت في الأعلى، وإن أُضيفت إلى بدايته ظهرت في الأسفل. وتُخزَّن التراكبات المتكررة مرة واحدة ككائن XObject form وتشير إليه كل صفحة، ولذلك يزيد حجم الملف بمقدار مستقل عن عدد الصفحات. ويتم التموضع بمصفوفة تحويل تتخذ الزاوية السفلية اليسرى للصفحة مرجعاً؛ ولذلك يُحدث عدم توافق المقاسات انزياحاً. والشفافية معرَّفة في قاموس حالة الرسوميات ولا يمكن إضافتها أثناء التراكب، بل ينبغي أن تكون جاهزة في ملف التراكب. ويبقى النص المتراكب نصاً حقيقياً — وهذا سلوك مفيد وينبغي الانتباه إليه من زاوية الخصوصية في آن.
الأسئلة الشائعة
هل توجد «طبقات» بالمعنى الحقيقي في PDF؟
يوجد شيئان مختلفان. أحدهما مجموعات المحتوى الاختياري (OCG) — وهي طبقات حقيقية يستطيع المستخدم تشغيلها وإيقافها، وتُستخدم في الرسوم التقنية. والآخر ترتيب الرسم: فما يُرسَم لاحقاً في تدفق المحتوى يأتي فوق ما رُسم قبله. وتستخدم عملية التراكب الثاني عادةً؛ فهي لا تنشئ طبقة منفصلة قابلة للتشغيل والإيقاف بل ترتّب أوامر الرسم بالترتيب الصحيح فحسب.
لماذا لا يزيد حجم الملف كثيراً بعد التراكب؟
لأن محتوى التراكب يوضَع في الملف مرة واحدة ككائن XObject form وتشير إليه كل صفحة. فحين تراكب شعاراً على مستند من 200 صفحة يُخزَّن الشعار مرة واحدة لا 200 مرة. والزيادة تأتي أساساً من موارد ملف التراكب نفسه (الخط، والصورة) وهي مستقلة عن عدد الصفحات.
هل يحدث تعارض إن وُجد الخط نفسه في الملفين؟
لا يحدث، لأن أرقام الكائنات يُعاد إسنادها أثناء الدمج وتُعاد تسمية أسماء الموارد عند اللزوم. فإن كان الملفان يستخدمان خطين مختلفين باسم /F1، فصلت الأداة بينهما بأسماء لا تتعارض. وقد توجد في الملف نتيجةً لذلك نسختان من الخط نفسه — وهذا يزيد حجم الملف قليلاً لكنه لا يسبب مشكلة بصرية.
هل يبقى المحتوى المتراكب قابلاً للتحديد كنص؟
نعم، فإن كان النص في ملف التراكب نصاً حقيقياً بقي قابلاً للتحديد والبحث. فعملية التراكب لا تحوّل النص إلى صورة. وهذا يعني ظهور ختم أو معلومات ترويسة في نتائج البحث — وهو أمر مطلوب عادةً، لكنه سلوك ينبغي أن تنتبه إليه من زاوية الخصوصية.
جرّب ذلك الآن باستخدام PDF Bindirme (Overlay).
جرّب PDF Bindirme (Overlay)