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

Pro รุ่นความเสถียร: ทดลอง

สถานะความสามารถแบบ preview ของ C2PA

สถานะความสามารถแบบ preview ไม่เคยเป็น GA หน้านี้ระบุสิ่งที่พื้นผิว C2PA ทำในวันนี้ในฐานะ preview มันไม่ใช่การอ้างความสอดคล้อง ไม่ใช่การรับรอง และ ไม่ใช่ข้อความว่า NextPDF ผลิตไฟล์ที่ลงนาม C2PA พื้นผิวนี้เป็น preview และไม่ เคยถูกอธิบายว่าพร้อมใช้งานทั่วไป

NextPDF Pro เปิดเผยพื้นผิว preview ของ Content Credentials (C2PA) ผ่าน C2paCapabilityStatus หน้านี้คือขอบเขตที่ตรงไปตรงมาสำหรับพื้นผิวนั้น: สิ่งที่พร้อม ใช้งานเสมอ สิ่งที่อยู่หลังแฟล็ก draft แบบ opt-in และเหตุใดจึงไม่มีการอ้างสถานะปลายทาง

สองชั้น: seam ที่เสถียร กับการสังเคราะห์ที่ติดแฟล็ก

หัวข้อที่มีชื่อว่า “สองชั้น: seam ที่เสถียร กับการสังเคราะห์ที่ติดแฟล็ก”

พื้นผิวมีสองชั้นที่แยกกันอย่างชัดเจน และความแตกต่างคือประเด็นทั้งหมดของขอบเขต:

  • พร้อมใช้งานเสมอ — seam ที่เสถียร ManifestStore และอินเทอร์เฟซ C2paManifestEmbedder เป็น seam ที่ตรึงไว้และเป็นกลางต่อผู้ขาย พวกมันสามารถ บรรจุ Manifest Store ได้ ทั้งสองทาง: embed() เขียนไบต์ของ Store ที่ผู้เรียกใช้ จัดหามาลงในไฟล์ PDF และ extract() แยกวิเคราะห์ Store กลับออกมา (คืน null เมื่อไม่มี) seam นี้ ไม่ทำการสังเคราะห์ claim ใด ๆ — มันไม่เคยประกอบ assertion หรือ claim ด้วยตัวเอง; มันย้าย ManifestStore ที่ทึบแสงซึ่งผู้เรียกใช้ ถืออยู่แล้ว
  • อยู่หลังแฟล็ก opt-in — การสังเคราะห์ claim การ สร้าง Manifest Store จริง ๆ (การประกอบ claim และ assertion ของ ingredient-hash) อยู่ใน ExperimentalC2paEmbedder เท่านั้น โดย gate ไว้หลังแฟล็ก env ที่เปิดเป็นค่าเริ่มต้น ปิด นี่คือส่วนที่มีรูปแบบ draft และสามารถเปลี่ยนแปลงได้โดยไม่ต้องแจ้งล่วงหน้า

ดังนั้นข้อความที่แม่นยำคือ: การดึงและการบรรจุไบต์เข้าถึงได้เสมอ; การสังเคราะห์เนื้อหา ของ manifest เข้าถึงได้เฉพาะเมื่อแฟล็ก preview ถูกเปิดใช้งานอย่างชัดเจน

การตัดสินใจที่เป็นแกนหลักแยก seam การขนส่งที่เสถียรออกจากเส้นทางการสังเคราะห์ที่ ผันผวน ไม่ใช่ให้ embedder ตัวเดียวทำทุกอย่าง โปรไฟล์ C2PA-PDF ยังคงเป็นของ working group ภายนอกและไม่ถูกตรึง Claim Signature box ของมัน (c2cs ซึ่งเป็น โครงสร้าง COSE_Sign1) เป็นส่วนที่มีแนวโน้มจะ drift มากที่สุด ดังนั้นการสังเคราะห์จึง ละ box นั้นและอยู่หลังแฟล็กที่เปิดเป็นค่าเริ่มต้นปิด ในขณะที่การดึงและบรรจุไม่ขึ้นกับ ฟิลด์ที่ไม่ถูกตรึงใด ๆ และยังเข้าถึงได้สำหรับทุกคน ออบเจกต์สถานะเปิดเผยความสมบูรณ์ เป็นข้อมูล โดย generallyAvailable และ conformanceClaimed ถูกตั้งตายตัวเป็น false ดังนั้นผู้เรียกใช้จึงไม่สามารถเข้าใจผิดว่าเจตนาของผู้ผลิตเป็นผลที่ตรวจสอบแล้ว การแยก นั้นทำให้ทีมสามารถนำ seam ที่คงทนไปใช้ตอนนี้และเพิ่ม adapter ที่ลงนามภายหลัง โดย ไม่มีคำสัญญาเรื่องรูปแบบ wire ที่ NextPDF ยังไม่สามารถรักษาได้

