كيف يعمل استخراج صفحات PDF؟ شجرة الكائنات والموارد المشتركة
6 دقيقة للقراءة
ماذا يحدث في الخلفية حين تستخرج ثلاث صفحات من ملف PDF؟ لا تُقصّ الصفحات وتُلصَق، لأن «الصفحة» في PDF ليست شيئاً واحداً متماسكاً. ننظر في هذا المقال إلى البنية الداخلية للصيغة ونشرح لماذا عملية الاستخراج بهذه السرعة، ولماذا يبقى الملف المستخرَج كبيراً بصورة غير متوقعة أحياناً، ولماذا يحدث شيء ما للإشارات المرجعية والروابط.
داخل PDF: كائنات ومراجع
ملف PDF مجموعة من الكائنات المرقّمة. ولكل كائن رقم وتشير الكائنات بعضها إلى بعض بالأرقام. ويوجد فيه تقريباً ما يلي:
- الكاتالوج: الكائن الجذر للمستند. ويقول «شجرة الصفحات في هذا الكائن، والمخطط التفصيلي في ذاك».
- شجرة الصفحات: بنية شجرية تحفظ الصفحات مرتبةً.
- كائنات الصفحات: يمثّل كل منها ورقة. ولا تحمل في داخلها محتوى بل مراجع: «محتواي في هذا الكائن، وموارديّ في ذاك، ومقاسي كذا».
- تدفق المحتوى (content stream): سلسلة الأوامر التي تصف كيفية رسم الصفحة.
- كائنات الموارد: الخطوط، والصور، وملفات الألوان، ومجموعات الشفافية.
والنقطة الحاسمة: كائن الصفحة لا يحتضن المحتوى بل يشير إليه. وقد تشير عدة صفحات إلى المورد نفسه. فالخط المضمّن المستخدم في المستند كائن واحد؛ وتشير إليه الصفحات الـ 300 كلها. وإن كان شعار مؤسسي أعلى كل صفحة، وُجد في الملف كائن صورة واحد ونظرت إليه الصفحات الـ 300.
وهذه المشاركة هي الآلية الأساسية التي تُبقي ملفات PDF بحجم معقول — وهي أيضاً، كما سنرى بعد قليل، سبب مفاجآت الحجم بعد الاستخراج.
ما تفعله عملية الاستخراج خطوة خطوة
حين تقول «استخرج الصفحات 10–12» تفعل الأداة ما يلي:
1. تتجول في شجرة الصفحات وتجد كائنات الصفحات عند الفهارس المطلوبة.
2. تتعقّب التبعيات. فتنطلق من كل كائن صفحة محدَّدة وتتبع كل ما يرتبط به: تدفق المحتوى، والخطوط التي يستخدمها ذلك التدفق، والصور، وفضاءات الألوان، والتعليقات (annotation)، وحقول النماذج. وهذا أشبه بمسح إمكان الوصول في مخطط — إذ تنطلق من الجذر وتعلّم كل العقد التي يمكن بلوغها.
3. تنسخ الكائنات القابلة للوصول إلى ملف جديد. ويُعاد إسناد أرقام الكائنات أثناء النسخ، لأن الترقيم يبدأ من الصفر في الملف الجديد. وتُحدَّث المراجع تبعاً لذلك.
4. تبني كاتالوجاً وشجرة صفحات جديدين. وفي شجرة الصفحات الجديدة ثلاث صفحات فقط مرتبة بالتسلسل.
5. تعيد كتابة جدول الإحالات المتقاطعة (xref). وهذا الجدول يقول عند أي بايت من الملف يبدأ كل كائن؛ ويمنع اضطرار العارض إلى مسح الملف كله للعثور على كائن.
ولا معالجة صور في أي من هذه الخطوات. فلا يُعاد ترميز أي JPEG، ولا يُعاد رسم أي نص. والعملية في جوهرها نسخ وإعادة ترقيم — ولذلك هي سريعة جداً وفقد الجودة فيها صفر قطعاً.
تفسير مفاجأة الحجم
ولنصل الآن إلى أكثر سؤال يُطرَح: استخرجت صفحتين من ملف من 300 صفحة وبحجم 40 ميجابايت وكانت النتيجة 4 ميجابايت. لماذا؟
الجواب في الخطوة الثانية: تعقّب التبعيات. فإن كانت الصفحة التي استخرجتها تستخدم الخط المضمّن المستخدم في المستند، وجب نسخ كائن ذلك الخط إلى الملف الجديد. وعائلة خط كاملة (عادي، وعريض، ومائل، وعريض-مائل) تشغل 2–3 ميجابايت بسهولة. وإن وُجدت صورة بملء الصفحة عليها نُقلت كما هي.
| نوع المورد | أثره في الملف المستخرَج | |---|---| | خط مضمّن (كامل) | يُنقَل كله، وقد يبلغ ميجابايتات | | خط مضمّن (مجموعة جزئية) | تُنقَل المجموعة الجزئية، وهي أصغر | | صور الصفحة | تُنقَل كما هي، ولا تتغير الجودة | | ملف ألوان ICC | يُنقَل، بضع مئات الكيلوبايتات | | الموارد غير المستخدمة | لا تُنقَل، بل تُسقَط |
وتمضي بعض الأدوات خطوة أبعد فتعيد «تجزئة» الخط المضمّن — أي تُبقي الحروف الواردة في الصفحات المستخرجة فقط. وهذا يحقق تصغيراً جاداً لكنه عملية أثقل ولا تفعله كل أداة.
وإن كان الحجم حاسماً لك فالحل العملي بسيط: مرّر الملف بعد الاستخراج عبر أداة ضغط مرة واحدة. فالضغط يُسقط الموارد غير المستخدمة، ويعيد ترميز الصور، ويعيد ضغط التدفقات.
ماذا يحدث للإشارات المرجعية والروابط
تعيش شجرة المخطط التفصيلي (outline) للمستند على مستوى الكاتالوج ويشير كل مدخل فيها إلى هدف: «الفصل 3 ← كائن الصفحة 147».
وحين تستخرج 3 صفحات تصير كل مداخل هذه الشجرة تقريباً مشيرةً إلى صفحات لم تعد في الملف. والإشارة المرجعية ذات الهدف المكسور لا تفعل شيئاً عند النقر أو تجعل العارض يعطي خطأً. وتحاول بعض الأدوات ترشيح المداخل الباقية ونقلها؛ والنتيجة عادةً شجرة مؤلفة من عنوانين تراتبها منقطع وتخلق ارتباكاً أكثر مما تنفع. ولذلك تفضّل تطبيقات كثيرة إسقاط المخطط التفصيلي كله.
والمنطق نفسه يسري على الروابط الداخلية. فإن لم يُستخرَج هدف رابط مثل «انظر الملحق ب» انكسر الرابط. في المقابل تواصل الروابط الخارجية (إجراءات URI المؤدية إلى عنوان ويب) العمل بلا مشكلة لأنها لا ترتبط بأي صفحة.
وحقول النماذج في وضع وسيط طريف. فالحقل نفسه تعليق مرتبط بالصفحة، ومن ثم يُنقَل. لكن قاموس حقول النموذج (AcroForm) على مستوى المستند وقد يحتوي منطق حساب أو تحقق بين الحقول. فحين تستخرج جزءاً من نموذج متعدد الصفحات تظهر الحقول لكن قد يكون المنطق منقطعاً.
معضلة رقم الصفحة
يبدأ عدّاد الصفحات في الملف الذي استخرجته من 1 — وهذا يأتي من الترتيب في شجرة الصفحات. لكن الرقم «47» المطبوع على الصفحة جزء من تدفق المحتوى: فهو أمر رسم نص. ولأن عملية الاستخراج لا تمسّ تدفق المحتوى يبقى ذلك الرقم كما هو.
أي أنه قد يكون مكتوباً «47» أسفل الورقة الأولى من ملفك الجديد. وهذا ليس خطأً بل نتيجة طبيعية للصيغة. وإن أردت تصحيحه فأمامك طريقان: طباعة ترقيم جديد (فيظهر إلى جانب الرقم القديم) أو تغطية القديم بمربع أبيض بأداة تحرير وإضافة رقم جديد.
كما توجد في بعض ملفات PDF تعريفات تسميات الصفحات (page label) — وهي بنية على مستوى المستند تجعل العارض يعرض تسميات خاصة مثل "iv" أو "A-3" في صندوق الصفحة. وهذه لا تُنقَل عادةً أثناء الاستخراج.
لماذا يمكن إجراؤه في المتصفح
لا تتضمن أي من الخطوات أعلاه حسابات ثقيلة. فقراءة الكائنات، وتعقّب التبعيات، وإعادة الترقيم والكتابة — كلها عمليات ذاكرة وملفات. ويفعل متصفح حديث ذلك بسرعة حتى في ملفات من بضع مئات الصفحات.
والنتيجة العملية: أن ملفك لا يذهب إلى أي خادم. فإن كنت تستخرج صفحات التوقيع من عقد سرّي أو تفصل ورقة معنية من تقرير طبي، فالمستند لا يفارق جهازك إطلاقاً. كما أن العملية سريعة بمعزل عن حجم الملف لأنه لا انتظار للرفع والتنزيل.
والحدّ هو الذاكرة المتاحة للسان المتصفح. فقد يحدث ضغط على الذاكرة في الملفات الضخمة جداً (مئات الميجابايتات، وآلاف الصفحات عالية الدقة)؛ وفي هذه الحالة يريح العملَ تقسيمُ الملف تقسيماً خشناً أولاً ثم الاستخراج.
الخلاصة
استخراج الصفحات هو إجراء مسح إمكان وصول في مخطط كائنات PDF ونسخ كل ما يرتبط بالصفحات المحددة إلى ملف جديد. ولأنه لا يُعاد ترميز أي محتوى فإن فقد الجودة صفر والعملية سريعة جداً. في المقابل قد تبقى المخرجات كبيرة بلا تناسب لأن الموارد المشتركة (وخصوصاً الخطوط المضمّنة) يجب نقلها؛ والضغط يحل ذلك. أما الإشارات المرجعية والروابط الداخلية وتسميات الصفحات التي تعيش على مستوى المستند فلا تنجو من هذه العملية بطبيعتها — لأن أهدافها لم تعد في الملف.
الأسئلة الشائعة
هل تنخفض جودة الصور عند استخراج الصفحات؟
لا، لا تنخفض إطلاقاً. فعملية الاستخراج لا تعيد ترميز الصور؛ بل تنسخ تدفق محتوى الصفحة والكائنات المرتبطة به إلى الملف الجديد كما هي. فتبقى صورة JPEG على حالها، ويبقى النص متجهياً. وهذا فرقها الجوهري عن عملية الضغط — إذ قد تُعاد ترميز الصور في الضغط وتنخفض الجودة.
لماذا تشغل صفحتان استخرجتهما من ملف من 300 صفحة حجم 4 ميجابايت؟
لأن هاتين الصفحتين قد تكونان مرتبطتين بموارد مشتركة على مستوى المستند. فعائلة خط مضمّنة قد تشغل وحدها عدة ميجابايتات، وينبغي نقلها إلى الملف الجديد ما دام ذلك الخط مستخدماً في الصفحة. والأمر نفسه ينطبق على ملفات الألوان والصور عالية الدقة الموضوعة في الصفحة. وأداة الضغط تفيد عادةً في هذه الحالة.
هل عدم نقل الإشارات المرجعية نقص أم ضرورة تقنية؟
خليط منهما. فالإشارات المرجعية محفوظة في شجرة مخطط تفصيلي (outline) على مستوى المستند ويشير كل مدخل فيها إلى صفحة. ولأن معظم تلك الصفحات غير موجود في المجموعة الجزئية التي استخرجتها، يشير الجزء الأكبر من المداخل إلى أهداف مكسورة. وتحاول بعض الأدوات نقل المداخل الباقية، لكن النتيجة ناقصة ومربكة عادةً فتفضّل تطبيقات كثيرة إسقاط المخطط التفصيلي كله.
كيف يمكن إجراء الاستخراج في المتصفح، ألا يلزم خادم؟
لا يلزم، لأن العملية خفيفة حسابياً. فما يُفعَل ليس إلا قراءة الكائنات وكتابتها في ملف جديد وإعادة ترقيم المراجع؛ ولا معالجة صور ولا إعادة ترميز. وتفعل المتصفحات الحديثة ذلك بارتياح حتى في ملفات من بضع مئات الصفحات، ولا يغادر الملف الجهاز إطلاقاً.
جرّب ذلك الآن باستخدام Sayfa Çıkar.
جرّب Sayfa Çıkar