تخطَّ إلى المحتوى
getnextpdf.com

العرض السريع للويب: كيف يُفتَح ملف PDF قبل اكتمال تنزيله

Spec: ISO 32000-2, Annex F

يُعاد تنظيم ملف ⁨PDF⁩ المُخطَّط خطياً بحيث تستقر الصفحة الأولى وفهرس تنقّل صغير في مقدمة الملف تماماً. وبذلك يستطيع العارض رسم الصفحة الأولى بينما لا تزال بقية المستند في طريقها إليه، والقفز مباشرةً إلى الصفحة 147 دون قراءة الصفحات من 2 إلى 146 أولاً.

هذه هي الميزة التي يعرفها معظم القرّاء باسمها الودود: العرض السريع للويب.

تخيّل تقريراً من 200 صفحة على هاتف بإشارة شريط واحد. بدون التخطيط الخطي، كثيراً ما يحتاج العارض إلى نهاية الملف ذاتها قبل أن يتمكن من رسم أي شيء، لأن الفهرس الرئيسي الذي يحدد موضع كل كائن يستقر تقليدياً في النهاية. فتراقب مؤشر الدوران بينما تُنزَّل مئتا صفحة، لمجرد قراءة الصفحة الأولى.

مع التخطيط الخطي، يُرتَّب الملف بحيث تكون الإجابة عن سؤال “ماذا يوجد في الصفحة الأولى” أول ما يصل عبر الشبكة. يرسم القارئ الصفحة الأولى في ثانية، ولا يجلب البقية إلا أثناء التمرير أو القفز. على اتصال سريع قد لا تلاحظ ذلك أبداً. أما على اتصال بطيء أو محدود التكلفة، فهو الفرق بين مستند قابل للاستخدام وعلامة تبويب مهجورة.

  • يكون الملف المُخطَّط خطياً محمَّلاً في المقدمة: تُوضَع الصفحة الأولى وجدول تلميح أولاً، قبل بقية الجسم.
  • جدول التلميح خريطة من النطاقات. يخبر العارض بنطاقات البايتات التي تعود إلى كل صفحة وإلى الكائنات المشتركة، كي يستطيع العارض أن يطلب من الخادم تلك الشرائح فقط — ثم يحلّ قسم المراجع التقاطعية كل رقم كائن إلى إزاحته الدقيقة.
  • يعتمد ذلك على طلبات نطاق البايتات — جلب العارض لشرائح من الملف عند الطلب، لا الملف بأكمله.
  • البايتات محتوى مطابق لملف ⁨PDF⁩ عادي. يغيّر التخطيط الخطي الترتيب والفهرس، لا الصفحات نفسها.
  • إنها خطوة صريحة واحدة قابلة للتبديل في ⁨NextPDF⁩ — تُنتَج عبر إعادة بناء فعلية من ثلاثة تمريرات، لا عَلَماً يأمل خيراً.

لا يمكنك تحميل صفحة في المقدمة قبل أن تعرف حجم كل شيء بدقة، لأن جدول التلميح يسجّل إزاحات البايتات، والإزاحة لا تكون صحيحة إلا بعد أن يصبح طول كل كائن نهائياً. تلك الدائرية — الإزاحات تعتمد على الأحجام، والأحجام تعتمد على التخطيط — هي سبب تشغيل أداة التخطيط الخطي عبر تمريرات بدلاً من مرور واحد.

يحلّ ⁨NextPDF⁩ ذلك بإعادة بناء حتمية من ثلاثة تمريرات. يقيس التمرير الأول، ويقرر الثاني موضع الوضع، ويكتب الثالث البايتات الحقيقية مع الإزاحات المعروفة الآن مدمجةً فيها.

  1. MEASURESerialise every object once to learn its exact byte length. Offsets are circular — they depend on sizes — so sizes are pinned first.
  2. PLACEDecide the order: first page and its dependencies up front, then the rest. Reserve space for the linearization parameter dictionary and the hint table.
  3. FILLWrite the final bytes. Each reserved field is filled with values computed after MEASURE and PLACE — the first-page length, the hint-table location, the main cross-reference offset — derived from the measured sizes and the chosen placement.
إعادة بناء التخطيط الخطي عبر ثلاثة تمريرات. يقيس MEASURE حجم كل كائن لتصبح الأطوال نهائية؛ ويقرر PLACE الترتيب المُحمَّل في المقدمة ويحجز منطقة جدول التلميح؛ ويكتب FILL البايتات الحقيقية بالإزاحات المعروفة الآن، فتستقر الصفحة الأولى وجدول التلميح في المقدمة وتُحَلّ بيانات المراجع التقاطعية عند أول جلب.

