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

Conformance: การกำหนดเส้นทางด้วย ConformanceMode และขอบเขตของการตรวจสอบความถูกต้อง

NextPDF\Conformance คือตัวจำแนกหลักเพียงตัวเดียวที่บอกตัวเขียนว่าไฟล์ Portable Document Format (PDF) มุ่งไปยังสัญญาขององค์การระหว่างประเทศว่าด้วยการมาตรฐาน (ISO) ฉบับใด ไลบรารีปล่อยโครงสร้างตามที่สัญญานั้นกำหนด แต่ไม่ได้รับรองและไม่สามารถรับรองได้ว่าไฟล์ผลลัพธ์สอดคล้อง มีเพียงตัวตรวจสอบความถูกต้องภายนอกเท่านั้นที่รับรองความสอดคล้องได้

Terminal window
composer require nextpdf/core:^3

โมดูล Conformance เปิดเผยชนิดข้อมูลสาธารณะสองชนิด ConformanceMode เป็น backed enum ที่ตั้งชื่อสัญญาเป้าหมาย (Plain, PdfUa1, PdfUa2, PdfA2, PdfA3, PdfA3b, PdfA3u, PdfA4, PdfA4e, PdfA4f) ส่วน ConformancePolicy เป็นอ็อบเจกต์ค่าที่เปลี่ยนแปลงไม่ได้ ซึ่งรวมโหมดเข้ากับสวิตช์ความเข้มงวดที่เป็นอิสระต่อกัน

โหมดเป็นแหล่งอ้างอิงหลักเพียงแหล่งเดียวสำหรับเกตฝั่งตัวเขียน ก่อนมี enum นี้ เอนจินต้องอนุมานว่าเอกสารถูกแท็กตามสเปกหรือไม่จากแฟล็กที่กระจัดกระจาย ConformanceMode::isTagged(), isAccessibility(), isArchival(), pdfaPart(), pdfaConformanceLetter() และ requiresPdf17() แต่ละตัวคืนคำตอบที่มีชนิดข้อมูลซึ่งตัวเขียนอ่านได้โดยตรง แค็ตตาล็อก /MarkInfo สายตระกูลส่วนหัวไฟล์ และตัวระบุ pdfaid ของ Extensible Metadata Platform (XMP) จึงยังสอดคล้องกับเจตนาที่ประกาศไว้

โปรดอ่านขอบเขตการรองรับอย่างตรงตัว NextPDF Core ปล่อย โครงสร้างที่มาตรฐานเหล่านี้กำหนด ISO 19005-4:2020 §6.7.3 ระบุสคีมาการระบุตัวตนที่บันทึกว่าไฟล์อ้างถึง PDF/A ตัวแปรใด ISO 19005-4:2020 ระบุว่าการพิจารณาความสอดคล้องเป็นไปตามที่กำหนดไว้ในข้อ 5 ของมาตรฐาน กล่าวคือเทียบกับข้อกำหนดเชิงบรรทัดฐานโดยเครื่องมือตรวจสอบ ไม่ใช่โดยไลบรารีที่ผลิตไฟล์ ISO 14289-2:2024 §6 กำหนดกรอบความสอดคล้องเป็นคุณสมบัติที่ ไฟล์ ต้องเป็นไปตาม การตั้งโหมดของ NextPDF เป็นอินพุตที่จำเป็นสำหรับไฟล์ที่สอดคล้อง แต่ตัวมันเองไม่ใช่ผลลัพธ์ความสอดคล้อง

แนวทางนี้เป็นไปตามหลักการ Verified เทียบกับ Claimed เช่นเดียวกับเมทริกซ์การรองรับ Cascading Style Sheets (CSS) ความสามารถจะเป็น Verified ได้ก็ต่อเมื่อมีทั้งการรันทดสอบหรือออราเคิลที่ผ่าน และมีข้ออ้างอิงที่ระบุไว้ นอกเหนือจากนั้นทั้งหมดคือสิ่งที่ไลบรารี ปล่อย ออกมา ซึ่งมีประโยชน์แต่ไม่ใช่การรับประกันความสอดคล้อง ความสอดคล้องเป็นเรื่องของไฟล์สุดท้ายและตัวตรวจสอบความถูกต้อง ไม่ใช่คำสัญญาจากไลบรารี ตรวจสอบเอาต์พุตด้วย veraPDF (ดู “Conformance” ด้านล่าง)

