Lewati ke konten
getnextpdf.com

Pro edisistabilitas: Eksperimental

Status kapabilitas-preview C2PA

Status kapabilitas-preview. Tidak pernah GA. Halaman ini menyatakan apa yang dilakukan permukaan C2PA hari ini sebagai preview. Ini bukan klaim konformitas, bukan sertifikasi, dan bukan pernyataan bahwa NextPDF menghasilkan berkas yang ditandatangani-C2PA. Permukaan ini adalah preview dan tidak pernah dideskripsikan sebagai tersedia umum.

NextPDF Pro mengekspos permukaan preview Content Credentials (C2PA) melalui C2paCapabilityStatus. Halaman ini adalah batas yang jujur untuk permukaan tersebut: apa yang selalu tersedia, apa yang tetap di balik flag draf opt-in, dan mengapa tidak ada klaim status-akhir yang dibuat.

Dua lapisan: sambungan stabil vs. sintesis ber-flag

Bagian berjudul “Dua lapisan: sambungan stabil vs. sintesis ber-flag”

Permukaan ini memiliki dua lapisan yang terpisah jelas, dan perbedaannya adalah inti dari batas tersebut:

  • Selalu tersedia — sambungan stabil. ManifestStore dan antarmuka C2paManifestEmbedder adalah sambungan yang beku dan netral-vendor. Keduanya dapat membawa Manifest Store dua arah: embed() menulis byte sebuah Store yang dipasok pemanggil ke dalam PDF, dan extract() mengurai sebuah Store kembali keluar (mengembalikan null saat tidak ada). Sambungan ini tidak melakukan sintesis claim — ia tidak pernah merakit assertion atau claim sendiri; ia memindahkan ManifestStore opak yang sudah dipegang pemanggil.
  • Di balik flag opt-in — sintesis claim. Membangun sebuah Manifest Store yang sesungguhnya (merakit claim dan assertion ingredient-hash) hanya ada di ExperimentalC2paEmbedder, digerbangi di balik flag env default-mati. Inilah bagian yang berbentuk-draf dan dapat-berubah-tanpa-pemberitahuan.

Jadi pernyataan presisnya adalah: ekstraksi dan pembawaan-byte selalu dapat dijangkau; sintesis isi manifest dapat dijangkau hanya saat flag preview diaktifkan secara eksplisit.

Keputusan inti memisahkan sambungan transport yang stabil dari jalur sintesis yang volatil, bukan satu embedder yang melakukan segalanya. Profil C2PA-PDF masih dimiliki oleh kelompok kerja eksternal dan belum beku. Box Claim Signature-nya (c2cs, sebuah struktur COSE_Sign1) adalah bagian yang paling mungkin bergeser. Jadi sintesis menghilangkan box itu dan berada di balik flag default-mati, sementara extract-and-carry tidak bergantung pada field yang belum-beku dan tetap dapat dijangkau oleh semua orang. Objek status mengekspos maturity sebagai data, dengan generallyAvailable dan conformanceClaimed yang di-hardcode false, sehingga pemanggil tidak dapat mengira niat produsen sebagai hasil yang tervalidasi. Pemisahan itu memungkinkan tim mengadopsi sambungan yang tahan lama sekarang dan menambahkan adapter tersandatangan nanti, tanpa janji format-wire yang belum dapat dipenuhi NextPDF.

Latar belakang desain: Kepatuhan yang dapat Anda serahkan ke auditor.

C2paCapabilityStatus melaporkan status permukaan secara eksplisit sebagai data, bukan prosa. Properti generallyAvailable dan conformanceClaimed-nya di-hardcode false dan tetap false terlepas dari flag; mengaktifkan preview hanya membalik previewEnabled. Token maturity adalah label non-klaim preview-draft, dan specPin mencatat commit draf yang dipatok. Pemanggil membaca “preview”, bukan “ditandatangani dan terverifikasi”.

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."

Spesifikasi C2PA dipelihara oleh kelompok kerja eksternal, dan profil yang akan ditargetkan NextPDF belum beku. Karena profil belum beku, preview ini sengaja tidak membuat klaim status-akhir. Saat profil kelompok kerja stabil, status permukaan — bukan pemasarannya — yang akan berubah.

Opt-in-nya adalah satu variabel lingkungan-proses, NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT. Ia dibaca secara live dan dibandingkan secara ketat terhadap string "1" — nilai lain apa pun (termasuk 0, true, yes, string kosong, atau ketiadaannya) diperlakukan sebagai MATI. Lisensi Pro saja tidak mengaktifkannya; operator harus secara sadar 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.

Dalam penyebaran nyata, setel flag pada boot (bukan melalui putenv() saat runtime), gerbangi pada opt-in manusia yang eksplisit, dan periksa status kapabilitas sebelum menyentuh embedder eksperimental sehingga jalur draf dicapai hanya secara sengaja.

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');

Tidak ada fallback diam. Jika ExperimentalC2paEmbedder dikonstruksi saat NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT tidak persis "1", konstruktor melempar LogicException yang pesannya menamai flag, variabel env, dan SHA/tanggal draf yang dipatok. Pemanggil tidak dapat secara tak sengaja menserialisasi byte berbentuk-draf ke dalam PDF produksi hanya dengan memegang lisensi Pro.

