PDFMove
كيف تعمل حقول نماذج PDF؟ AcroForm وتدفق المظهر والتسطيح
دليل

كيف تعمل حقول نماذج PDF؟ AcroForm وتدفق المظهر والتسطيح

6 دقيقة للقراءة

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

عالمان منفصلان: محتوى الصفحة والطبقة التفاعلية

يوجد في صفحة PDF نوعان مختلفان من المحتوى.

تدفق محتوى الصفحة سلسلة أوامر تصف كيفية رسم الصفحة. فالنص والخطوط والتعبئات والصور — كل ما هو ساكن — هنا.

والتعليقات (annotations) كائنات منفصلة تقيم فوق الصفحة. والملاحظات اللاصقة والتظليلات والروابط التشعبية و — وهو موضوعنا — ودجات حقول النماذج في هذه الفئة.

وهذا التمييز حاسم: فحقل النموذج ليس جزءاً من محتوى الصفحة. بل كائن منفصل مُدرَج في مصفوفة /Annots الخاصة بكائن الصفحة. والشفرة التي ترسم الصفحة والشفرة التي ترسم حقل النموذج تعملان بمسارين مختلفين.

AcroForm: قاموس النموذج على مستوى المستند

يوجد في كائن كاتالوج المستند مفتاح /AcroForm يشير إلى قاموس. وهذا القاموس يدير النموذج كله:

  • /Fields: قائمة بكل حقول النماذج في المستند. وقد تكون الحقول هرمية؛ إذ قد توجد حقول ابنة متعددة تحت حقل أب.
  • /DA: سلسلة المظهر الافتراضي. وتُعرَّف هنا معلومات مثل الخط والمقاس واللون (مثل /Helv 0 Tf 0 g).
  • /DR: قاموس الموارد الافتراضي. وفيه التعريفات الفعلية للخطوط المذكورة في /DA.
  • /NeedAppearances: علَم حاسم؛ سنفصّله بعد قليل.
  • /XFA: بيانات النموذج الديناميكي القائم على XML، إن وُجدت.

أما كائن حقل النموذج نفسه فيحمل ما يلي:

  • /FT: نوع الحقل — /Tx (نص)، و/Btn (زر/مربع اختيار)، و/Ch (قائمة اختيار)، و/Sig (توقيع).
  • /T: اسم الحقل (مثل "full_name" و"date").
  • /V: قيمة الحقل — البيانات التي أدخلها المستخدم.
  • /AP: قاموس المظهر — كيفية رسم هذه القيمة.

تدفق المظهر: منشأ عدم الاتساق

ونصل الآن إلى أهم نقطة. فـقيمة حقل النموذج (/V) وصورتها (/AP) شيئان منفصلان.

فـ/V بيانات فقط: (Ahmad Yousef). ولا توجد فيه معلومة الخط والمقاس والمحاذاة التي سيُرسَم بها هذا النص على الصفحة.

أما /AP فـتدفق مظهر — نموذج XObject صغير يحوي أوامر رسم تماماً كتدفق محتوى الصفحة. وبرنامج تعبئة النماذج السليم يحدّث قيمة /V ويعيد إنتاج تدفق المظهر /AP معاً حين تكتب في حقل ما.

والمشكلة أن بعض البرامج تتخطى الخطوة الثانية. فتكتب القيمة ولا تحدّث المظهر. فماذا يحدث عندئذ؟

يتوقف الأمر على العارض. فالعارض المتقدم ينتج المظهر بنفسه إن كان /AP مفقوداً أو غير محدَّث — مستخدماً معلومات الخط في سلسلة /DA. لكن ليس كل عارض يفعل ذلك بالطريقة نفسها: فهي تتصرف تصرفات مختلفة في أمور مثل تباعد الأسطر والمحاذاة الرأسية واقتطاع النص الفائض.

وتظهر الحقول فارغة في العارضات البسيطة. فبعض عارضات PDF الخفيفة وتطبيقات الجوال لا تملك قدرة إنتاج المظهر. فلا ترسم شيئاً إن لم يوجد /AP.

