مقال تقني

بنية ملف PDF: كيف يعمل التنسيق فعليًا

لا يعد PDF تنسيق مستند بالطريقة التي يعمل بها Word أو RTF. تخزن هذه التنسيقات سلسلة من المحتوى يفسرها العارض في لحظة العرض، لذلك يعتمد الإخراج على أي خطوط ومحرك تخطيط تصادف وجودها. يخزن PDF نتيجة تلك العملية: تعليمات عرض دقيقة، وبرامج خطوط، وتدفقات صور مضغوطة، ورسم بياني للكائنات يربطها معًا في وصف قائم بذاته لكل صفحة. يحمل الملف معلومات كافية لإعادة إنتاج كل صفحة بشكل متطابق على أي عارض متوافق، وهو هدفه التصميمي الرئيسي ومصدر معظم التعقيد الذي تواجهه عند محاولة إنشاء أو تحليل أو تعديل أحدها برمجيًا

نموذج الكائن

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

قاموس الكتالوج هو الجذر. يشير إلى شجرة الصفحات، التي تنظم قواميس الصفحات في بنية شجرة متوازنة بدلاً من قائمة مسطحة، لذا فإن التنقل إلى الصفحة 5000 من مستند مكون من 10000 صفحة لا يتطلب اجتياز كل واصف صفحة سابق. يشير كل قاموس صفحة إلى تدفقات المحتوى الخاصة به (تسلسل واحد أو أكثر من مشغلات وصف الصفحة)، وقاموس الموارد الخاص به (والذي يشير بدوره إلى واصفات الخطوط ومساحات الألوان و XObjects للصور)، وصندوق الوسائط الخاص به (مساحة الإحداثيات التي تعيش فيها الصفحة). أصل الإحداثيات في الزاوية اليسرى السفلية، مع تشغيل Y الإيجابي لأعلى، بوحدات 1/72 بوصة

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

تدفقات المحتوى والنموذج الرسومي

يعيش المحتوى المرئي للصفحة في تدفق محتوى واحد أو أكثر. يمثل كل تدفق تسلسلًا لمشغلات PDF يتخللها معاملاتها. يبدأ مشغل النص BT كائنًا نصيًا، ويختار Tf خطًا وحجمًا من قاموس الموارد، ويحدد Td موضع مؤشر النص، ويرسم Tj أو TJ سلسلة، ويغلق ET كائن النص. تتبع الرسومات المتجهة نمطًا مشابهًا: يعين m نقطة بداية المسار، ويلحق l مقطع خط، ويلحق c منحنى بيزير، ويملأ f أو S أو يرسم حدود المسار

تتحكم الحالة الرسومية في كل ما يحدث بين المشغلات: مصفوفة التحويل الحالية، وعرض الخط، ومساحة اللون، ولون التعبئة، ولون الحد، ومسار الاقتطاع. تدفع المشغلات مثل q و Q وتقفز بالحالة الرسومية على المكدس، وهي الطريقة التي ينفذ بها PDF تحويلات الإحداثيات المحلية وتجاوزات الحالة المؤقتة دون التأثير على السياق المحيط بها. تقوم نموذج XObjects بتعميم هذا: تدفق محتوى قائم بذاته مع قاموس الموارد الخاص به والذي يمكن رسمه على صفحة في مواضع ومقاييس عشوائية باستخدام مشغل Do واحد

تضمين الخطوط واستخراج النص

يمكن لـ PDF الإشارة إلى الخطوط بالاسم والاعتماد على العارض لاستبدال شيء ما، ولكن في الممارسة العملية، يجب أن يضمن أي مستند تنوي مشاركته بيانات الخط. يحمل خط Type 1 أو TrueType/OpenType المضمن في ملف PDF قاموس واصف خط يشير إلى تدفق ملف خط. بالنسبة لخطوط TrueType، يحتوي ذلك التدفق على برنامج الخط الثنائي؛ وبالنسبة لـ Type 1، فهو عبارة عن بيانات PFB. تؤدي عملية التكوين الفرعي، وهي ما يفعله كل مُنشئ PDF جاد، إلى تجريد الصور الرمزية غير المشار إليها في المستند، مع الحفاظ على أحجام الملفات قابلة للإدارة حتى بالنسبة لخطوط Unicode الكبيرة

استخراج النص هو حيث يأتي الرد العكسي لتضمين الخطوط. يتم تحديد التمثيل المرئي للحرف بواسطة صورة رمزية في برنامج الخط المضمن. يتم تحديد قيمة Unicode لذلك الحرف بواسطة تدفق ToUnicode CMap المرفق بقاموس الخط. عندما يكون ToUnicode CMap مفقودًا أو غير صحيح، يمكن لعارض PDF عرض النص بشكل مقروء ولكن لا يمكنه استخراجه كـ Unicode مفيد، وهذا هو السبب في أن النسخ واللصق من بعض ملفات PDF ينتج عنه كلام فارغ. يضيف PDF الموسوم (ISO 32000 §14.8) طبقة ثانية: شجرة بنية منطقية ترسم محتوى الصفحة إلى أدوار دلالية للمستند مثل الفقرات والعناوين وخلايا الجدول. تستخدم أجهزة قراءة الشاشة ومحركات إعادة التدفق شجرة البنية بدلاً من ترتيب تدفق المحتوى الخام، مما يفسر سبب بقاء ملف PDF المنسق جيدًا بصريًا غير قابل للوصول إذا كان الوسم غائبًا أو خاطئًا

