Ga naar inhoud
getnextpdf.com

Pro editiestabiliteit: Experimenteel

C2PA preview-vermogensstatus

Preview-vermogensstatus. Nooit GA. Deze pagina vermeldt wat het C2PA-oppervlak vandaag doet als een preview. Het is geen conformiteitsclaim, geen certificering, en geen verklaring dat NextPDF C2PA-ondertekende bestanden produceert. Het oppervlak is een preview en wordt nooit beschreven als algemeen beschikbaar.

NextPDF Pro stelt een Content Credentials (C2PA)-previewoppervlak beschikbaar via C2paCapabilityStatus. Deze pagina is de eerlijke grens voor dat oppervlak: wat altijd beschikbaar is, wat achter een opt-in draft-vlag blijft, en waarom geen eindstatusclaim wordt gemaakt.

Twee lagen: stabiele naad vs. gevlagde synthese

Sectie met titel “Twee lagen: stabiele naad vs. gevlagde synthese”

Het oppervlak heeft twee duidelijk gescheiden lagen, en het onderscheid is het hele punt van de grens:

  • Altijd beschikbaar — de stabiele naad. ManifestStore en de C2paManifestEmbedder-interface zijn een bevroren, leverancierneutrale naad. Ze kunnen een Manifest Store beide kanten op dragen: embed() schrijft de bytes van een door de aanroeper geleverde Store in een PDF, en extract() parseert een Store er weer uit (en geeft null terug wanneer er geen aanwezig is). Deze naad doet geen claim-synthese — hij stelt nooit zelf assertions of claims samen; hij verplaatst een opake ManifestStore die de aanroeper al bezit.
  • Achter de opt-in-vlag — claim-synthese. Het daadwerkelijk bouwen van een Manifest Store (het samenstellen van de claim en de ingredient-hash-assertion) leeft alleen in ExperimentalC2paEmbedder, gegatet achter een standaard-uitgeschakelde env-vlag. Dit is het draftvormige, zonder voorafgaande kennisgeving brekende deel.

De precieze verklaring is dus: extractie en byte-dragen zijn altijd bereikbaar; synthese van de manifestinhoud is alleen bereikbaar wanneer de preview-vlag expliciet is ingeschakeld.

De dragende beslissing splitst een stabiele transportnaad van het volatiele synthesepad, niet één embedder die alles doet. Het C2PA-PDF-profiel is nog steeds eigendom van een externe werkgroep en is niet bevroren. De Claim Signature-box (c2cs, een COSE_Sign1-structuur) is het deel dat het meest waarschijnlijk afdrijft. Daarom laat de synthese die box weg en leeft ze achter een standaard-uitgeschakelde vlag, terwijl extract-en-dragen van geen niet-bevroren veld afhangt en voor iedereen bereikbaar blijft. Het statusobject stelt maturiteit bloot als data, met generallyAvailable en conformanceClaimed hard-coded false, zodat aanroepers producentintentie niet kunnen verwarren met een gevalideerd resultaat. Die scheiding laat teams de duurzame naad nu adopteren en later een ondertekende adapter toevoegen, zonder een wire-formaatbelofte die NextPDF nog niet kan waarmaken.

Ontwerpachtergrond: Compliance die je aan een auditor kunt overhandigen.

C2paCapabilityStatus rapporteert de status van het oppervlak expliciet als data, niet als proza. De eigenschappen generallyAvailable en conformanceClaimed zijn hard-coded false en blijven false ongeacht de vlag; het inschakelen van de preview schakelt alleen previewEnabled om. Het maturity-token is het niet-claimende label preview-draft, en specPin legt de vastgezette draft-commit vast. Een aanroeper leest “preview”, niet “ondertekend en geverifieerd”.

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

De C2PA-specificatie wordt onderhouden door een externe werkgroep, en het profiel waar NextPDF op zou richten is niet bevroren. Omdat het profiel niet bevroren is, maakt de preview bewust geen eindstatusclaim. Wanneer het werkgroepprofiel stabiliseert, is de status van het oppervlak — niet de marketing — wat zou veranderen.

De opt-in is één procesomgevingsvariabele, NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT. Hij wordt live gelezen en strikt vergeleken met de string "1" — elke andere waarde (inclusief 0, true, yes, de lege string, of afwezigheid) wordt behandeld als UIT. Een Pro-licentie alleen schakelt het niet in; de operator moet bewust opt-in geven.

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

Stel in een echte deployment de vlag in bij boot (niet via putenv() tijdens runtime), gate hem op een expliciete menselijke opt-in, en controleer de vermogensstatus voordat je de experimentele embedder aanraakt, zodat het draftpad alleen met opzet wordt bereikt.

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

Er is geen stille terugval. Als ExperimentalC2paEmbedder wordt geconstrueerd terwijl NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT niet exact "1" is, werpt de constructor een LogicException waarvan het bericht de vlag, de env-var en de vastgezette draft-SHA/-datum benoemt. Een aanroeper kan niet per ongeluk draftvormige bytes in een productie-PDF serialiseren door slechts een Pro-licentie te houden.