يحمل المُخرَج قاموس معاملات التخطيط الخطي بوصفه كائنه الأول، وجدول تلميح واحداً أو أكثر يفهرس الصفحات، تماماً كما يقرّ المعيار (Spec: ISO 32000-2, Annex F). تعمل جداول التلميح تلك جنباً إلى جنب مع قسم مراجع تقاطعية تقليدي — فهي تسجّل نطاقات البايتات والمواضع التي يحتاج العارض إلى جلبها، بينما قسم المراجع التقاطعية هو الفهرس الذي يربط كل رقم كائن بإزاحة بايته الدقيقة. تصدر أداة التخطيط الخطي في ⁨NextPDF⁩ صورة الجدول التقليدية وتطرد أي دفق مراجع تقاطعية على طول الطريق، فبمجرد وصول شريحة يحلّ القارئ كائناً بإزاحته مباشرةً من ذلك الجدول (Spec: ISO 32000-2, §7.5.4).

نموذج ذهني مفيد: ملف ⁨PDF⁩ العادي كتاب جدول محتوياته ملصق بالغلاف الخلفي. أما ملف ⁨PDF⁩ المُخطَّط خطياً فينقل صفحة المحتويات تلك إلى المقدمة ويضيف فهرس أرقام صفحات لكل صفحة، كي تتمكن من فتح أي صفحة مباشرةً. الفصول دون تغيير. لم يتحرك سوى التنقّل.

التخطيط الخطي خطوة صريحة قابلة للتبديل. تطلبها؛ فيؤدي المحرك إعادة البناء ويصدر ملف عرض سريع للويب.

<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Contracts\OutputDestination;
$document = Document::createStandalone();
$document->setTitle('Annual Report');
for ($page = 1; $page <= 200; $page++) {
$document->addPage();
$document->setFont('helvetica', '', 12);
$document->cell(0, 12, "Page {$page}", newLine: true);
}
// Linearization is requested explicitly — an operability choice, not a default.
// enableLinearization() takes no arguments; it is the on-switch. The engine
// runs the MEASURE -> PLACE -> FILL rebuild and emits a Fast-Web-View file
// with the first page and hint table at the front.
$document->enableLinearization();
$bytes = $document->output(dest: OutputDestination::String);

محتوى الصفحة هو بالضبط ما ألّفته. الفرق في ترتيب الملف للبايتات التي تستقبلها، وفي جدول التلميح الذي يستقر الآن قرب القمة.

تتحقق من النتيجة كما يفعل غريب — بمدقِّق خارجي:

$ qpdf --check-linearization report.pdf
report.pdf: no linearization errors

لا يكتفي qpdf --check-linearization بالبحث عن عَلَم. بل يعيد اشتقاق الإزاحات التي يدّعيها الملف ويؤكد أنها صحيحة: أن كائنات الصفحة الأولى موجودة فعلاً حيث يقول قاموس التخطيط الخطي، وأن جدول التلميح يشير إلى البايتات الصحيحة، وأن البنية تطابق ⁨Annex F⁩. الملف الذي يكذب بشأن تخطيطه يفشل في هذا الفحص حتى لو بدا مُخطَّطاً خطياً للوهلة الأولى.

الافتراض المتكرر هو أن التخطيط الخطي يضغط الملف أو يجعل التنزيل أسرع إجمالاً. وهو لا يفعل أياً منهما. كثيراً ما يكون الملف المُخطَّط خطياً أكبر ببضعة بايتات، لأنه يحمل جداول التلميح الإضافية. ويبقى زمن النقل الكلي للمستند كله دون تغيير جوهري.

ما يتغير هو متى تظهر أول بكسل مفيد. يحسّن التخطيط الخطي زمن الوصول إلى الصفحة الأولى، لا إجمالي البايتات. إنه ميزة زمن استجابة، لا ميزة ضغط. إن بث الصفحة الأولى مبكراً وتنزيل الملف بسرعة هدفان مختلفان، والتخطيط الخطي يخدم الأول.

مفهوم خاطئ ثانٍ هو أن أي خادم ويب سيبثّ ملفاً مُخطَّطاً خطياً. يحتاج العارض إلى جلب نطاقات بايتات، ما يعني أن الخادم يجب أن يحترم طلبات نطاق ⁨HTTP⁩. معظمها يفعل، لكن الخادم الذي يعيد دائماً الملف بأكمله يحوّل العرض السريع للويب مجدداً إلى انتظار بطيء للملف كاملاً — فالملف جاهز للبثّ، لكن وسيلة النقل ليست كذلك.

