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

المطابقة: توجيه ConformanceMode وحدود التحقّق

NextPDF\Conformance هو المُميِّز الوحيد الذي يُخبر الكاتب بعقد المنظمة الدولية للتوحيد القياسي (⁨ISO⁩) الذي يستهدفه ملف ⁨Portable Document Format⁩ (⁨PDF⁩). تُصدِر المكتبة البنى التي يحدّدها ذلك العقد. لكنها لا تشهد، ولا تستطيع أن تشهد، بمطابقة الملف الناتج. لا يستطيع الشهادة بالمطابقة إلا مدقّق خارجي.

Terminal window
composer require nextpdf/core:^3

تُتيح وحدة ⁨Conformance⁩ نوعين عامّين. ConformanceMode تعداد مدعوم بقيمة يحدّد اسم العقد المستهدف (Plain، PdfUa1، PdfUa2، PdfA2، PdfA3، PdfA3b، PdfA3u، PdfA4، PdfA4e، PdfA4f). أما ConformancePolicy فهو كائن قيمة غير قابل للتغيير يجمع وضعًا مع مفاتيح صرامة مستقلة.

الوضع هو المصدر الوحيد للحقيقة لبوابات الكاتب اللاحقة. قبل وجود هذا التعداد، كان المحرّك يستنتج ما إذا كان المستند موسومًا وفق المواصفة من أعلام متفرّقة. تُعيد ConformanceMode::isTagged()، وisAccessibility()، وisArchival()، وpdfaPart()، وpdfaConformanceLetter()، وrequiresPdf17() إجابةً مُنمَّطة يقرؤها الكاتب مباشرةً. وبذلك يظلّ الكتالوج، و/MarkInfo، وسلالة ترويسة الملف، وعلامات ⁨Extensible Metadata Platform⁩ (⁨XMP⁩) pdfaid متوائمةً مع النيّة المُعلَنة.

اقرأ حدود الدعم حرفيًّا. ⁨NextPDF Core⁩ يُصدِر البنى التي تحدّدها هذه المعايير. تحدّد ⁨ISO 19005-4⁩:2020 §6.7.3 مخطط التعريف الذي يسجّل متغيّر ⁨PDF/A⁩ الذي يدّعيه الملف. وتنصّ ⁨ISO 19005-4⁩:2020 على أنّ المطابقة تُحدَّد كما هو منصوص عليه في البند 5 منها: مقابل المتطلبات المعيارية، وباستخدام أداة فحص، لا بواسطة المكتبة المُنتِجة. وتؤطّر ⁨ISO 14289-2⁩:2024 §6 المطابقة بوصفها خاصيةً يستوفيها ملف. تعيين وضع ⁨NextPDF⁩ مُدخَل ضروري لملف مطابق، لكنه ليس بحدّ ذاته نتيجة مطابقة.

يتّبع ذلك الانضباط نفسه في التمييز بين “المُتحقَّق منه” و”المُدّعى” ضمن مصفوفة دعم ⁨Cascading Style Sheets⁩ (⁨CSS⁩). لا تكون القدرة مُتحقَّقًا منها إلا عندما يجتمع لها اختبار ناجح أو تشغيل عرّافة مع بند مُستشهَد به. وكل ما عدا ذلك هو شيء تُصدِره المكتبة: مفيد، لكنه ليس ضمانة مطابقة. المطابقة تخصّ الملف النهائي والمدقّق، لا وعدًا من المكتبة. تحقّق من المُخرَج باستخدام ⁨veraPDF⁩ (انظر “المطابقة” أدناه).

ثمّة حدّ ثانٍ مهمّ في العمل الأرشيفي. تأليف ⁨PDF/A-4⁩، بما في ذلك قاموس ⁨OutputIntent⁩، وملف تعريف ⁨International Color Consortium⁩ (⁨ICC⁩) المضمَّن، ومخطط امتداد ⁨XMP⁩، يأتي في امتداد nextpdf/pro، لا في ⁨Core.⁩ في تثبيت ⁨Core⁩ فقط، يرفع Document::enablePdfA() الاستثناء InvalidConfigException لأنّ القدرة security.pdfa غير مُسجَّلة. لا يزال ⁨Core⁩ يملك المُميِّز ConformanceMode، لذلك يعمل الاستبطان ومسار ⁨PDF/Universal Accessibility⁩ (⁨PDF/UA-2⁩) الموسوم، لكنه لا يؤلّف ملف ⁨PDF/A-4⁩ بمفرده.

