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

الامتثال: مدقق PDF/R-1 وقواعد Arlington وأدوات دورة الحياة

توفر NextPDF\Compliance مدققات دفق البايتات ومراجعة متقاطعة للقواعد تقرأ ملف ⁨Portable Document Format⁩ (⁨PDF⁩) مكتملاً، وتبلّغ عن مواضع اختلافه عن العقد المعياري. عندما يُرجِع المدقق صفرًا من النتائج، تكون النتيجة مُتحقَّقًا منها مقابل البنود التي يطبّقها، لكنها ليست شهادة شاملة.

Terminal window
composer require nextpdf/core:^3

تتكون الوحدة من ثلاثة أجزاء.

PdfRValidator يدقق دفق بايتات مرشحًا وفق ⁨ISO 23504-1⁩:2020 (⁨PDF/R-1⁩). يعمل على البايتات الخام، لا على الحالة الداخلية للكاتب. يلتقط الانحراف بين ما ينوي الكاتب إصداره وما تتطلبه المواصفة، ليكون الفحص النهائي. مجموعة البنود المطبَّقة هي عنقود ⁨v5.1.0⁩: §5 تعليق تعريف الإصدار، و§6.2.2/§6.2.3 قائمة السماح للترويسة، و§6.2.4 منع الجيل-0 ودفق الكائنات، و§6.5.7 قائمة السماح لمشغِّلات دفق المحتوى (q، Q، cm، Do فقط)، و§6.6.1 قائمة السماح لمفاتيح ⁨XObject⁩ الصورية، و§6.4.3 قائمة السماح لمفاتيح قاموس ⁨Info⁩، و§6.3 قائمة السماح لمفاتيح ⁨Catalog.⁩ التحديثات التزايدية في §6.7 والتشفير في §6.8 خارجان صراحةً عن نطاق العنقود الأولي، وهذا مُعلَن في claims.json. لا يتوقف المدقق عند أول نتيجة، بل يجمع كل اختلاف في مرور واحد لتتمكن من رؤية الفرق الكامل.

PdfRConformancePolicy سياسة غير قابلة للتغيير للنطاقات الموصى بها ذات الطابع الإعلامي المحيطة بـ ⁨PDF/R-1.⁩ الحد الأدنى المعياري في §6 غير قابل للضبط مطلقًا. تتحكم السياسة فقط في توصيات حدود التطبيق في §⁨A.5⁩، وتثبيط الشرائح المتعددة في §6.6.1، ومتطلب ⁨XMP Extensible Metadata Platform⁩ (⁨XMP⁩) في §⁨A.6⁩ لأجل إعادة تصنيف ⁨PDF/A⁩ اللاحقة.

ArlingtonValidator يشغّل نموذج ⁨Arlington PDF⁩ المنبع من ⁨PDF Association⁩ في وضع الإبلاغ فقط. وهو استشاري طوال الدورة الحالية: لا يطلق validateReportOnly() استثناءً أبدًا. ويتراجع عبر ثلاثة أوضاع. عندما يتوفر ثنائي المدقق المرجعي، يحلل نتائج منظَّمة. وعندما تتوفر القواعد المثبَّتة فقط، يصدر نتيجة info واحدة تثبت أن تثبيت القواعد قد حُمّل. وعندما تكون القواعد غير متوفرة، يُرجِع قائمة فارغة. يتيح WaiverRegistry للمنسّق إخفاء الخلافات المعروفة والمقبولة مع الحفاظ على مسار التدقيق.

تطابق قاعدة الصدق مصفوفة دعم ⁨Cascading Style Sheets⁩ (⁨CSS⁩) ووحدة المطابقة. يكون البند متحقَّقًا منه فقط عند وجود اختبار ناجح والاستشهاد بالبند المعياري. أما البند المطبَّق دون تجهيزة اختبار ناجحة مخصصة فيكون مُدَّعًى. تُذكَر البنود الخارجة عن النطاق صراحةً، ولا تُترَك غامضة. تؤكد نتيجة PdfRValidator التي لا تتضمن أي نتائج البنود التي يفحصها فقط، ولا تدّعي أي شيء بشأن §6.7 أو §6.8، اللذين لا يطبّقهما.