يملك ⁨NextPDF⁩ دعماً أساسياً كاملاً لإنتاج ملفات مُخطَّطة خطياً: أداة تخطيط خطي إنتاجية من ثلاثة تمريرات تصدر قاموس المعاملات وجداول التلميح وتجتاز فحص ⁨Annex F⁩ خارجياً.

Fast Web View (linearization) output — edition availability
EditionAvailability
Core

دعم كامل. يُنتِج ⁨NextPDF⁩ مُخرَجاً مُخطَّطاً خطياً (عرضاً سريعاً للويب) عبر إعادة بناء إنتاجية من ثلاثة تمريرات MEASURE → PLACE → FILL، مطابقاً لـISO 32000-2 Annex F.

ProNot in this edition
EnterpriseNot in this edition

يستحق حدّان أن يُسمّيا. أولاً، التخطيط الخطي خاصية لـمراجعة واحدة. ففي اللحظة التي تُلحِق فيها تحديثاً تزايدياً — توقيعاً، أو تعبئة نموذج، أو تحريراً — تذهب البايتات المُلحَقة إلى النهاية، ولا يعود الملف مُخطَّطاً خطياً بدقة حتى يُعاد بناؤه. هذه مفاضلة طبيعية، لا عيب؛ راجع التحديثات التزايدية لمعرفة سبب كون الإلحاق هو السلوك الصحيح للمستندات الموقَّعة.

ثانياً، يتحكم المحرك في الملف. لكنه لا يتحكم في الشبكة. لا يفي العرض السريع للويب بوعده إلا حين يحترم الاتصال الذي يقدّم الملف طلبات نطاق البايتات؛ فقد تكون البايتات مُخطَّطة خطياً تخطيطاً مثالياً، ومع ذلك تصل ككتلة بطيئة واحدة إذا أصرّ الخادم على إرسال الملف بأكمله.

  • تشريح ملف ⁨PDF⁩ — الترويسة والجسم وقسم المراجع التقاطعية والخاتمة التي يعيد التخطيط الخطي ترتيبها. اقرأ هذه أولاً لترى ما الذي يُعاد ترتيبه.
  • الذاكرة والبثّ — البثّ من جهة الكتابة، محور مختلف: كيف يُبقي ⁨NextPDF⁩ استهلاك الذاكرة مستوياً أثناء إنتاج البايتات، مقابل كيف يبثّها القارئ عند الاستقبال.
  • التحديثات التزايدية وسبب أهميتها — لماذا يُلحَق التحرير اللاحق بالنهاية، وما يعنيه ذلك لتخطيط ملف مُخطَّط خطياً المُحمَّل في المقدمة.
  • الأدفاق والمرشِّحات — ما يستقر داخل كائنات الجسم التي يشير إليها جدول التلميح، وكيف تُضغَط.
  • التخطيط الخطي — إعادة البناء التي تحمّل الصفحة الأولى وفهرس تنقّل في المقدمة كي يستطيع العارض العرض والتنقّل قبل وصول الملف بأكمله. اسم المعيار للنتيجة.
  • العرض السريع للويب — الاسم المتوجَّه للمستهلك لملف ⁨PDF⁩ مُخطَّط خطياً؛ يصف المصطلحان الملف نفسه.
  • جدول التلميح — البنية داخل ملف مُخطَّط خطياً التي تسجّل نطاقات ومواضع البايتات لكل صفحة وللكائنات المشتركة، كي يعرف العارض أي شرائح يطلب؛ قسم المراجع التقاطعية هو ما يربط بعد ذلك رقم كائن بإزاحة بايته الدقيقة.
  • قاموس معاملات التخطيط الخطي — الكائن الأول في ملف مُخطَّط خطياً؛ يعلن الإزاحات الأساسية (طول الصفحة الأولى، موضع جدول التلميح، موضع المراجع التقاطعية الرئيسي) التي تجعل الجلب عند الطلب ممكناً.
  • طلب نطاق البايتات — طلب ⁨HTTP⁩ لشريحة من ملف بدلاً من الملف بأكمله؛ آلية النقل التي يعتمد عليها العرض السريع للويب.
  • زمن الوصول إلى الصفحة الأولى — المدة حتى يرى القارئ الصفحة الأولى. زمن الاستجابة الذي يحسّنه التخطيط الخطي، متمايزاً عن زمن التنزيل الكلي.