النوعالصنفالأعضاء الرئيسية
NextPDF\Conformance\ConformanceModeenum: stringPlain, PdfUa1, PdfUa2, PdfA2, PdfA3, PdfA3b, PdfA3u, PdfA4, PdfA4e, PdfA4f; isTagged(), isAccessibility(), isArchival(), requiresPdfUa2PageTabs(), pdfaPart(): ?int, pdfaConformanceLetter(): string, requiresPdf17(): bool
NextPDF\Conformance\ConformancePolicyfinal readonly class__construct(ConformanceMode $mode = PdfUa2, bool $strictUa2 = false, bool $rejectUnvalidatedLang = false, …); lax(), strictUa2(), withUax9IsolateSupport(), withoutAstShadowMode(), withBlackPointCompensation(), withStrictOcspProducedAtTolerance(), withAllowStaleOcsp()

يفرض ConformancePolicy ثابتًا واحدًا في مُنشئه: لا تنطبق مفاتيح ⁨PDF/UA-2⁩ الصارمة إلا عندما يكون الوضع PdfUa2، ويفرض strictUa2 = true القيمة rejectUnvalidatedLang = true. وتطرح التركيبات غير المتسقة InvalidConfigException بدلًا من التدهور الصامت.

<?php
declare(strict_types=1);
use NextPDF\Conformance\ConformanceMode;
$mode = ConformanceMode::PdfA4f;
// Introspect the declared contract — these drive writer-side gates.
$mode->pdfaPart(); // 4
$mode->pdfaConformanceLetter(); // 'F'
$mode->requiresPdf17(); // false (PDF/A-4 is PDF 2.0 lineage)
$mode->isArchival(); // true

المسار المضمّن في ⁨Core⁩ والذي يمارس عقد مطابقة من طرف إلى طرف هو مسار ⁨PDF/UA-2⁩ الموسوم. المثال القابل للتشغيل هو examples/31-pdfua2-tagged.php. وهو أيضًا هدف العرّافة لملف تعريف ⁨PDF/UA-2⁩ الصارم.

<?php
declare(strict_types=1);
use NextPDF\Core\Document;
$doc = Document::createStandalone();
// Set the tagged-PDF contract BEFORE writing content so the HTML pipeline
// wires the TaggedContentEmitter at parser-construction time.
$doc->enableTaggedPdf(lang: 'en');
$doc->setTitle('Accessible report');
// … write content …
$doc->save(__DIR__ . '/out/report-ua2.pdf');
// The library has now emitted PDF/UA-2 structures. It has NOT asserted
// conformance. Verify the file with the pinned veraPDF oracle:
//
// php oracle/run.php pdfua.strict
//
// (Requires the veraPDF Docker image — opt-in; see "Conformance" below.)
  • تأليف ⁨PDF/A-4⁩ ميزة ⁨Premium.⁩ في تثبيت ⁨Core⁩ فقط، يطرح Document::enablePdfA() الاستثناء InvalidConfigException (security.pdfa غير متاحة). يملك ⁨Core⁩ المُميِّز، لا إصدار ⁨OutputIntent/ICC/XMP.⁩ انظر /specifications/pdfa4/.
  • حالات المظلّة مقابل المتغيّر. PdfA4 هي حالة المظلّة وتُبلِغ عن pdfaConformanceLetter() فارغ. توجّه ⁨ISO 19005-4⁩:2020 §6.7.3 الملف الذي لا يطابق ⁨PDF/A-4e⁩ ولا ⁨PDF/A-4f⁩ إلى عدم تقديم أيّ pdfa:conformance. استخدم PdfA4e / PdfA4f فقط للمتغيّرين ⁨Annex B⁩ / ⁨Annex A.⁩
  • ⁨PDF/UA-2⁩ الصارم اختياري. ConformancePolicy::lax() هو الافتراضي المتوافق مع الإصدارات السابقة. يفرض strictUa2() القيمة /MarkInfo /Marked true ويرفض ⁨Best Current Practice⁩ (⁨BCP⁩) 47. تفعيله على وضع غير PdfUa2 يطرح استثناءً.
  • isTagged() مُدرِكة للمتغيّر. Plain، وPdfA2، وPdfA3b، وPdfA4e تُبلِغ عن أنّها غير موسومة. يجب ألا يستنتج الكاتب شجرة بنية من الوضع الأرشيفي وحده.
  • الوضع الناجح ليس ملفًّا ناجحًا. تعيين PdfA4 لا يجعل المُخرَج ملف ⁨PDF/A-4⁩ صالحًا. شغّل مدقّقًا.

