Zum Inhalt springen
getnextpdf.com

Pro EditionStabilität: Experimentell

C2PA-Preview-Capability-Status

Preview-Capability-Status. Niemals GA. Diese Seite gibt an, was die C2PA-Oberfläche heute als Vorschau tut. Es ist keine Konformitätsaussage, keine Zertifizierung und keine Aussage, dass NextPDF C2PA-signierte Dateien erzeugt. Die Oberfläche ist eine Vorschau und wird niemals als allgemein verfügbar beschrieben.

NextPDF Pro stellt eine Content-Credentials-(C2PA)-Vorschauoberfläche über C2paCapabilityStatus bereit. Diese Seite ist die ehrliche Grenze für diese Oberfläche: was stets verfügbar ist, was hinter einem per Opt-in aktivierbaren Entwurfs-Flag bleibt und warum keine Endzustandsaussage gemacht wird.

Zwei Schichten: stabile Naht vs. geflaggte Synthese

Abschnitt betitelt „Zwei Schichten: stabile Naht vs. geflaggte Synthese“

Die Oberfläche hat zwei klar getrennte Schichten, und die Unterscheidung ist der ganze Sinn der Grenze:

  • Stets verfügbar — die stabile Naht. ManifestStore und die C2paManifestEmbedder-Schnittstelle sind eine eingefrorene, anbieterneutrale Naht. Sie können einen Manifest Store in beide Richtungen tragen: embed() schreibt die Bytes eines vom Aufrufer bereitgestellten Store in ein PDF, und extract() parst einen Store wieder heraus (gibt null zurück, wenn keiner vorhanden ist). Diese Naht macht keine Claim-Synthese — sie stellt nie selbst Assertions oder Claims zusammen; sie bewegt einen opaken ManifestStore, den der Aufrufer bereits hält.
  • Hinter dem Opt-in-Flag — Claim-Synthese. Das tatsächliche Bauen eines Manifest Store (das Zusammenstellen des Claim und der Ingredient-Hash-Assertion) liegt nur in ExperimentalC2paEmbedder, gated hinter einem standardmäßig ausgeschalteten Env-Flag. Dies ist der entwurfsförmige, ohne-Vorankündigung-brechende Teil.

Die präzise Aussage lautet also: Extraktion und Byte-Transport sind stets erreichbar; die Synthese der Manifest-Inhalte ist nur erreichbar, wenn das Preview-Flag explizit aktiviert ist.

Die tragende Entscheidung trennt eine stabile Transportnaht vom volatilen Synthesepfad, statt einen Embedder alles machen zu lassen. Das C2PA-PDF-Profil liegt weiterhin in der Hand einer externen Arbeitsgruppe und ist nicht eingefroren. Seine Claim-Signature-Box (c2cs, eine COSE_Sign1-Struktur) ist der Teil, der am ehesten driften wird. Daher lässt die Synthese diese Box weg und liegt hinter einem standardmäßig ausgeschalteten Flag, während Extrahieren-und-Tragen von keinem nicht eingefrorenen Feld abhängt und für alle erreichbar bleibt. Das Status-Objekt legt die Reife als Daten offen, mit hartcodiert falschem generallyAvailable und conformanceClaimed, sodass Aufrufer die Absicht des Erzeugers nicht mit einem validierten Ergebnis verwechseln können. Diese Trennung erlaubt es Teams, die dauerhafte Naht jetzt zu übernehmen und später einen signierten Adapter hinzuzufügen, ohne ein Drahtformat-Versprechen, das NextPDF noch nicht halten kann.

Design-Hintergrund: Compliance, die Sie einem Prüfer vorlegen können.

C2paCapabilityStatus meldet den Status der Oberfläche explizit als Daten, nicht als Prosa. Seine Eigenschaften generallyAvailable und conformanceClaimed sind hartcodiert false und bleiben unabhängig vom Flag falsch; das Aktivieren der Vorschau kippt nur previewEnabled. Das maturity-Token ist die nicht beanspruchende Bezeichnung preview-draft, und specPin verzeichnet den gepinnten Entwurfs-Commit. Ein Aufrufer liest „preview”, nicht „signiert und verifiziert”.

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