Jalur extract stabil juga fail-closed, tetapi secara berbeda: extract() mengembalikan null saat tidak ada Manifest Store (kasus umum, dijaga murah dan bebas-eksepsi), dan melempar subclass C2paExceptionJumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededException, atau MalformedJumbfException — saat sebuah Store ada tetapi melanggar invarian pengerasan-adversarial parser (kedalaman, siklus, ukuran, hitungan). Ini tidak pernah diam-diam ditelan.

Bahasa berikut tidak dipakai untuk permukaan ini, sebagai kebijakan, dan tidak boleh muncul dalam dokumentasi, UI, atau pemasaran apa pun yang diturunkan darinya:

  • “C2PA conformant” atau “C2PA compliant”.
  • “C2PA certified”.
  • “C2PA signed” sebagai kapabilitas yang sudah jadi dan ditegaskan.
  • “GA” / “generally available”.

Apa yang secara jujur merupakan permukaan ini: sambungan stabil yang dapat mengurai (extract) dan membawa (embed) sebuah Manifest Store C2PA, plus embedder eksperimental default-mati yang mensintesis isi manifest berbentuk-draf, dan sebuah objek status yang melaporkan keadaan preview-nya sendiri. Apa yang bukan: penghasil credential C2PA yang terbukti dan dapat-diverifikasi. Khususnya, embedder eksperimental sengaja menghilangkan box Claim Signature (c2cs) — bagian COSE_Sign1 dari spek yang paling mungkin bergeser — sehingga bahkan dengan flag aktif, keluarannya adalah byte berbentuk-draf yang tak-ditandatangani. Profil kelompok kerja belum beku; batasnya adalah intinya.

Format wire yang dipancarkan embedder eksperimental dipatok ke commit draf dari c2pa-org/specifications (SPEC_PIN_SHA = 4e2afed8…, bertanggal 2026-04-26), diekspos sebagai konstanta publik agar pemanggil dapat memilih SHA yang mereka harapkan.

SimbolPeran
C2paCapabilityStatusObjek nilai status yang jujur dan dapat-dibaca-mesin. current() membaca flag env secara live; generallyAvailable / conformanceClaimed selalu false; summary() tidak membawa klaim GA/konformitas.
ManifestStoreObjek nilai Manifest Store yang immutable. Tipe sambungan stabil; membawa byte dua arah. Tidak ada akses tingkat-claim. Selalu tersedia.
C2paManifestEmbedderSPI yang beku dan netral-vendor: embed() / extract(). Tidak ada sintesis claim. extract() mengembalikan null saat tidak ditemukan. Selalu tersedia.
ExperimentalC2paEmbedderSintesis default-mati. buildManifestStore() merakit manifest draf; konstruktor melempar LogicException kecuali flag env persis "1".
Feature::PREVIEW_C2PA_DRAFTFlag opt-in tercakup. ENV_PREVIEW_C2PA_DRAFT = NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT; isEnabled() bersifat ketat === '1'.
  • Default-mati, opt-in ketat. Sintesis berada di balik NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT, dibaca ketat sebagai === '1'. Apa pun selainnya MATI; lisensi Pro saja tidak mengaktifkannya.
  • Fail-closed pada waktu-konstruksi. new ExperimentalC2paEmbedder() melempar LogicException saat flag mati — tidak pernah no-op diam.
  • Keluaran tak-ditandatangani dan transien. Bahkan dengan flag aktif, box Claim Signature dihilangkan; perlakukan byte sebagai berbentuk-draf dan embed-ulang begitu adapter stabil dikirimkan.
  • Pemeriksaan keusangan pin. Jalankan composer c2pa:draft-status (exit 0 segar / 1 peringatan-lunak / 2 gagal-keras) di CI untuk mendeteksi saat snapshot draf yang dipatok menua.
  • Tidak ada verdict konformitas. Objek status melaporkan keadaan preview, bukan hasil konformitas. Sebuah validator eksternal dan profil kelompok kerja yang beku akan menjadi prasyarat bagi diskusi konformitas apa pun, dan tidak satu pun diasumsikan.
  • Disiplin bahasa. Jangan deskripsikan keluaran sebagai “C2PA signed”, “conformant”, “compliant”, “certified”, atau “GA”. Gunakan “status kapabilitas-preview”.

Sebuah permukaan preview bukanlah kontrol keamanan. Membawa atau mensintesis Manifest Store draf tidak sama dengan menghasilkan atau memverifikasi sebuah attestation — dan embedder eksperimental menghilangkan box Claim Signature sepenuhnya, sehingga keluarannya tak-ditandatangani secara konstruksi. Jangan mengandalkan preview ini untuk jaminan provenance dalam produksi; ia tidak menegaskan bahwa sebuah credential valid atau bahwa sebuah berkas ditandatangani.

Permukaan ini tidak membuat klaim konformitas. Profil C2PA dipelihara oleh kelompok kerja eksternal dan belum beku; oleh karena itu NextPDF menyatakan status kapabilitas-preview dan batas draf/kelompok-kerja, bukan konformitas atau sertifikasi. Tidak ada teks standar yang direproduksi.

Halaman ini hanya mendokumentasikan perilaku yang dapat diamati secara eksternal dan permukaan API publik yang didukung. Jalur namespace internal, kelas helper, tabel mekanisme, nama berkas runbook, dan prefiks tiket berada di luar cakupan.