التحديثات التزايدية والتوقيعات الرقمية

عند حفظ التغييرات على ملف PDF حالي دون إعادة كتابته من الصفر، يتم إلحاق الكائنات الجديدة بعد نص الملف الأصلي مع قسم مرجع ترافقي جديد وقاموس تذييل جديد. يشير التذييل المحدث إلى بيانات المرجع الترافقي الجديدة، وتبقى الكائنات المبطلة في الملف ولكن لا يتم الإشارة إليها ببساطة بواسطة سلسلة المرجع الترافقي الجديدة. هذا هو التحديث التزايدي، وله نتيجتان مهمتان

أولاً، ينمو الملف مع كل دورة حفظ. يقوم المستند الذي تم تحريره وحفظه بشكل متكرر بتجميع طبقات من الكائنات المتقادمة. يمكن لأدوات مثل QPDF ترتيب ملف خطيًا أو ضغطه وإعادة كتابته لاستعادة تلك المساحة، لكن الافتراضي هو التراكم. ثانيًا، تعتمد التوقيعات الرقمية على التحديثات التزايدية لنموذج النزاهة الخاص بها. يغطي توقيع ISO 32000 نطاق بايت من الملف، عادةً كل شيء باستثناء العنصر النائب لقيمة التوقيع نفسها. أي تغييرات بعد التوقيع تظهر كتحديثات تزايدية إضافية تكون مرئية للقارئ المدقق كتعديلات أُجريت بعد التوقيع، وهو مسار التدقيق الذي تريده بالضبط. ومع ذلك، يعني هذا أيضًا أن بعض التعديلات، مثل إضافة توقيع الموافقة أو ملء حقول النموذج، مسموح بها صراحةً من خلال المعيار دون إبطال التوقيع الأصلي، بشرط أن تتوافق التغييرات مع إعدادات أذونات المستند (ISO 32000-2 §12.7.6). يتم الإبلاغ عن أي تعديل يقع خارج هذه الأذونات بأنه غير مصرح به. يعد الحصول على هذا التمييز الصحيح أمرًا مهمًا عند إنشاء مستندات سيتم التوقيع عليها لاحقًا

مستويات الامتثال وسلالة ISO 32000

بدأ PDF كتنسيق Adobe خاص في عام 1993، وامتص نموذج التصوير لـ PostScript، وراكم الميزات عبر خمسة عشر إصدارًا: التشفير في 1.1، والنماذج التفاعلية في 1.2، والتوقيعات الرقمية والبنية المنطقية في 1.3، والشفافية في 1.4، وتدفقات الكائنات في 1.5، وتشفير AES في 1.6. قدمت Adobe ملف PDF 1.7 إلى ISO في عام 2007، وكانت النتيجة ISO 32000-1:2008. يغطي ISO 32000-2:2020 ملف PDF 2.0، الذي شدد العديد من المجالات غير المحددة بدقة، ونقح اشتقاق مفتاح AES-256 (مراجعة 6 تحل محل مراجعة 5)، وأضاف دعمًا صريحًا للملفات المرتبطة والوسائط الغنية

المعايير الفرعية مشتقة من نفس القاعدة. يقايض PDF/A (ISO 19005) الميزات بالاستقرار الأرشيفي: لا تشفير، ولا تبعيات للمحتوى الخارجي، وجميع الخطوط مضمنة، ومساحات الألوان مستقلة عن الجهاز، ومطلوب بيانات XMP الوصفية. يعتمد PDF/A-1 على PDF 1.4، و PDF/A-2 على PDF 1.7، ويسمح PDF/A-3 بملفات مضمنة بأي تنسيق. إن PDF/X (ISO 15930) هو مجموعة فرعية لإنتاج الطباعة: نوايا الإخراج، ومربعات التسييل والتشذيب، ولا توجد شفافية في مستويات الامتثال الأقدم. يُلزم PDF/UA (ISO 14289) بالبنية الموسومة، وتعيينات Unicode، والبيانات الوصفية للغة لسهولة الوصول. هذه ليست تنسيقات متنافسة؛ إنها مجموعات من القيود الإضافية أعلى ملف PDF الأساسي، ويمكن أن يتوافق ملف واحد مع أكثر من واحد في نفس الوقت بشرط ألا تتعارض القيود

بالنسبة لأي شخص يكتب تعليمات برمجية تقوم بإنشاء أو معالجة PDF، فإن الأساس العملي هو ISO 32000-2 مع الاهتمام الدقيق بالأقسام التي تغطي نموذج المرجع الترافقي (§7.5)، والحالة الرسومية (§8.4)، ومشغلات حالة النص (§9.3)، وواصفات الخطوط و ToUnicode (§9.6 و §9.10)، والنماذج التفاعلية (§12.7)، والتوقيعات الرقمية (§12.8). المعيار طويل، لكن معظم أعمال PDF البرمجية تمس شريحة ضيقة منه بشكل متكرر. يعد فهم نموذج الكائن وآلية المرجع الترافقي نقطة الدخول؛ كل شيء آخر هو تخصص من هناك