ขอบเขตที่สองมีความสำคัญต่องานจัดเก็บถาวร การสร้าง 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) จึงทำงานได้ แต่ Core ไม่สร้างไฟล์ 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 เป็นชนิดค่าบริสุทธิ์ การแปลงค่ากรณี enum และการจัดส่ง match เป็น O(1) โดยไม่มีการจัดสรรหน่วยความจำเพิ่มเติมนอกเหนือจากอ็อบเจกต์นโยบายที่เปลี่ยนแปลงไม่ได้ สิ่งเหล่านี้ไม่เพิ่มต้นทุนที่วัดได้ให้กับเส้นทางการเขียน ตัวเขียนเป็นส่วนที่ใช้งบประมาณของโมดูล ไม่ใช่ตัวจำแนก (wall_ms: 1500) ออราเคิล veraPDF เป็นขั้นตอนการรวมต่อเนื่อง (CI) แบบนอกแถบ ไม่ใช่ส่วนหนึ่งของการสร้างเอกสาร

สวิตช์แบบเข้มงวดบน ConformancePolicy ควบคุมพฤติกรรมความปลอดภัยแบบ fail-closed ได้แก่ 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โปรไฟล์ที่ Verified: pdfua.strict ตรวจสอบโดยออราเคิล veraPDF (php oracle/run.php pdfua.strict) เมื่อมีไบนารี veraPDF อยู่ (เกตแบบเลือกใช้)
ISO 19005-4:2020 (PDF/A-4)§6.7.3ปล่อยตัวจำแนก pdfaid:part / pdfa:conformance ผ่าน ConformanceModeClaimed (การปล่อยตัวจำแนก ผ่านการทดสอบหน่วย); การสร้างไฟล์ PDF/A-4 เป็น Premium เท่านั้น
ISO 32000-2:2020 (PDF 2.0)§7.5.2โครงสร้าง catalog/document พื้นฐานClaimed (พฤติกรรมเอนจินพื้นฐาน)

การรองรับไม่ใช่ความสอดคล้อง NextPDF Core ปล่อย โครงสร้างการระบุตัวตน PDF/UA-2 และ PDF/A-4 โดยมีหลักฐานการนำไปใช้ใน tests/Unit/Conformance/ มีเพียงตัวตรวจสอบความถูกต้องที่รันโปรไฟล์ที่ตรงกันเท่านั้นที่ยืนยันได้ว่า ไฟล์ สอดคล้องกับ PDF/A-4 หรือ PDF/UA-2 ตาม ISO 19005-4:2020 ข้อ 5 การพิจารณาความสอดคล้องเป็นหน้าที่ของตัวตรวจสอบความถูกต้อง ไม่ใช่ของไลบรารีที่ผลิตไฟล์

การกั้นด้วย veraPDF ระบุข้อกำหนดของตัวเองไว้อย่างชัดเจน ออราเคิล (oracle/run.php, oracle/lib/OracleRunner.php) เรียกออกไปยังอิมเมจ Docker ของ veraPDF ที่ตรึงเวอร์ชันไว้ เมื่อไม่มี Docker หรืออิมเมจ ตัวรันจะออกด้วยรหัส 2 (ความล้มเหลวของโครงสร้างพื้นฐาน) และไม่ตรวจสอบสิ่งใด ดังนั้นโปรไฟล์ pdfua.strict จึงเป็นเกตความสอดคล้องแบบเลือกใช้ โปรไฟล์นี้พิสูจน์ความสอดคล้องได้เฉพาะบนเครื่องที่มีไบนารี veraPDF อยู่เท่านั้น NextPDF ไม่มาพร้อมตัวตรวจสอบความถูกต้องแบบฝังตัว และไม่อ้างความสอดคล้องเมื่อไม่มีตัวตรวจสอบ

ข้ออ้างอิงถูกถอดความจากคอร์ปัสด้านการปฏิบัติตามข้อกำหนดของ NextPDF ไดเจสต์ reference_id แบบเต็ม 64 อักขระถูกบันทึกไว้ใน frontmatter ของหน้าและใน _normative-evidence-conf.md