وتعاني مشغّلات الطابعات المشكلة نفسها. وهذا أشيع سبب تقني لشكوى «عبّأت النموذج لكنه يخرج فارغاً».

علَم NeedAppearances

أُضيف علَم /NeedAppearances إلى المعيار حلاً لهذه الحالة. وحين يُضبَط على true فمعناه: «لا تثق بتدفقات المظهر في هذا النموذج، وأعد إنتاجها بنفسك».

وتفعّل أدوات تعبئة النماذج هذا العلَم في الحالات التي لا تستطيع فيها تحديث المظهر.

لكن العلَم لا يحل المشكلة تماماً:

  • تتجاهل العارضات التي لا تملك قدرة إنتاج المظهر العلَمَ فيبقى الحقل فارغاً.
  • والعارضات القادرة على إنتاج المظهر تفعل ذلك بأسلوبها؛ فتختلف النتيجة من برنامج إلى آخر.
  • ولا تكترث مشغّلات الطابعات بالعلَم عادةً.

أي أن /NeedAppearances يحل المشكلة في عارضات بعينها لكنه لا يوفر ضمانة شاملة.

كيف ينهي التسطيح هذا الالتباس

تفعل عملية التسطيح ما يلي:

1. تأخذ تدفق المظهر لكل حقل نموذج. فتستخدم /AP مباشرة إن كان موجوداً؛ وإلا أنتجته باستخدام قيمة /V ومعلومات /DA.

2. ترسم هذا المظهر في تدفق محتوى الصفحة. فيُضاف كاستدعاء نموذج XObject أو كأوامر رسم مباشرة باستخدام موضع الحقل (/Rect) ومقاسه.

3. تزيل تعليق الودجة من مصفوفة /Annots.

4. تحذف قاموس /AcroForm وقائمة /Fields التي فيه.

5. تزيل شفرات جافاسكربت الخاصة بالنموذج — إذ تصير شفرات الحساب والتحقق بلا وظيفة.

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

| الموضوع | قبل التسطيح | بعد التسطيح | |---|---|---| | اتساق المظهر | يتوقف على العارض | يقيني | | وثوقية الطباعة | تتوقف على المشغّل | يقينية | | القابلية للتحرير | موجودة | غير موجودة | | حسابات جافاسكربت | تعمل | تُزال | | وسوم النماذج لقارئات الشاشة | موجودة | تضيع | | حجم الملف | — | يصغر قليلاً |

ماذا يحدث إن كان تدفق المظهر تالفاً

هنا يكمن فخ في التسطيح. فالأداة تثبّت تدفق المظهر /AP القائم. فإن كان ذلك التدفق قديماً أو فارغاً — أي إن كان برنامج تعبئة النماذج قد كتب القيمة ولم يحدّث المظهر — فقد يثبّت التسطيح مظهراً فارغاً أو خاطئاً.

وعلامة ذلك: أن تظهر القيم حين تفتح الملف في برنامج ما (لأن ذلك البرنامج ينتج المظهر بنفسه)، ثم يخرج فارغاً بعد التسطيح.

والحل: افتح النموذج في برنامج ينتج تدفقات المظهر إنتاجاً سليماً واحفظه، ثم سطّح. أو استخدم قدرة أداة التسطيح على إنتاج المظهر من قيمة /V إن كانت تملكها.

مشكلة فيض النص

تُرسَم حقول النماذج داخل مستطيلاتها (/Rect). فإن لم يدخل النص الذي أدخلته في هذا المستطيل، أمكن تمرير الحقل في الوضع التفاعلي — فتنقر وتمرّر لتقرأ.

ولا وجود للتمرير في التسطيح. فيُثبَّت الجزء الظاهر فقط؛ ويضيع الباقي.

وهذه مخاطرة فقد بيانات حقيقية في حقول العناوين الطويلة وصناديق الملاحظات وحقول النص متعددة الأسطر. وينبغي فحص الحقول ذات المحتوى الطويل قبل التسطيح.

