Aller au contenu
getnextpdf.com

Pro éditionstabilité: Expérimental

Statut de capacité de prévisualisation C2PA

Statut de capacité de prévisualisation. Jamais GA. Cette page énonce ce que fait aujourd’hui la surface C2PA en tant que prévisualisation. Ce n’est pas une revendication de conformité, pas une certification, ni un énoncé selon lequel NextPDF produit des fichiers signés C2PA. La surface est une prévisualisation et n’est jamais décrite comme généralement disponible.

NextPDF Pro expose une surface de prévisualisation Content Credentials (C2PA) via C2paCapabilityStatus. Cette page est la frontière honnête de cette surface : ce qui est toujours disponible, ce qui reste derrière un indicateur de brouillon opt-in, et pourquoi aucune revendication d’état final n’est faite.

Deux couches : jonction stable contre synthèse verrouillée

Section intitulée « Deux couches : jonction stable contre synthèse verrouillée »

La surface comporte deux couches clairement séparées, et la distinction est tout l’enjeu de la frontière :

  • Toujours disponible — la jonction stable. ManifestStore et l’interface C2paManifestEmbedder sont une jonction figée et neutre vis-à-vis du fournisseur. Elles peuvent transporter un Manifest Store dans les deux sens : embed() écrit les octets d’un Store fourni par l’appelant dans un PDF, et extract() réanalyse un Store (renvoyant null lorsqu’aucun n’est présent). Cette jonction ne fait aucune synthèse de revendication — elle n’assemble jamais d’assertions ni de revendications elle-même ; elle déplace un ManifestStore opaque que l’appelant détient déjà.
  • Derrière l’indicateur opt-in — synthèse de revendication. Construire réellement un Manifest Store (assembler la revendication et l’assertion de hachage d’ingrédient) ne réside que dans ExperimentalC2paEmbedder, verrouillé derrière un indicateur d’environnement désactivé par défaut. C’est la partie en forme de brouillon, susceptible de casser sans préavis.

L’énoncé précis est donc : l’extraction et le transport d’octets sont toujours joignables ; la synthèse du contenu du manifeste n’est joignable que lorsque l’indicateur de prévisualisation est explicitement activé.

La décision porteuse sépare une jonction de transport stable du chemin de synthèse volatil, plutôt qu’un seul embedder faisant tout. Le profil C2PA-PDF appartient encore à un groupe de travail externe et n’est pas figé. Sa boîte Claim Signature (c2cs, une structure COSE_Sign1) est la partie la plus susceptible de dériver. Ainsi, la synthèse omet cette boîte et réside derrière un indicateur désactivé par défaut, tandis que l’extraction-et-transport ne dépend d’aucun champ non figé et reste joignable pour tous. L’objet de statut expose la maturité sous forme de données, avec generallyAvailable et conformanceClaimed codés en dur à false, de sorte que les appelants ne peuvent pas confondre l’intention du producteur avec un résultat validé. Cette séparation permet aux équipes d’adopter la jonction durable dès maintenant et d’ajouter un adaptateur signé plus tard, sans aucune promesse de format de fil que NextPDF ne peut pas encore tenir.

Contexte de conception : Une conformité que tu peux remettre à un auditeur.

C2paCapabilityStatus rapporte le statut de la surface explicitement sous forme de données, pas de prose. Ses propriétés generallyAvailable et conformanceClaimed sont codées en dur à false et restent false quel que soit l’indicateur ; activer la prévisualisation ne bascule que previewEnabled. Le jeton maturity est l’étiquette non revendicatrice preview-draft, et specPin consigne le commit de brouillon figé. Un appelant lit « preview », pas « signé et vérifié ».

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

La spécification C2PA est maintenue par un groupe de travail externe, et le profil que NextPDF viserait n’est pas figé. Parce que le profil n’est pas figé, la prévisualisation ne fait délibérément aucune revendication d’état final. Lorsque le profil du groupe de travail se stabilisera, c’est le statut de la surface — et non son marketing — qui changerait.

L’opt-in est une unique variable d’environnement de processus, NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT. Elle est lue en direct et comparée strictement à la chaîne "1" — toute autre valeur (y compris 0, true, yes, la chaîne vide ou l’absence) est traitée comme désactivée. Une licence Pro seule **n’**active pas la prévisualisation ; l’opérateur doit consciemment opter pour elle.

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

Dans un déploiement réel, définis l’indicateur au démarrage (pas via putenv() à l’exécution), conditionne-le à un opt-in humain explicite, et vérifie le statut de la capacité avant de toucher à l’embedder expérimental afin que le chemin brouillon ne soit atteint qu’à dessein.

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 lorsque l’indicateur est désactivé

Section intitulée « Fail-closed lorsque l’indicateur est désactivé »

Il n’y a aucun repli silencieux. Si ExperimentalC2paEmbedder est construit alors que NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT n’est pas exactement "1", le constructeur lève une LogicException dont le message nomme l’indicateur, la variable d’environnement et le SHA/date du brouillon figé. Un appelant ne peut pas accidentellement sérialiser des octets en forme de brouillon dans un PDF de production en se contentant de détenir une licence Pro.

