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

مشهد المعايير

Spec: ISO 32000-2 Spec: ETSI EN 319 142-1 Spec: RFC 3161 Spec: WCAG 2.2 Evidence: Standard-backed

لا يخضع محرّك ⁨PDF⁩ لمستند واحد، بل لمنظومة صغيرة من المعايير وضعتها هيئات مختلفة، ويشير بعضها إلى بعض. ترسم هذه الصفحة خريطة لهذه المنظومة كما يتتبعها ⁨NextPDF.⁩ كما تُظهر المسار الذي يقطعه بند ما من “المعيار ينص على ذلك” إلى “المحرّك يفعل ذلك، واختبار يثبته.”

كُتبت هذه الصفحة لمهندس متمرّس يحتاج إلى معرفة أيُّ مستند يحكم سلوكاً معيّناً قبل أن يقرّر ما إذا كانت قراءة ⁨NextPDF⁩ له قراءةً يمكن الدفاع عنها.

“دعم ⁨PDF⁩” ادّعاء يخفي سؤالاً: دعمُ ماذا بالضبط؟ البنية الأساسية هي ⁨ISO 32000-2.⁩ والتوقيعات تمرّ عبر ⁨ETSI.⁩ والطوابع الزمنية بروتوكول من ⁨IETF.⁩ و⁨HTML⁩ و⁨CSS⁩ اللذان يعرضهما المحرّك مصدرهما ⁨W3C.⁩ والتشفير الكامن في الأساس من ⁨NIST.⁩ وإتاحة الوصول إلى المُخرَجات من ⁨W3C⁩ مجدداً.

إذا تعاملت مكتبة مع هذه المعايير ككتلة واحدة غير متمايزة، فلن تستطيع تحليل سبب الفشل. عندما يرفض مدقّق فاتورة موقّعة، فالسؤال الأول المفيد ليس “هل ملف ⁨PDF⁩ تالف؟” بل “أيُّ بند من أيِّ معيار لم يُستوفَ، وعلى أيِّ جانب؟” ولطرح هذا السؤال، تحتاج إلى خريطة تسمّي الهيئات، وإلى سرد أمين لكيفية تحوّل البند إلى سلوك.

  • يتتبع ⁨NextPDF⁩ خمس هيئات معايير. ⁨ISO⁩ تملك التنسيق. ⁨ETSI⁩ تملك ملفات التوقيع الأوروبية. ⁨IETF⁩ تملك بروتوكولات النقل (الطوابع الزمنية، وأوّليات التشفير بالإحالة). ⁨W3C⁩ تملك ⁨HTML⁩ و⁨CSS⁩ ومعايير إتاحة الوصول. ⁨NIST⁩ تملك خوارزميات التشفير المعتمدة.
  • تشكّل هذه المستندات مسارات، لا قائمة: فقدرة واحدة على توقيع ⁨PDF⁩ تسلك ⁨ISO⁩ ← ⁨ETSI⁩ ← ⁨IETF⁩ ← ⁨NIST⁩، إذ تشير كل طبقة معيارياً إلى التالية.
  • لا يتحوّل البند إلى سلوك بمجرد قراءته. بل يتحوّل إلى سلوك حين يُعاد صياغته ويُستشهَد به، ويُربَط بمتطلَّب، ويُنفَّذ، ويُثبَّت باختبار. والصفحة التي تصف السلوك توضّح ذلك عبر مستوى الإثبات الخاص بها.
  • حين يكون البند إلزامياً، فإنه يحمل كلمة مفتاحية معيارية (مثل shall أو must). يعامل ⁨NextPDF⁩ تلك الكلمات المفتاحية بوصفها عقداً. أما should فهي توصية يوثّقها بوصفها كذلك، لا بوصفها ضماناً.

الاتحاد، لا الكتلة الواحدة

قسم بعنوان «الاتحاد، لا الكتلة الواحدة»

