ข้ามไปยังเนื้อหา

Compliance: ตัววาลิเดเตอร์ 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 ข้อห้ามเรื่อง generation-0 และ object-stream, §6.5.7 รายการที่อนุญาตของตัวดำเนินการ content-stream (เฉพาะ q, Q, cm, Do), §6.6.1 รายการที่อนุญาตของคีย์ image XObject, §6.4.3 รายการที่อนุญาตของคีย์ Info-dictionary และ §6.3 รายการที่อนุญาตของคีย์ Catalog ส่วน §6.7 การอัปเดตแบบเพิ่มหน่วยและ §6.8 การเข้ารหัสลับอยู่นอกขอบเขตของคลัสเตอร์เริ่มต้นอย่างชัดเจน และระบุไว้เช่นนั้นใน claims.json ตัววาลิเดเตอร์ไม่หยุดที่ข้อค้นพบแรก แต่รวบรวมทุกความเบี่ยงเบนในการตรวจสอบรอบเดียวเพื่อให้คุณเห็น diff ทั้งหมด

PdfRConformancePolicy คือนโยบายแบบเปลี่ยนแปลงไม่ได้สำหรับแถบ แนะนำแต่เป็นเชิงให้ข้อมูล รอบ PDF/R-1 พื้นฐานเชิงบรรทัดฐาน §6 ไม่สามารถกำหนดค่าได้เลย นโยบายควบคุมเฉพาะคำแนะนำเรื่องขีดจำกัดการนำไปใช้ §A.5 การไม่รองรับ multi-strip ตาม §6.6.1 และข้อกำหนด XMP Extensible Metadata Platform (XMP) ตาม §A.6 สำหรับการจัดประเภทใหม่เป็น PDF/A ในขั้นปลายน้ำ

ArlingtonValidator รันโมเดล Arlington PDF ต้นทางของ PDF Association ในโหมดรายงานเท่านั้น ตัววาลิเดเตอร์เป็นเชิงให้คำแนะนำตลอดรอบปัจจุบัน: validateReportOnly() ไม่เคยโยนข้อยกเว้น ตัววาลิเดเตอร์ถอยกลับผ่านสามโหมด เมื่อมีไบนารีของตัวตรวจสอบอ้างอิงพร้อมใช้งาน ตัววาลิเดเตอร์จะแยกวิเคราะห์ข้อค้นพบแบบมีโครงสร้าง เมื่อมีเฉพาะไวยากรณ์ที่ปักหมุดไว้ ตัววาลิเดเตอร์จะส่งออกข้อค้นพบ info หนึ่งรายการเพื่อพิสูจน์ว่าหมุดของไวยากรณ์ถูกโหลดแล้ว เมื่อไวยากรณ์ไม่พร้อมใช้งาน ตัววาลิเดเตอร์จะคืนค่ารายการว่าง WaiverRegistry ช่วยให้ตัวประสานงานระงับความไม่สอดคล้องที่ทราบว่ายอมรับได้ ขณะยังคงเก็บร่องรอยการตรวจสอบไว้