Le chemin d’extraction stable est lui aussi fail-closed, mais différemment : extract() renvoie null lorsqu’aucun Manifest Store n’est présent (le cas courant, maintenu peu coûteux et sans exception), et lève une sous-classe de C2paExceptionJumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededException ou MalformedJumbfException — lorsqu’un Store est présent mais enfreint les invariants de durcissement adversarial de l’analyseur (profondeur, cycle, taille, nombre). Ceux-ci ne sont jamais avalés silencieusement.

Le langage suivant n’est pas utilisé pour cette surface, par politique, et ne devrait apparaître dans aucune documentation, interface ou marketing qui en dérive :

  • « C2PA conformant » ou « C2PA compliant ».
  • « C2PA certified ».
  • « C2PA signed » en tant que capacité finie et affirmée.
  • « GA » / « generally available ».

Ce que la surface est honnêtement : une jonction stable qui peut analyser (extract) et transporter (embed) un Manifest Store C2PA, plus un embedder expérimental désactivé par défaut qui synthétise un contenu de manifeste en forme de brouillon, et un objet de statut qui rapporte son propre état de prévisualisation. Ce qu’elle n’est pas : un producteur de Content Credentials C2PA attestés et vérifiables. Notamment, l’embedder expérimental omet délibérément la boîte Claim Signature (c2cs) — la partie COSE_Sign1 de la spécification la plus susceptible de dériver — de sorte que, même avec l’indicateur activé, la sortie est constituée d’octets non signés en forme de brouillon. Le profil du groupe de travail n’est pas figé ; la frontière est l’enjeu.

Le format de fil que l’embedder expérimental émet est figé à un commit brouillon de c2pa-org/specifications (SPEC_PIN_SHA = 4e2afed8…, daté du 2026-04-26), exposé comme constante publique afin que les appelants puissent figer le SHA qu’ils attendent.

SymboleRôle
C2paCapabilityStatusObjet valeur de statut honnête et lisible par machine. current() lit l’indicateur d’environnement en direct ; generallyAvailable / conformanceClaimed sont toujours false ; summary() ne porte aucune revendication de GA/conformité.
ManifestStoreObjet valeur Manifest Store immuable. Le type de la jonction stable ; transporte des octets dans les deux sens. Aucun accesseur au niveau revendication. Toujours disponible.
C2paManifestEmbedderSPI figée et neutre vis-à-vis du fournisseur : embed() / extract(). Aucune synthèse de revendication. extract() renvoie null en cas d’absence. Toujours disponible.
ExperimentalC2paEmbedderSynthèse désactivée par défaut. buildManifestStore() assemble un manifeste brouillon ; le constructeur lève LogicException à moins que l’indicateur d’environnement ne soit exactement "1".
Feature::PREVIEW_C2PA_DRAFTIndicateur opt-in cantonné. ENV_PREVIEW_C2PA_DRAFT = NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT ; isEnabled() est strict === '1'.
  • Désactivé par défaut, opt-in strict. La synthèse est derrière NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT, lu strictement comme === '1'. Tout le reste est désactivé ; une licence Pro seule ne l’active pas.
  • Fail-closed au moment de la construction. new ExperimentalC2paEmbedder() lève LogicException lorsque l’indicateur est désactivé — jamais un no-op silencieux.
  • La sortie est non signée et transitoire. Même avec l’indicateur activé, la boîte Claim Signature est omise ; traite les octets comme en forme de brouillon et réintègre-les une fois qu’un adaptateur stable est livré.
  • Vérification de péremption du pin. Exécute composer c2pa:draft-status (sortie 0 frais / 1 avertissement souple / 2 échec dur) en CI pour détecter quand l’instantané de brouillon figé vieillit.
  • Aucun verdict de conformité. L’objet de statut rapporte l’état de prévisualisation, pas un résultat de conformité. Un validateur externe et un profil de groupe de travail figé seraient des prérequis pour toute discussion de conformité, et ni l’un ni l’autre n’est supposé.
  • Discipline de langage. Ne décris pas la sortie comme « C2PA signed », « conformant », « compliant », « certified » ou « GA ». Utilise « statut de capacité de prévisualisation ».

Une surface de prévisualisation n’est pas un contrôle de sécurité. Transporter ou synthétiser un Manifest Store brouillon n’est pas la même chose que produire ou vérifier une attestation — et l’embedder expérimental omet entièrement la boîte Claim Signature, de sorte que sa sortie est non signée par construction. Ne te fie pas à cette prévisualisation pour une assurance de provenance en production ; elle n’affirme pas qu’un credential est valide ni qu’un fichier est signé.

Cette surface ne fait aucune revendication de conformité. Le profil C2PA est maintenu par un groupe de travail externe et n’est pas figé ; NextPDF énonce donc un statut de capacité de prévisualisation et une frontière brouillon/groupe de travail, pas une conformité ni une certification. Aucun texte de norme n’est reproduit.

Cette page documente uniquement le comportement observable de l’extérieur et la surface d’API publique prise en charge. Les chemins de namespace internes, les classes utilitaires, les tables de mécanismes, les noms de fichiers de runbook et les préfixes de tickets sont hors périmètre.