نماذج XFA: عالم آخر

تستخدم بعض ملفات PDF نموذج XFA بدل AcroForm (أو معه). وهي تقنية نماذج ديناميكية من Adobe قائمة على XML: إذ تكبر الحقول تبعاً للبيانات، وتُضاف صفوف إلى الجداول، وقد يتغير عدد الصفحات.

ونماذج XFA ليست جزءاً أصيلاً من معيار PDF؛ بل تقنية منفصلة مضمّنة داخل PDF. ولا تعمل عملاً كاملاً إلا في منتجات Adobe نفسها. وترى في العارضات الأخرى غالباً تنبيه «يلزم Adobe Reader لعرض هذا المستند».

وقد أُلغي XFA في إصدارات PDF الحديثة. ولا يمكن عادةً تسطيح نموذج XFA يعترضك؛ بل عليك تحويله أولاً إلى AcroForm عادي أو PDF ساكن.

علاقته بالتوقيع الرقمي

يحفظ التوقيع الرقمي بصمة معمّاة لنطاق البايت لحظة توقيع المستند. ولأن التسطيح يعيد كتابة الملف لا تعود هذه البصمة مطابقة ويفشل التحقق من التوقيع.

كما أن حقل التوقيع نفسه حقل نموذج (/FT /Sig). فإن حوّله التسطيح إلى محتوى ثابت، ضاعت البنية المعمّاة للتوقيع أيضاً — ولم يبقَ إلا التمثيل البصري للتوقيع وهو بلا أي قيمة تحققية.

الترتيب الصحيح: عبّئ ← سطّح ← وقّع.

الخلاصة

تعيش حقول نماذج PDF في طبقة تفاعلية منفصلة عن محتوى الصفحة. وقيمة الحقل (/V) ورسم تلك القيمة (تدفق المظهر /AP) بنيتان منفصلتان، وحين يكون تدفق المظهر مفقوداً أو غير محدَّث يجري كل عارض تفسيره الخاص — وهذا مصدر مشكلات المظهر غير المتسق والطباعة الفارغة. وعلَم /NeedAppearances حل جزئي لكنه ليس شاملاً. والتسطيح ينهي الالتباس برسم المظهر رسماً دائماً في محتوى الصفحة وإزالة الطبقة التفاعلية بالكامل. وثمنه انعدام الرجعة وضياع بنية إتاحة الوصول؛ ومخاطرته تثبيت تدفق مظهر تالف أو نص فائض.

الأسئلة الشائعة

لماذا يبدو النموذج نفسه مختلفاً في برامج مختلفة؟

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

ما فائدة علَم NeedAppearances؟

هو علَم على مستوى المستند ويعني «تدفقات مظهر الحقول في هذا النموذج غير موثوقة، فليُعِد العارض إنتاجها». ويفعّل هذا العلَم برنامجُ تعبئة النماذج إن كتب القيمة ولم يحدّث المظهر. والمشكلة أن كل عارض ينتج المظهر بأسلوبه فينشأ عدم اتساق؛ كما تتجاهل بعض العارضات البسيطة العلَم فتظهر الحقول فارغة.

هل تبقى بيانات حقول النموذج في الملف بعد التسطيح؟

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

ما نموذج XFA وما الفرق بينه وبين AcroForm؟

XFA تقنية نماذج ديناميكية من Adobe قائمة على XML؛ إذ يمكن أن تكبر الحقول وتصغر تبعاً للبيانات وأن يتغير عدد الصفحات. أما AcroForm فجزء من معيار PDF وهو ساكن. ولا تعمل نماذج XFA عملاً كاملاً إلا في منتجات Adobe نفسها، وتعطي في العارضات الأخرى غالباً تنبيه «يلزم Adobe Reader لعرض هذا النموذج». وقد أُلغي XFA في إصدارات PDF الحديثة.

جرّب ذلك الآن باستخدام Formu Düzleştir.

جرّب Formu Düzleştir