ISO 32000-2 هو المركز. فهو يعرّف معنى الملف المطابق. يجب أن يلتزم الملف المطابق بكل متطلَّب من متطلَّبات المستند، مع حريته في إغفال أيِّ ميزة لا يشترطها المستند صراحةً Spec: ISO 32000-2, §6 . كما يفرض الالتزام على الكاتب: فأيُّ شيء ينشئه NextPDF أو يعدّله في ملف يجب أن يكون مطابقاً للتنسيق ومتسقاً مع العناصر الموجودة فعلاً Spec: ISO 32000-2, §6 . هذا البند وحده هو سبب رفض المحرّك إصدار تحديث تزايدي غير متسق بنيوياً. وليس ذلك تفضيلاً من NextPDF، بل قاعدة في التنسيق نفسه.

ومن هذا المركز، يشير ⁨ISO 32000-2⁩ إلى الخارج. فمعالجة التوقيع فيه مُعرَّفة “عن طريق الإحالة” إلى سلسلة ⁨ETSI EN 319 142⁩ الخاصة بـ ⁨PAdES.⁩ وتشير ⁨ETSI⁩ بدورها إلى ⁨RFC 3161⁩ من ⁨IETF⁩ للحصول على رمز الطابع الزمني، وإلى سلسلة ⁨NIST FIPS⁩ لخوارزميات التجزئة والتوقيع. وعليه، فالقدرة مسار يمرّ عبر عدة مستندات، كلٌّ منها معياري في طبقته الخاصة.

  1. Step 1 of 5: ISO 32000-2 §12.8 signatures
  2. Step 2 of 5: ETSI EN 319 142-1 PAdES baseline
  3. Step 3 of 5: RFC 3161 timestamp token
  4. Step 4 of 5: NIST FIPS 180-4 hash strength
  5. Step 5 of 5: WCAG 2.2 tagged output
مسار المعايير الذي يقطعه ملف PDF موقّع واحد قابل للتحقق طويل الأمد: تعرّف ISO الحاوية وتشير إلى ETSI لملف التوقيع؛ وتشترط ETSI طابعاً زمنياً من IETF؛ وأوّليات التشفير معتمدة من NIST؛ والمُخرَجات المعروضة خاضعة لمتطلبات إتاحة الوصول من W3C. كل سهم إحالة معيارية، لا ارتباط فضفاض.

الصورة الخطِرة من العمل على المعايير هي قراءة بند ثم كتابة الشيفرة من الذاكرة. مسار ⁨NextPDF⁩ أطول عن قصد، لأن المسار الأطول هو الذي يمكن تدقيقه:

  1. Retrieve The clause is read from the standard, not from memory.
  2. Cite It is paraphrased and pinned with a chunk digest, never quoted.
  3. Classify Its keyword (shall / should / may) sets whether it is a contract or a recommendation.
  4. Map The obligation becomes a concrete engine requirement.
  5. Implement The requirement is built into the pipeline.
  6. Pin A test holds the behaviour against drift.
  7. Tag The page that describes it declares its evidence level.
المسار من بند معياري إلى سلوك محرّك مختبَر: استرجاع البند والاستشهاد به، وتصنيف التزامه بحسب كلمته المفتاحية المعيارية، وربطه بمتطلَّب للمحرّك، وتنفيذه، وتثبيته باختبار، ووسم الصفحة الموثِّقة بأساس إثباتها. والبند الذي يتوقف قبل الاختبار ادّعاء، لا سلوك.

خطوة “التصنيف” هي الموضع الذي يُحسَم فيه معظم الغموض. تُرمِّز المواصفات مستويات متطلباتها في كلمات مفتاحية: عائلة MUST وSHALL وSHOULD وMAY المعروفة. ومعنى تلك الكلمات المفتاحية محدَّد بموجب عُرف ⁨IETF⁩ لكلمات المتطلبات المفتاحية، المحدَّث ليوضّح أن الصيغ المكتوبة بأحرف كبيرة وحدها هي المعيارية، ثم يُضاف هذا المعنى إلى النص الوصفي لكل مواصفة Spec: RFC 2119 Spec: RFC 8174 . يقرأ ⁨NextPDF⁩ كلمة shall بوصفها حدّاً صارماً لا يتجاوزه المحرّك، وكلمة should بوصفها توصية يتّبعها ويوثّقها بوصفها توصية — لا بوصفها وعداً أبداً. هذا التمييز هو الفرق بين بيان قدرات أمين وادّعاء مبالَغ فيه.