กฎความซื่อตรงนี้สอดคล้องกับเมทริกซ์การรองรับ Cascading Style Sheets (CSS) และโมดูล conformance ข้อกำหนดจะเป็น Verified ก็ต่อเมื่อมีการทดสอบที่ผ่านอยู่ และมีการอ้างอิงข้อกำหนดเชิงบรรทัดฐานนั้น ข้อกำหนดที่นำมาใช้แต่ไม่มีฟิกซ์เจอร์ที่ผ่านโดยเฉพาะถือเป็น Claimed ข้อกำหนดที่อยู่นอกขอบเขตจะถูกระบุไว้อย่างชัดเจน ไม่ปล่อยให้คลุมเครือ ผลลัพธ์ 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 อิงตาม regex ไม่ใช่ตัวแยกวิเคราะห์แบบเต็มรูปแบบ โดยมุ่งเป้าไปที่เอาต์พุตเชิงกำหนดได้ของ NextPDF\Writer\PdfRWriter ใช้ตัววาลิเดเตอร์นี้เป็นตัวตรวจจับการเบี่ยงเบนสำหรับตัวเขียนนั้น ไม่ใช่ตัวแยกวิเคราะห์ PDF ทั่วไป
  • ศูนย์ข้อค้นพบ ≠ การสอดคล้อง PDF/R-1 อย่างสมบูรณ์ §6.7 (การอัปเดตแบบเพิ่มหน่วย) และ §6.8 (การเข้ารหัสลับ) ไม่ได้ถูกนำมาใช้ในคลัสเตอร์ v5.1.0 และถูกประกาศว่าอยู่นอกขอบเขตใน claims.json ให้ถือว่าผลลัพธ์ที่สะอาดหมายถึง “ไม่มีการเบี่ยงเบนในชุดข้อกำหนดที่นำมาใช้” เท่านั้น และไม่มีอะไรมากไปกว่านั้น
  • Arlington เป็นเชิงให้คำแนะนำ ในรอบปัจจุบัน validateReportOnly() ไม่เคยทำให้บิลด์ล้มเหลว Continuous integration (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() เป็นการตรวจสอบเชิงเส้นรอบเดียวด้วยการเดิน regex แบบมีขอบเขตจำกัดบนไบต์สตรีม ต้นทุนปรับตามขนาดของเอกสารและยังคงอยู่ในงบประมาณของโมดูลอย่างชัดเจน ในโหมดไวยากรณ์เท่านั้น ArlingtonValidator มีความซับซ้อน O(grammar-rule-count) สำหรับข้อค้นพบที่พิสูจน์การโหลด เส้นทางตัวตรวจสอบอ้างอิงทำงานเป็นกระบวนการย่อยและถูกจำกัดโดยเครื่องมือต้นทาง ไม่ใช่โดย NextPDF จึงเป็นขั้นตอน CI แบบนอกแถบ

ตัววาลิเดเตอร์เหล่านี้อ่านไบต์ PDF ที่ไม่น่าเชื่อถือ PdfRValidator ตัดลิเทอรัลที่อยู่ในวงเล็บและลิเทอรัล hex ออกก่อนสกัดคีย์ ดังนั้นสตริง Creator ที่ถูกสร้างขึ้นเป็นพิเศษจึงไม่สามารถแทรกคีย์ /Name ปลอมได้ (การจัดการ escape ตาม ISO 32000-1:2008 §7.3.4.2) อะแดปเตอร์ Arlington รันตัวตรวจสอบต้นทางเป็นกระบวนการย่อยแบบมีขอบเขตจำกัด อะแดปเตอร์ถือว่าการหมดเวลาหรือข้อผิดพลาดในการดำเนินการเป็น “ไม่มีข้อค้นพบ” แทนที่จะเชื่อถือเอาต์พุตบางส่วน ดูแบบจำลองภัยคุกคามของโครงการสำหรับพื้นผิวการโจมตีในการแยกวิเคราะห์ PDF

มาตรฐานข้อกำหนดสิ่งที่โมดูล Compliance ทำสถานะ
ISO 23504-1:2020 (PDF/R-1)§6.5.7PdfRValidator บังคับใช้รายการที่อนุญาตของตัวดำเนินการ {q,Q,cm,Do} สำหรับ content-streamVerified (ผ่านการทดสอบ unit + standards-profile + integration)
ISO 23504-1:2020 (PDF/R-1)§6.4.3PdfRValidator บังคับใช้รายการที่อนุญาตของคีย์ Info-dictionaryVerified (มีการทดสอบรองรับ)
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การเดินรายการที่อนุญาตของคีย์ CatalogClaimed (การเดิน regex; เชิงโครงสร้าง)
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 เป็นตัววาลิเดเตอร์ที่มีอำนาจและทำงานแบบนอกแถบ ดู โมดูล conformance สำหรับ veraPDF oracle และการกั้นแบบ opt-in

การอ้างอิงต่าง ๆ ถอดความมาจากคลังเอกสาร compliance digest ของ NextPDF โดยบันทึก reference_id 64 อักขระแบบเต็มไว้ทั้งใน front-matter ของหน้าและใน _normative-evidence-conf.md