Die C2PA-Spezifikation wird von einer externen Arbeitsgruppe gepflegt, und das Profil, das NextPDF anvisieren würde, ist nicht eingefroren. Weil das Profil nicht eingefroren ist, macht die Vorschau bewusst keine Endzustandsaussage. Wenn das Arbeitsgruppen-Profil sich stabilisiert, würde sich der Status der Oberfläche ändern — nicht ihr Marketing.

Das Opt-in ist eine einzelne Prozess-Umgebungsvariable, NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT. Sie wird live gelesen und strikt gegen die Zeichenkette "1" verglichen — jeder andere Wert (einschließlich 0, true, yes, der leeren Zeichenkette oder Abwesenheit) wird als AUS behandelt. Eine Pro-Lizenz allein aktiviert sie nicht; der Operator muss sich bewusst dafür entscheiden.

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

Setzen Sie in einem echten Deployment das Flag beim Boot (nicht via putenv() zur Laufzeit), gaten Sie es auf ein explizites menschliches Opt-in und prüfen Sie den Capability-Status, bevor Sie den experimentellen Embedder berühren, sodass der Entwurfspfad nur absichtlich erreicht wird.

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

Es gibt keinen stillen Fallback. Wird ExperimentalC2paEmbedder konstruiert, während NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT nicht exakt "1" ist, wirft der Konstruktor eine LogicException, deren Meldung das Flag, die Env-Variable und den gepinnten Entwurfs-SHA/-Datum benennt. Ein Aufrufer kann nicht versehentlich entwurfsförmige Bytes in ein Produktions-PDF serialisieren, indem er bloß eine Pro-Lizenz hält.

Der stabile Extract-Pfad ist ebenfalls fail-closed, aber anders: extract() gibt null zurück, wenn kein Manifest Store vorhanden ist (der häufige Fall, günstig und ausnahmefrei gehalten), und wirft eine C2paException-Unterklasse — JumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededException oder MalformedJumbfException — wenn ein Store vorhanden ist, aber die Adversarial-Hardening-Invarianten des Parsers (Tiefe, Zyklus, Größe, Anzahl) verletzt. Diese werden nie stillschweigend verschluckt.

Die folgende Sprache wird per Richtlinie für diese Oberfläche nicht verwendet und sollte in keiner davon abgeleiteten Dokumentation, UI oder Marketing erscheinen:

  • „C2PA conformant” oder „C2PA compliant”.
  • „C2PA certified”.
  • „C2PA signed” als fertige, zugesicherte Fähigkeit.
  • „GA” / „generally available”.

Was die Oberfläche ehrlich ist: eine stabile Naht, die einen C2PA Manifest Store parsen (extrahieren) und tragen (einbetten) kann, plus ein standardmäßig ausgeschalteter experimenteller Embedder, der entwurfsförmige Manifest-Inhalte synthetisiert, sowie ein Status-Objekt, das seinen eigenen Vorschau-Zustand meldet. Was sie nicht ist: ein Erzeuger attestierter, verifizierbarer C2PA-Credentials. Insbesondere lässt der experimentelle Embedder bewusst die Claim-Signature-(c2cs)-Box weg — den COSE_Sign1-Teil der Spezifikation, der am ehesten driften wird — sodass die Ausgabe selbst bei aktivem Flag unsignierte, entwurfsförmige Bytes sind. Das Arbeitsgruppen-Profil ist nicht eingefroren; die Grenze ist der Punkt.

Das Drahtformat, das der experimentelle Embedder ausgibt, ist auf einen Entwurfs-Commit von c2pa-org/specifications (SPEC_PIN_SHA = 4e2afed8…, datiert 2026-04-26) gepinnt, als öffentliche Konstante exponiert, sodass Aufrufer den SHA pinnen können, den sie erwarten.