ConformanceMode وConformancePolicy نوعا قيمة خالصان. تحليل حالة التعداد وإرسال match هما ⁨O⁩(1)، دون أيّ تخصيص يتجاوز كائن السياسة غير القابل للتغيير. ولا يضيفان أيّ كلفة قابلة للقياس إلى مسار الكتابة. الكاتب، لا المُميِّز، هو ما يهيمن على ميزانية الوحدة (wall_ms: 1500). عرّافة ⁨veraPDF⁩ خطوة تكامل مستمر (⁨CI⁩) خارج النطاق، وليست جزءًا من توليد المستند.

تتحكم مفاتيح الصرامة في ConformancePolicy بسلوك أمني يفشل مغلقًا: securityPkiRfc5280Strict (التحقّق من المسار وفق ⁨Request for Comments⁩ (⁨RFC⁩) 5280 §6)، وstrictOcspProducedAtTolerance (نافذة الانحراف وفق ⁨RFC 6960⁩ §4.2.2.1)، وallowStaleOcsp (الافتراضي false؛ رفض استجابات ⁨Open Certification Status Protocol⁩ (⁨OCSP⁩) التي تفتقر إلى nextUpdate). هذه الإعدادات الافتراضية محافِظة وستتحول إلى الصرامة في إصدار رئيسي مستقبلي وفق استراتيجية التوافق الخلفي المُوثَّقة. انظر وحدة الأمن ونموذج تهديد المشروع للاطّلاع على تفاصيل مسار التوقيع.

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

المعيارالبندما الذي يفعله ⁨NextPDF Core⁩الحالة
⁨ISO 14289-2⁩:2024 (⁨PDF/UA-2⁩)§6يُصدِر شجرة البنية، و/MarkInfo /Marked true (صارم)، و/Lang، وpdfuaid ⁨XMP⁩ عبر مسار ⁨Core⁩ الموسومملف تعريف مُتحقَّق منه: pdfua.strict يتحقّق منه بواسطة عرّافة ⁨veraPDF⁩ (php oracle/run.php pdfua.strict) عندما يكون ثنائي ⁨veraPDF⁩ حاضرًا (بوابة اختيارية)
⁨ISO 19005-4⁩:2020 (⁨PDF/A-4⁩)§6.7.3يُصدِر المُميِّز pdfaid:part / pdfa:conformance عبر ConformanceModeمُدّعى (إصدار المُميِّز، مُختبَر وحدويًّا)؛ تأليف ملف ⁨PDF/A-4⁩ متاح في ⁨Premium⁩ فقط
⁨ISO 32000-2⁩:2020 (⁨PDF 2.0⁩)§7.5.2بنية ⁨catalog/document⁩ الأساسيةمُدّعى (سلوك المحرّك الأساسي)

الدعم ليس مطابقةً. ⁨NextPDF Core⁩ يُصدِر بنى تعريف ⁨PDF/UA-2⁩ و⁨PDF/A-4⁩، مع دليل تنفيذي في tests/Unit/Conformance/. لا يستطيع تأكيد أنّ ملفًّا مطابق لـ ⁨PDF/A-4⁩ أو ⁨PDF/UA-2⁩ إلا مدقّق يشغّل ملف التعريف المطابق. وفقًا للبند 5 من ⁨ISO 19005-4⁩:2020، تحديد المطابقة مهمة المدقّق، لا مهمة المكتبة المُنتِجة.

بوابة ⁨veraPDF⁩ صادقة بشأن متطلّبها. تستدعي العرّافة (oracle/run.php، oracle/lib/OracleRunner.php) صورة ⁨Docker⁩ مثبَّتة لـ ⁨veraPDF.⁩ عندما تكون ⁨Docker⁩ أو الصورة غائبةً، يخرج المُشغِّل بالرمز 2 (فشل بنية تحتية) ولا يتحقّق من أيّ شيء. لذلك يكون ملف التعريف pdfua.strict بوابة مطابقة اختيارية. فهو يُثبت المطابقة فقط على الأجهزة التي يكون فيها ثنائي ⁨veraPDF⁩ حاضرًا. لا يأتي ⁨NextPDF⁩ بأيّ مدقّق مضمَّن ولا يقدّم أيّ ادعاء مطابقة في غيابه.

الاستشهادات مُعاد صياغتها من مجموعة امتثال ⁨NextPDF.⁩ وتُسجَّل ملخّصات reference_id الكاملة المكوَّنة من 64 حرفًا في ترويسة الصفحة وفي _normative-evidence-conf.md.