النوعالصنفالأعضاء الأساسيون
NextPDF\Compliance\Validator\PdfRValidatorfinal classvalidate(string $pdfBytes): list<PdfRValidationFinding>
NextPDF\Compliance\Validator\PdfRValidationFindingfinal readonly classstring $clause، 'error'|'warning'|'info' $severity، string $message
NextPDF\Compliance\Profile\PdfRConformancePolicyfinal readonly class__construct(bool $enforceA5ImplementationLimits = true, bool $rejectMultiStripPages = false, bool $requireXmpForA6Compatibility = false)؛ lax()، strictArchival()
NextPDF\Compliance\Validator\ArlingtonValidatorfinal classvalidateReportOnly(string $pdfPath): list<ArlingtonFinding>
NextPDF\Compliance\Validator\WaiverRegistryfinal classisWaived(string $validator, string $ruleId, string $scopeKey): bool
<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\PdfRValidator;
$validator = new PdfRValidator();
$findings = $validator->validate(file_get_contents('candidate.pdf'));
if ($findings === []) {
// Zero divergences from the §6 clauses PdfRValidator implements.
// This is NOT a PDF/R-1 certificate — §6.7 and §6.8 are not checked.
echo "No PDF/R-1 §6 divergences detected (implemented clause set).\n";
} else {
foreach ($findings as $f) {
echo "[{$f->severity}] §{$f->clause}: {$f->message}\n";
}
}
<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\ArlingtonValidator;
use NextPDF\Compliance\Validator\ArlingtonGrammarLoader;
use NextPDF\Compliance\Validator\WaiverRegistry;
$validator = new ArlingtonValidator(
waivers: new WaiverRegistry(/* loaded waiver entries */),
grammar: new ArlingtonGrammarLoader(/* pinned submodule path */),
adapter: null, // grammar-only mode when the reference checker is absent
);
// Advisory by contract — never throws on findings.
$findings = $validator->validateReportOnly('artifact.pdf');
foreach ($findings as $finding) {
// Each finding pins the Arlington grammar commit SHA for provenance.
logger()->info('arlington', [
'rule' => $finding->ruleId,
'severity' => $finding->severity,
'grammarSha' => $finding->grammarSha,
]);
}
  • PdfRValidator قائم على التعبيرات النمطية، وليس محلِّلًا كاملًا. يستهدف المخرَج الحتمي لـ NextPDF\Writer\PdfRWriter. استخدمه كاشفًا للانحراف لذلك الكاتب، لا محلِّل ⁨PDF⁩ عامًّا.
  • صفر من النتائج ≠ مطابقة ⁨PDF/R-1⁩ الكاملة. §6.7 (التحديثات التزايدية) و§6.8 (التشفير) غير مطبَّقَين في عنقود ⁨v5.1.0⁩ ومُعلَن أنهما خارج النطاق في claims.json. عامِل النتيجة النظيفة على أنها “لا انحراف عن مجموعة البنود المطبَّقة”، ولا أكثر.
  • ⁨Arlington⁩ استشاري. في الدورة الحالية، لا يُفشِل validateReportOnly() عملية البناء أبدًا. يستهلك التكامل المستمر (⁨CI⁩) المُخرَج، لكنه لا يحجب البناء بناءً عليه.
  • تدقيق ⁨PDF/A⁩ الخاص بـ ⁨International Color Consortium⁩ (⁨ICC⁩) ليس هنا. يقع تدقيق ⁨OutputIntent ICC⁩ الخاص بـ ⁨ISO 19005-4⁩:2020 §6.2.2 في PdfAManager الخاص بإصدار ⁨Enterprise⁩ (nextpdf/pro)، لا في وحدة ⁨Compliance⁩ الخاصة بـ ⁨Core.⁩ واجهة ⁨PDF/A⁩ الخاصة بـ ⁨Core⁩ هي مميِّز ConformanceMode فقط.
  • التنازلات تحفظ مسار التدقيق. تُخفى القاعدة المتنازَل عنها من قائمة النتائج، لكن مدخلة التنازل تظل سجلَّ السبب.