SymbolRolle
C2paCapabilityStatusEhrliches, maschinenlesbares Status-Value-Object. current() liest das Env-Flag live; generallyAvailable / conformanceClaimed sind stets false; summary() trägt keine GA-/Konformitätsaussage.
ManifestStoreUnveränderliches Manifest-Store-Value-Object. Der Typ der stabilen Naht; trägt Bytes in beide Richtungen. Keine Claim-Level-Accessors. Stets verfügbar.
C2paManifestEmbedderEingefrorene, anbieterneutrale SPI: embed() / extract(). Keine Claim-Synthese. extract() gibt bei Fehlen null zurück. Stets verfügbar.
ExperimentalC2paEmbedderStandardmäßig ausgeschaltete Synthese. buildManifestStore() stellt ein Entwurfsmanifest zusammen; der Konstruktor wirft LogicException, sofern das Env-Flag nicht exakt "1" ist.
Feature::PREVIEW_C2PA_DRAFTGescoptes Opt-in-Flag. ENV_PREVIEW_C2PA_DRAFT = NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT; isEnabled() ist striktes === '1'.
  • Standardmäßig aus, striktes Opt-in. Die Synthese liegt hinter NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT, strikt als === '1' gelesen. Alles andere ist AUS; eine Pro-Lizenz allein aktiviert sie nicht.
  • Fail-closed zur Konstruktionszeit. new ExperimentalC2paEmbedder() wirft LogicException, wenn das Flag aus ist — niemals ein stilles No-op.
  • Die Ausgabe ist unsigniert und transient. Selbst bei aktivem Flag wird die Claim-Signature-Box weggelassen; behandeln Sie die Bytes als entwurfsförmig und betten Sie sie erneut ein, sobald ein stabiler Adapter ausgeliefert wird.
  • Pin-Veraltungsprüfung. Führen Sie composer c2pa:draft-status (Exit 0 frisch / 1 Soft-Warnung / 2 Hard-Fail) in CI aus, um zu erkennen, wann der gepinnte Entwurfs-Snapshot veraltet.
  • Kein Konformitätsverdikt. Das Status-Objekt meldet den Vorschau-Zustand, kein Konformitätsergebnis. Ein externer Validator und ein eingefrorenes Arbeitsgruppen-Profil wären Voraussetzungen für jede Konformitätsdiskussion, und keines davon wird angenommen.
  • Sprachdisziplin. Beschreiben Sie die Ausgabe nicht als „C2PA signed”, „conformant”, „compliant”, „certified” oder „GA”. Verwenden Sie „Preview-Capability-Status”.

Eine Vorschauoberfläche ist keine Sicherheitskontrolle. Das Tragen oder Synthetisieren eines entwurfsförmigen Manifest Store ist nicht dasselbe wie das Erzeugen oder Verifizieren einer Attestierung — und der experimentelle Embedder lässt die Claim-Signature-Box vollständig weg, sodass seine Ausgabe konstruktionsbedingt unsigniert ist. Verlassen Sie sich für die Herkunftssicherung in der Produktion nicht auf diese Vorschau; sie sichert nicht zu, dass ein Credential gültig oder dass eine Datei signiert ist.

Diese Oberfläche macht keine Konformitätsaussage. Das C2PA-Profil wird von einer externen Arbeitsgruppe gepflegt und ist nicht eingefroren; NextPDF gibt daher einen Preview-Capability-Status und eine Entwurfs-/Arbeitsgruppen-Grenze an, nicht Konformität oder Zertifizierung. Es wird kein Standardtext wiedergegeben.

Diese Seite dokumentiert ausschließlich extern beobachtbares Verhalten und die unterstützte öffentliche API-Oberfläche. Interne Namespace-Pfade, Hilfsklassen, Mechanismus-Tabellen, Runbook-Dateinamen und Ticket-Präfixe liegen außerhalb des Geltungsbereichs.