เบื้องหลังการออกแบบ: ความสอดคล้องที่คุณส่งมอบให้ผู้ตรวจสอบได้

C2paCapabilityStatus รายงานสถานะของพื้นผิวอย่างชัดเจนในรูปข้อมูล ไม่ใช่ร้อยแก้ว พร็อพเพอร์ตี generallyAvailable และ conformanceClaimed ของมันถูกตั้งค่าตายตัว เป็น false และยังคงเป็น false ไม่ว่าจะตั้งแฟล็กอย่างไร; การเปิด preview พลิกเฉพาะ previewEnabled โทเคน maturity คือป้ายกำกับที่ไม่อ้างสิทธิ์ preview-draft และ specPin บันทึก draft commit ที่ตรึงไว้ ผู้เรียกใช้อ่านว่า “preview” ไม่ใช่ “ลงนามและ ตรวจสอบแล้ว”

use NextPDF\Pro\Compliance\C2pa\C2paCapabilityStatus;
// Reads the env flag live; performs no I/O.
$status = C2paCapabilityStatus::current();
$status->previewEnabled; // bool — true only if the opt-in env flag is set
$status->generallyAvailable; // false (always)
$status->conformanceClaimed; // false (always)
$status->maturity; // 'preview-draft'
$status->specPin; // '4e2afed8' (pinned draft commit, short)
$status->envGate; // 'NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT'
echo $status->summary();
// "C2PA preview-draft surface is present but switched off;
// the C2PA-PDF profile is not yet final."

ข้อกำหนด C2PA ดูแลโดย working group ภายนอก และโปรไฟล์ที่ NextPDF จะมุ่งเป้ายัง ไม่ถูกตรึง เนื่องจากโปรไฟล์ไม่ถูกตรึง preview จึงจงใจไม่อ้างสถานะปลายทาง เมื่อ โปรไฟล์ของ working group เสถียร สิ่งที่จะเปลี่ยนคือสถานะของพื้นผิว — ไม่ใช่การตลาด ของมัน

opt-in คือตัวแปรสภาพแวดล้อมของกระบวนการตัวเดียว NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT มันถูกอ่านสด ๆ และเปรียบเทียบ อย่างเข้มงวด เทียบกับสตริง "1" — ค่าอื่นใด (รวมถึง 0, true, yes, สตริงว่าง หรือไม่มี) จะถูกถือว่า OFF ใบอนุญาต Pro เพียง อย่างเดียว ไม่ เปิดใช้มัน; ผู้ปฏิบัติงานต้อง opt in อย่างมีสติ

// Opt in for the current process BEFORE constructing the embedder.
putenv('NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT=1');
use NextPDF\Pro\Compliance\C2pa\Experimental\ExperimentalC2paEmbedder;
$embedder = new ExperimentalC2paEmbedder();
// Synthesise a draft-shaped Manifest Store binding the host PDF by SHA-256.
$pdfBytes = file_get_contents('input.pdf');
$store = $embedder->buildManifestStore($pdfBytes, 'my-app/1.0.0');
// The result is an opaque ManifestStore; $store->toBytes() is its serialisation.

ในการ deploy จริง ตั้งแฟล็กตอน boot (ไม่ใช่ผ่าน putenv() ในขณะรัน), gate มันที่ การ opt-in โดยมนุษย์อย่างชัดเจน และตรวจสอบสถานะความสามารถก่อนแตะตัว embedder ที่ทดลอง เพื่อให้เส้นทาง draft ถูกเข้าถึงโดยตั้งใจเท่านั้น

