Pro editiestabiliteit: Experimenteel
C2PA preview-vermogensstatus
In een oogopslag
Sectie met titel “In een oogopslag”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.
ManifestStoreen deC2paManifestEmbedder-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, enextract()parseert een Store er weer uit (en geeftnullterug wanneer er geen aanwezig is). Deze naad doet geen claim-synthese — hij stelt nooit zelf assertions of claims samen; hij verplaatst een opakeManifestStoredie 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.
Waarom het zo werkt
Sectie met titel “Waarom het zo werkt”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.
Preview-vermogensstatus
Sectie met titel “Preview-vermogensstatus”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 preview inschakelen
Sectie met titel “De preview inschakelen”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.
Snelle start
Sectie met titel “Snelle start”// 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.Productie-achtig gebruik
Sectie met titel “Productie-achtig gebruik”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');Fail-closed wanneer de vlag uit is
Sectie met titel “Fail-closed wanneer de vlag uit is”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 C2paException —
JumbfBombException, 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.
Eerlijke grens
Sectie met titel “Eerlijke grens”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.
API-oppervlak
Sectie met titel “API-oppervlak”| Symbool | Rol |
|---|---|
C2paCapabilityStatus | Eerlijk, machineleesbaar statuswaardeobject. current() leest de env-vlag live; generallyAvailable / conformanceClaimed zijn altijd false; summary() draagt geen GA-/conformiteitsclaim. |
ManifestStore | Onveranderlijk Manifest Store-waardeobject. Het stabiele naadtype; draagt bytes beide kanten op. Geen claim-niveau-accessors. Altijd beschikbaar. |
C2paManifestEmbedder | Bevroren, leverancierneutrale SPI: embed() / extract(). Geen claim-synthese. extract() geeft null terug bij een miss. Altijd beschikbaar. |
ExperimentalC2paEmbedder | Standaard-uitgeschakelde synthese. buildManifestStore() stelt een draft-manifest samen; de constructor werpt LogicException tenzij de env-vlag exact "1" is. |
Feature::PREVIEW_C2PA_DRAFT | Scoped opt-in-vlag. ENV_PREVIEW_C2PA_DRAFT = NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT; isEnabled() is strikt === '1'. |
Randgevallen en valkuilen
Sectie met titel “Randgevallen en valkuilen”- 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()werptLogicExceptionwanneer 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”.
Beveiligingsnotities
Sectie met titel “Beveiligingsnotities”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.
Conformiteit
Sectie met titel “Conformiteit”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.
Publicatiegrens
Sectie met titel “Publicatiegrens”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.
Zie ook
Sectie met titel “Zie ook”- C2PA-preview — diepe referentie — de volledige API-referentie voor dit oppervlak.
- Pro-beveiliging
- Core signing
- Conformiteitslanding
- Post-quantumcryptografie preview-vermogensstatus