Het stabiele extractiepad faalt ook gesloten, maar anders: extract() geeft null terug wanneer er geen Manifest Store aanwezig is (het gewone geval, goedkoop en exception-vrij gehouden), en werpt een subklasse van C2paExceptionJumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededException of MalformedJumbfException — wanneer er wel een Store aanwezig is maar deze de adversarial-hardening-invarianten van de parser schendt (diepte, cyclus, grootte, aantal). Deze worden nooit stilletjes ingeslikt.

De volgende taal wordt niet gebruikt voor dit oppervlak, als beleid, en zou niet mogen verschijnen in enige documentatie, UI of marketing die ervan is afgeleid:

  • “C2PA conformant” of “C2PA compliant”.
  • “C2PA certified”.
  • “C2PA signed” als een afgerond, beweerd vermogen.
  • “GA” / “generally available”.

Wat het oppervlak eerlijk is: een stabiele naad die een C2PA Manifest Store kan parseren (extract) en dragen (embed), plus een standaard-uitgeschakelde experimentele embedder die draftvormige manifestinhoud synthetiseert, en een statusobject dat zijn eigen previewstatus rapporteert. Wat het niet is: een producent van geattesteerde, verifieerbare C2PA-credentials. Met name laat de experimentele embedder bewust de Claim Signature (c2cs)-box weg — het COSE_Sign1 -deel van de spec dat het meest waarschijnlijk afdrijft — dus zelfs met de vlag aan is de uitvoer ongetekende, draftvormige bytes. Het werkgroepprofiel is niet bevroren; de grens is het punt.

Het wire-formaat dat de experimentele embedder uitzendt, is vastgezet op een draft-commit van c2pa-org/specifications (SPEC_PIN_SHA = 4e2afed8…, gedateerd 2026-04-26), beschikbaar gesteld als een publieke constante zodat aanroepers de SHA die ze verwachten kunnen vastzetten.

SymboolRol
C2paCapabilityStatusEerlijk, machineleesbaar statuswaardeobject. current() leest de env-vlag live; generallyAvailable / conformanceClaimed zijn altijd false; summary() draagt geen GA-/conformiteitsclaim.
ManifestStoreOnveranderlijk Manifest Store-waardeobject. Het stabiele naadtype; draagt bytes beide kanten op. Geen claim-niveau-accessors. Altijd beschikbaar.
C2paManifestEmbedderBevroren, leverancierneutrale SPI: embed() / extract(). Geen claim-synthese. extract() geeft null terug bij een miss. Altijd beschikbaar.
ExperimentalC2paEmbedderStandaard-uitgeschakelde synthese. buildManifestStore() stelt een draft-manifest samen; de constructor werpt LogicException tenzij de env-vlag exact "1" is.
Feature::PREVIEW_C2PA_DRAFTScoped opt-in-vlag. ENV_PREVIEW_C2PA_DRAFT = NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT; isEnabled() is strikt === '1'.
  • Standaard uit, strikte opt-in. Synthese zit achter NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT, strikt gelezen als === '1'. Al het andere is UIT; een Pro-licentie alleen schakelt het niet in.
  • Fail-closed op constructietijd. new ExperimentalC2paEmbedder() werpt LogicException wanneer de vlag uit is — nooit een stille no-op.
  • Uitvoer is ongetekend en transient. Zelfs met de vlag aan wordt de Claim Signature-box weggelaten; behandel de bytes als draftvormig en embed opnieuw zodra een stabiele adapter wordt geleverd.
  • Pin-veroudering-controle. Voer composer c2pa:draft-status (exit 0 vers / 1 soft-warn / 2 hard-fail) uit in CI om te detecteren wanneer de vastgezette draft-snapshot veroudert.
  • Geen conformiteitsverdict. Het statusobject rapporteert previewstatus, niet een conformiteitsresultaat. Een externe validator en een bevroren werkgroepprofiel zouden voorwaarden zijn voor enige conformiteitsdiscussie, en geen van beide wordt aangenomen.
  • Taaldiscipline. Beschrijf de uitvoer niet als “C2PA signed”, “conformant”, “compliant”, “certified” of “GA”. Gebruik “preview-vermogensstatus”.

Een previewoppervlak is geen beveiligingscontrole. Het dragen of synthetiseren van een draft-Manifest Store is niet hetzelfde als het produceren of verifiëren van een attestatie — en de experimentele embedder laat de Claim Signature-box volledig weg, dus de uitvoer is per constructie ongetekend. Vertrouw niet op deze preview voor herkomstgaranties in productie; hij beweert niet dat een credential geldig is of dat een bestand is ondertekend.

Dit oppervlak maakt geen conformiteitsclaim. Het C2PA-profiel wordt onderhouden door een externe werkgroep en is niet bevroren; NextPDF vermeldt daarom een preview-vermogensstatus en een draft-/werkgroepgrens, niet conformiteit of certificering. Er wordt geen standaardtekst gereproduceerd.

Deze pagina documenteert alleen extern waarneembaar gedrag en het ondersteunde publieke API-oppervlak. Interne namespace-paden, helperklassen, mechanismetabellen, runbook-bestandsnamen en ticketprefixen vallen buiten de scope.