use NextPDF\Pro\Compliance\C2pa\C2paCapabilityStatus;
use NextPDF\Pro\Compliance\C2pa\Experimental\ExperimentalC2paEmbedder;
// Set NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT=1 in the environment at process boot.
$status = C2paCapabilityStatus::current();
if (!$status->previewEnabled) {
// Flag off: do NOT instantiate the experimental embedder — its
// constructor would throw. Fall back to your non-preview path.
return;
}
// Surface the draft pin to the operator. The bytes are transient:
// re-embed once a stable adapter ships. Run `composer c2pa:draft-status`
// in CI to fail the build if the pinned snapshot goes stale.
$pinnedDraft = ExperimentalC2paEmbedder::SPEC_PIN_SHA; // 4e2afed8…
$pinnedDate = ExperimentalC2paEmbedder::SPEC_PIN_DATE; // 2026-04-26
$embedder = new ExperimentalC2paEmbedder();
$store = $embedder->buildManifestStore($pdfBytes, 'my-app/1.0.0');

ไม่มี fallback ที่เงียบ ๆ หาก ExperimentalC2paEmbedder ถูกสร้างขณะที่ NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT ไม่ใช่ "1" พอดี ตัวสร้างจะโยน LogicException ซึ่งข้อความระบุชื่อแฟล็ก ตัวแปร env และ SHA/วันที่ของ draft ที่ตรึง ไว้ ผู้เรียกใช้ไม่สามารถ serialize ไบต์ที่มีรูปแบบ draft ลงในไฟล์ PDF สำหรับใช้งานจริง โดยบังเอิญเพียงเพราะถือใบอนุญาต Pro

เส้นทาง extract ที่เสถียรก็ fail-closed เช่นกัน แต่ต่างกัน: extract() คืน null เมื่อ ไม่มี Manifest Store (กรณีทั่วไป ซึ่งคงให้ราคาถูกและปลอดข้อยกเว้น) และโยนคลาสย่อย ของ C2paExceptionJumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededException หรือ MalformedJumbfException — เมื่อ Store มีอยู่ แต่ละเมิดอินแวเรียนต์การเสริมความแข็งแกร่งเชิงปฏิปักษ์ของตัวแยกวิเคราะห์ (ความลึก cycle ขนาด จำนวน) สิ่งเหล่านี้ไม่เคยถูกกลืนอย่างเงียบ ๆ

ภาษาต่อไปนี้ ไม่ ถูกใช้สำหรับพื้นผิวนี้ ตามนโยบาย และไม่ควรปรากฏในเอกสาร UI หรือการตลาดใด ๆ ที่มาจากมัน:

  • “C2PA conformant” หรือ “C2PA compliant”
  • “C2PA certified”
  • “C2PA signed” ในฐานะความสามารถที่เสร็จสิ้นและยืนยันแล้ว
  • “GA” / “generally available”

สิ่งที่พื้นผิวเป็นจริงอย่างตรงไปตรงมา: seam ที่เสถียรซึ่งสามารถแยกวิเคราะห์ (extract) และบรรจุ (embed) C2PA Manifest Store บวกกับตัว embedder ที่ทดลองซึ่งเปิดเป็นค่า เริ่มต้นปิดและ สังเคราะห์ เนื้อหา manifest ที่มีรูปแบบ draft และออบเจกต์สถานะที่ รายงานสถานะ preview ของตัวเอง สิ่งที่มันไม่ใช่: ผู้ผลิต credential C2PA ที่ผ่านการ รับรองและตรวจสอบได้ ที่สำคัญ ตัว embedder ที่ทดลองจงใจละ Claim Signature (c2cs) box — ส่วน COSE_Sign1 ของข้อกำหนดที่มีแนวโน้มจะ drift มากที่สุด — ดังนั้น แม้เปิดแฟล็ก เอาต์พุตก็เป็นไบต์ที่ไม่ลงนามและมีรูปแบบ draft โปรไฟล์ของ working group ไม่ถูกตรึง; ขอบเขตคือประเด็น

รูปแบบ wire ที่ตัว embedder ที่ทดลองส่งออกถูกตรึงไว้กับ draft commit ของ c2pa-org/specifications (SPEC_PIN_SHA = 4e2afed8…, ลงวันที่ 2026-04-26) เปิดเผยเป็นค่าคงที่สาธารณะเพื่อให้ผู้เรียกใช้ตรึง SHA ที่พวกเขาคาดหวังได้