المطابقة متدرّجة، لا ثنائية

قسم بعنوان «المطابقة متدرّجة، لا ثنائية»

نادراً ما تكون “المطابقة” قراراً ثنائياً. معايير التوقيع متدرّجة بمستويات — فالملف الأوروبي طويل الأمد مع الأرشفة، مثلاً، موجود تحديداً لإضافة رموز الطوابع الزمنية التي تُبقي التوقيع قابلاً للتحقق بعد إنشائه بوقت طويل Spec: ETSI EN 319 122-1, §6 . وهذا ادّعاء أقوى بكثير من توقيع أساسي مجرّد. ومعيار إتاحة الوصول على النمط نفسه: لا يُبلَغ مستوى مطابقة إلا باستيفاء كل معيار نجاح عند ذلك المستوى، ويذكر الادّعاء المستوى الذي بلغه فعلاً Spec: WCAG 2.2, §5.2.1 . لذا يذكر NextPDF الملف والمستوى، لا كلمة “متوافق” المطلقة.

هذه الصفحة Evidence: Standard-backed : كل ادّعاء فيها مرتبط ببند، ومُعاد صياغته، ومُستشهَد به مع بصمة رقمية كي يستطيع المراجِع التالي إعادة التحقق منه مقابل المصدر.

الطبقةالهيئةالبند المرجعي (مُعاد صياغته)ما الذي يحكمه في ⁨NextPDF⁩
التنسيقISOيجب أن تكون العناصر التي ينشئها الكاتب أو يعدّلها مطابقةً وأن تبقى متسقة Spec: ISO 32000-2, §6 ملف PDF الذي يُصدِره المحرّك
المطابقةISOيستوفي الملف المطابق كل المتطلبات؛ والميزات الإضافية اختيارية Spec: ISO 32000-2, §6 معنى “مُخرَجات صالحة”
ملف التوقيعETSIيضيف المستوى طويل الأمد مع الأرشفة طوابع زمنية للتحقق لاحقاً Spec: ETSI EN 319 122-1, §6 ملف PAdES الذي يستهدفه التوقيع
الوقت الموثوقIETFتُثبِت خدمة الطوابع الزمنية أن معطىً كان موجوداً قبل وقت معيّن Spec: RFC 3161, §2 رمز الطابع الزمني للمستند
التشفيرNISTتختلف دوال التجزئة المعتمدة في قوة الأمان التي تمنحها Spec: NIST FIPS 180-4, §1 خوارزمية البصمة الرقمية الكامنة تحت التوقيع
إتاحة الوصول إلى المُخرَجاتW3Cيتطلب مستوى المطابقة كل معيار عند ذلك المستوى Spec: WCAG 2.2, §5.2.1 ادّعاءات إتاحة الوصول على ملفات PDF المعروضة

البصمات الرقمية المستشهَد بها مسجَّلة في بيانات frontmatter ضمن citations لهذه الصفحة. لا يُعاد إنتاج أيٌّ من نصوص المعايير هنا. والقاعدة التي تحكم هذا الاختيار هي نفسها الموضحة في صفحة انضباط الاستشهاد.

أنت لا تُشغِّل مشهد المعايير؛ بل تقرؤه لتقرّر ما الذي تطلبه من المحرّك. وبصورة عملية، فإن استدعاء توقيع قابل للتحقق طويل الأمد هو بيان عن أيِّ نقطة على المسار تحتاج إليها:

examples/36-sign-pades-b-b-and-b-t.php
<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Security\Signature\CertificateInfo;
use NextPDF\Security\Signature\DigitalSigner;
use NextPDF\Security\Signature\SignatureLevel;
// The signature level is a coordinate on the ISO -> ETSI -> RFC trail.
// PAdES B-B is the ETSI baseline CMS SignedData the Core engine produces;
// B-T adds an RFC 3161 timestamp, and B-LT/B-LTA add the DSS and document
// timestamps that keep a signature validatable after the certificate
// expires. The level you name is the point on the trail you are asking for.
$certInfo = CertificateInfo::fromFiles(
certPath: 'signer-cert.pem',
keyPath: 'signer-key.pem',
);
// The functional signing path is the direct two-phase signing engine.
// (Document::setSignature() records intent but its writer seam is not yet
// wired and fail-fasts on output — see the PadesOrchestrator docblock.)
$signer = new DigitalSigner(
certInfo: $certInfo,
level: SignatureLevel::PAdES_B_B,
);
$result = $signer->sign(file_get_contents('agreement.pdf'));
printf(
"PAdES %s CMS: %d bytes, timestamp=%s\n",
SignatureLevel::PAdES_B_B->value,
$result->getSize(),
$result->hasTimestamp() ? 'yes' : 'no',
);

تسمية PAdES_B_LTA بدلاً من مستوى أساسي مجرّد ليست مفتاحاً لضبط الأداء. بل هي قرار بشأن عمق امتداد الالتزام على مسار المعايير. يستدعي ⁨B-LT⁩ و⁨B-LTA⁩ طبقتَي ⁨DSS⁩ والطابع الزمني الأرشيفي، ويتطلبان حزمة ⁨LTV⁩ المؤسسية وقت التشغيل. وبدلاً من التدهور الصامت، يرفض المحرّك التظاهر بأن مستوى أدنى يقدّم مستوى أعلى.

الفخّ هو قراءة “⁨NextPDF⁩ متوافق مع المعايير” بوصفها ضماناً واحداً شاملاً. الأمر ليس كذلك، ولا يقدّم أيُّ محرّك أمين مثل هذا الضمان. التوافق يكون بحسب كل معيار، وكل بند، وكل مستوى. يستهدف ⁨NextPDF⁩ الخط الأساسي لـ ⁨PDF 2.0⁩، وملفات ⁨PAdES⁩ المسمّاة، ومستويات إتاحة الوصول المعلَنة — كلٌّ محدَّد النطاق، وكلٌّ مُستشهَد به. والادّعاء الذي لا يقف خلفه بند ومستوى هو تسويق، و⁨Insider_⁩ لا يطبعه.

الفخّ الثاني الأدقّ هو افتراض أن should المعيارية وعد. إنها توصية. يوثّق ⁨NextPDF⁩ التوصيات بوصفها توصيات. ضمانات المحرّك مبنية من بنود shall، وهذا الفرق جوهري.

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

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

  • هيئة معايير — منظمة تنشر مواصفة (⁨ISO⁩ و⁨ETSI⁩ و⁨IETF⁩ و⁨W3C⁩ و⁨NIST⁩). تملك كلٌّ منها طبقة مختلفة من حزمة ⁨PDF.⁩
  • بند معياري — متطلَّب في معيار، يُحدَّد بكلمته المفتاحية (shall/must للإلزامي، وshould للموصى به، وmay للاختياري).
  • مسار المعايير — سلسلة مرتَّبة من المواصفات تسلكها قدرة واحدة، حيث يشير كل مستند معيارياً إلى التالي.
  • مستوى المطابقة — درجة متدرّجة من التوافق (ملف أساسي من ⁨ETSI⁩، أو مستوى من ⁨WCAG⁩). يذكر الادّعاء المستوى الذي بلغه فعلاً، لا كلمة “متوافق” المطلقة.
  • ⁨PAdES⁩ — التوقيعات الإلكترونية المتقدمة لـ ⁨PDF⁩، عائلة ملفات التوقيع ⁨ETSI EN 319 142⁩ التي يشير إليها ⁨ISO 32000-2⁩ لتوقيع ⁨PDF.⁩