ينفذ PdfRValidator::validate() مرورًا خطيًا واحدًا بمسارات تعبيرات نمطية محدودة فوق دفق البايتات. تتناسب التكلفة مع حجم المستند وتبقى داخل ميزانية الوحدة بأريحية. في وضع القواعد فقط، يكون ArlingtonValidator بتعقيد ⁨O⁩(⁨grammar-rule-count⁩) لنتيجة إثبات التحميل. يعمل مسار المدقق المرجعي كعملية فرعية، وتحدّه الأداة المنبع لا ⁨NextPDF.⁩ وهو خطوة ⁨CI⁩ خارج النطاق.

تقرأ هذه المدققات بايتات ⁨PDF⁩ غير موثوقة. يجرّد PdfRValidator القيم الحرفية المحصورة بأقواس والقيم الست عشرية قبل استخراج المفاتيح، لذلك لا يمكن لسلسلة ⁨Creator⁩ مُصاغة بخبث حقن مفتاح /Name زائف (معالجة الهروب في ⁨ISO 32000-1⁩:2008 §7.3.4.2). يشغّل مهايئ ⁨Arlington⁩ المدقق المنبع كعملية فرعية محدودة، ويعامِل انتهاء المهلة أو خطأ التنفيذ على أنه “لا نتائج” بدلًا من الوثوق بمخرَج جزئي. راجع نموذج التهديد الخاص بالمشروع للاطلاع على سطح هجوم تحليل ⁨PDF.⁩

المعيارالبندما تفعله وحدة ⁨Compliance⁩الحالة
⁨ISO 23504-1⁩:2020 (⁨PDF/R-1⁩)§6.5.7يفرض PdfRValidator قائمة السماح لمشغِّلات دفق المحتوى {q,Q,cm,Do}متحقَّق منه (نجاح اختبارات الوحدة + ملف المعايير + التكامل)
⁨ISO 23504-1⁩:2020 (⁨PDF/R-1⁩)§6.4.3يفرض PdfRValidator قائمة السماح لمفاتيح قاموس ⁨Info⁩متحقَّق منه (مدعوم باختبار)
⁨ISO 23504-1⁩:2020 (⁨PDF/R-1⁩)§6.7، §6.8غير مطبَّق في عنقود ⁨v5.1.0⁩عدم تغطية صريح (مُعلَن في claims.json)
⁨ISO 32000-2⁩:2020 (⁨PDF 2.0⁩)§7.5.2فحص قائمة السماح لمفاتيح ⁨Catalog⁩مُدَّعًى (فحص بتعبير نمطي؛ هيكلي)
⁨ISO 19005-4⁩:2020 (⁨PDF/A-4⁩)§6.7.3إدراك مخطط التعريف عبر وحدة ⁨Conformance⁩إحالة متقاطعة (انظر /specifications/pdfa4/)

الدعم ليس مطابقة. تشغيل PdfRValidator الذي لا يُرجِع أي نتائج يثبت فقط أن المُدخَل لم ينحرف عن بنود §6 التي يطبّقها المدقق. وهو لا يؤكد أن الملف ملف ⁨PDF/R-1⁩ مطابق: §6.7 و§6.8 غير مفحوصَين. المراجعة المتقاطعة لـ ⁨Arlington⁩ استشارية ولا تؤكد المطابقة أبدًا. بالنسبة إلى ⁨PDF/A-4⁩، يكون ⁨veraPDF⁩ هو المدقق المرجعي ويعمل خارج النطاق. راجع وحدة المطابقة للاطلاع على أوراكل ⁨veraPDF⁩ والحجب الاختياري الخاص به.

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