สัญลักษณ์บทบาท
C2paCapabilityStatusออบเจกต์ค่าสถานะที่ตรงไปตรงมาและอ่านได้ด้วยเครื่อง current() อ่านแฟล็ก env สด ๆ; generallyAvailable / conformanceClaimed เป็น false เสมอ; summary() ไม่บรรจุการอ้าง GA/ความสอดคล้อง
ManifestStoreออบเจกต์ค่า Manifest Store ที่เปลี่ยนแปลงไม่ได้ ชนิด seam ที่เสถียร; บรรจุไบต์ทั้งสองทาง ไม่มี accessor ระดับ claim พร้อมใช้งานเสมอ
C2paManifestEmbedderSPI ที่ตรึงไว้และเป็นกลางต่อผู้ขาย: embed() / extract() ไม่มีการสังเคราะห์ claim extract() คืน null เมื่อไม่พบ พร้อมใช้งานเสมอ
ExperimentalC2paEmbedderการสังเคราะห์ที่เปิดเป็นค่าเริ่มต้นปิด buildManifestStore() ประกอบ draft manifest; ตัวสร้างโยน LogicException เว้นแต่แฟล็ก env เป็น "1" พอดี
Feature::PREVIEW_C2PA_DRAFTแฟล็ก opt-in ที่กำหนดขอบเขต ENV_PREVIEW_C2PA_DRAFT = NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT; isEnabled() เข้มงวด === '1'
  • เปิดเป็นค่าเริ่มต้นปิด, opt-in เข้มงวด การสังเคราะห์อยู่หลัง NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT อ่านอย่างเข้มงวดเป็น === '1' อย่างอื่น คือ OFF; ใบอนุญาต Pro เพียงอย่างเดียวไม่เปิดใช้มัน
  • Fail-closed ในเวลาสร้าง new ExperimentalC2paEmbedder() โยน LogicException เมื่อแฟล็กปิด — ไม่เคยเป็น no-op ที่เงียบ ๆ
  • เอาต์พุตไม่ลงนามและเป็น transient แม้เปิดแฟล็ก Claim Signature box ก็ถูกละ; ถือว่าไบต์มีรูปแบบ draft และ re-embed เมื่อ adapter ที่เสถียร ship
  • การตรวจสอบความเก่าของ pin รัน composer c2pa:draft-status (exit 0 fresh / 1 soft-warn / 2 hard-fail) ใน CI เพื่อตรวจจับเมื่อ snapshot ของ draft ที่ตรึงไว้ เก่าเกินไป
  • ไม่มีคำตัดสินความสอดคล้อง ออบเจกต์สถานะรายงานสถานะ preview ไม่ใช่ผล ความสอดคล้อง ตัวตรวจสอบภายนอกและโปรไฟล์ working group ที่ถูกตรึงจะเป็น ข้อกำหนดก่อนสำหรับการอภิปรายความสอดคล้องใด ๆ และไม่มีการสันนิษฐานทั้งคู่
  • วินัยทางภาษา อย่าอธิบายเอาต์พุตว่า “C2PA signed”, “conformant”, “compliant”, “certified” หรือ “GA” ใช้ “preview-capability status”

พื้นผิว preview ไม่ใช่การควบคุมด้านความปลอดภัย การบรรจุหรือสังเคราะห์ draft Manifest Store ไม่เหมือนกับการผลิตหรือตรวจสอบ attestation — และตัว embedder ที่ ทดลองละ Claim Signature box ทั้งหมด ดังนั้นเอาต์พุตของมันจึงไม่ลงนามโดยการ ออกแบบ อย่าพึ่งพา preview นี้สำหรับการรับประกันที่มา (provenance) ในการใช้งานจริง; มันไม่ยืนยันว่า credential ถูกต้องหรือไฟล์ถูกลงนาม

พื้นผิวนี้ ไม่ อ้างความสอดคล้องใด ๆ โปรไฟล์ C2PA ดูแลโดย working group ภายนอก และไม่ถูกตรึง; NextPDF จึงระบุสถานะความสามารถแบบ preview และขอบเขต draft/working-group ไม่ใช่ความสอดคล้องหรือการรับรอง ไม่มีการคัดลอกข้อความ มาตรฐานซ้ำ

หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว public API ที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และคำนำหน้า ticket อยู่นอกขอบเขต