コンテンツにスキップ
getnextpdf.com

Pro エディション安定性: 実験的

C2PA プレビュー機能ステータス

プレビュー機能ステータス。決して GA ではありません。 このページは、C2PA サーフェスがプレビューとして今日何を行うのかを述べます。これは適合性の主張でも、 認証でも、NextPDF が C2PA 署名されたファイルを生成するという記述でもありません。 このサーフェスはプレビューであり、一般提供(generally available)と表現されることは決してありません。

NextPDF Pro は、C2paCapabilityStatus を通じて Content Credentials(C2PA)のプレビューサーフェスを公開します。このページは、そのサーフェスの正直な境界です。 すなわち、常に利用可能なもの、オプトインのドラフトフラグの背後にとどまるもの、 そしてなぜ最終状態の主張がなされないのか、です。

このサーフェスには明確に分離された 2 つの層があり、その区別こそが境界のすべての要点です。

  • 常に利用可能 — 安定シーム。 ManifestStoreC2paManifestEmbedder インターフェースは、凍結された、ベンダー中立のシームです。これらは Manifest Store を 双方向に運べます。embed() は呼び出し側が提供した Store のバイトを PDF に書き込み、 extract() は Store を再び解析して取り出します(存在しない場合は null を返す)。 このシームはクレームの合成を一切行いません — それ自体がアサーションやクレームを組み立てることは決してなく、呼び出し側がすでに保持している不透明な ManifestStore を移動するだけです。
  • オプトインフラグの背後 — クレームの合成。 Manifest Store を実際に構築すること (クレームと材料ハッシュアサーションを組み立てること)は ExperimentalC2paEmbedder にのみ存在し、デフォルトオフの環境フラグの背後でゲートされています。これがドラフト状の、 予告なく破壊的変更が起こりうる部分です。

したがって正確な記述はこうです。抽出とバイト運搬は常に到達可能であり、マニフェスト内容の合成に到達できるのは、プレビューフラグが明示的に有効化されたときに限られます。

要となる決定は、安定したトランスポートシームを揮発的な合成パスから分離することであり、 1 つのエンベッダーがすべてを行うのではありません。C2PA-PDF プロファイルは依然として外部のワーキンググループが所有しており、凍結されていません。その Claim Signature ボックス (c2cs、COSE_Sign1 構造)は、最もドリフトしやすい部分です。そのため合成はそのボックスを省き、デフォルトオフのフラグの背後に置かれる一方、抽出と運搬は凍結されていないフィールドに依存せず、すべての人にとって到達可能なままです。ステータスオブジェクトは成熟度をデータとして公開し、generallyAvailableconformanceClaimed をハードコードで false にしているため、 呼び出し側が生成側の意図を検証済みの結果と取り違えることはありません。この分離により、 チームは今すぐ耐久性のあるシームを採用し、後で署名アダプターを追加できます。NextPDF がまだ守れないワイヤフォーマットの約束を一切せずに、です。

設計の背景:監査人に手渡せるコンプライアンス

C2paCapabilityStatus は、サーフェスのステータスを散文ではなくデータとして明示的に報告します。その generallyAvailable プロパティと conformanceClaimed プロパティはハードコードで false であり、フラグにかかわらず false のままです。プレビューを有効にすると previewEnabled だけが反転します。maturity トークンは主張をしないラベル preview-draft であり、specPin はピン留めされたドラフトコミットを記録します。 呼び出し側が読むのは「preview」であって、「署名済みかつ検証済み」ではありません。

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

C2PA 仕様は外部のワーキンググループによって維持されており、NextPDF がターゲットとするであろうプロファイルは凍結されていません。プロファイルが凍結されていないため、プレビューは意図的に最終状態の主張を一切行いません。ワーキンググループのプロファイルが安定したとき、 変わるのはサーフェスのステータスであって、そのマーケティングではありません。

オプトインは単一のプロセス環境変数 NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT です。これはライブで読み取られ、文字列 "1" に対して厳密に比較されます — それ以外の値(0trueyes、空文字列、欠如を含む)はすべてオフとして扱われます。Pro ライセンスだけでは有効化されません。オペレーターが意識的にオプトインしなければなりません。

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

実際のデプロイでは、フラグをブート時に(ランタイムに putenv() ではなく)設定し、 明示的な人間のオプトインでゲートし、実験的エンベッダーに触れる前に機能ステータスを確認して、 ドラフトパスに意図的にのみ到達するようにしてください。

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

暗黙のフォールバックはありません。NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT が正確に "1" でないときに ExperimentalC2paEmbedder が構築されると、コンストラクターは、フラグ、 環境変数、ピン留めされたドラフトの SHA/日付を名指しするメッセージとともに LogicException をスローします。呼び出し側が、単に Pro ライセンスを保持しているだけで、ドラフト状のバイトを誤って本番 PDF にシリアライズしてしまうことはありません。

安定した抽出パスもフェイルクローズしますが、その仕方は異なります。extract() は Manifest Store が存在しないとき null を返し(一般的なケースで、安価かつ例外なしに保たれる)、Store が存在するが、パーサーの敵対的ハードニング不変条件(深さ、サイクル、 サイズ、件数)に違反するときには C2paException のサブクラス — JumbfBombExceptionJumbfCycleDetectedExceptionJumbfDepthExceededException、または MalformedJumbfException — をスローします。これらが暗黙のうちに飲み込まれることは決してありません。

以下の表現は、ポリシー上このサーフェスには使用されません。それに由来するいかなるドキュメント、UI、マーケティングにも現れてはなりません。

  • 「C2PA 適合(conformant)」または「C2PA 準拠(compliant)」。
  • 「C2PA 認証済み(certified)」。
  • 完成し表明された機能としての「C2PA 署名済み(signed)」。
  • 「GA」/「一般提供(generally available)」。

このサーフェスが正直に何であるか。C2PA Manifest Store を解析(抽出)し運搬(埋め込み) できる安定シームに加え、ドラフト状のマニフェスト内容を合成するデフォルトオフの実験的エンベッダー、そして自身のプレビュー状態を報告するステータスオブジェクトです。それが何でないか。証明され検証可能な C2PA クレデンシャルの生成器ではありません。特筆すべきは、実験的エンベッダーが意図的に Claim Signature(c2cs)ボックス — 仕様の中で最もドリフトしやすい COSE_Sign1 部分 — を省いている点です。そのため、フラグがオンであっても出力は署名されていないドラフト状のバイトです。ワーキンググループのプロファイルは凍結されていません。境界こそが要点です。

実験的エンベッダーが発行するワイヤフォーマットは、c2pa-org/specificationsドラフト コミット(SPEC_PIN_SHA = 4e2afed8…、日付 2026-04-26)にピン留めされており、呼び出し側が期待する SHA をピン留めできるよう、パブリック定数として公開されています。

シンボル役割
C2paCapabilityStatus正直で機械可読なステータス値オブジェクト。current() は環境フラグをライブで読み取る。generallyAvailable / conformanceClaimed は常に falsesummary() は GA/適合性の主張を含まない。
ManifestStoreイミュータブルな Manifest Store 値オブジェクト。安定シーム型で、バイトを双方向に運ぶ。クレームレベルのアクセサーを持たない。常に利用可能。
C2paManifestEmbedder凍結された、ベンダー中立の SPI:embed() / extract()。クレームの合成なし。extract() はミス時に null を返す。常に利用可能。
ExperimentalC2paEmbedderデフォルトオフの合成。buildManifestStore() はドラフトマニフェストを組み立てる。コンストラクターは環境フラグが正確に "1" でない限り LogicException をスローする。
Feature::PREVIEW_C2PA_DRAFTスコープ付きのオプトインフラグ。ENV_PREVIEW_C2PA_DRAFT = NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFTisEnabled() は厳密な === '1'
  • デフォルトオフ、厳密なオプトイン。 合成は NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT の背後にあり、=== '1' として厳密に読み取られます。それ以外はすべてオフです。Pro ライセンスだけでは有効化されません。
  • 構築時のフェイルクローズ。 フラグがオフのとき new ExperimentalC2paEmbedder()LogicException をスローします — 暗黙の no-op ではありません。
  • 出力は署名されておらず、一時的です。 フラグがオンであっても Claim Signature ボックスは省かれます。バイトはドラフト状として扱い、安定したアダプターが出荷されたら再埋め込みしてください。
  • ピンの陳腐化チェック。 ピン留めされたドラフトスナップショットが古くなったことを検出するため、CI で composer c2pa:draft-status(exit 0 が新鮮 / 1 がソフト警告 / 2 がハードフェイル)を実行してください。
  • 適合性の判定はありません。 ステータスオブジェクトはプレビュー状態を報告するのであって、適合性の結果ではありません。いかなる適合性の議論にも、外部バリデーターと凍結されたワーキンググループのプロファイルが前提となりますが、そのいずれも前提とされていません。
  • 言語の規律。 出力を「C2PA 署名済み」「適合」「準拠」「認証済み」または「GA」と表現してはなりません。「プレビュー機能ステータス」を使用してください。

プレビューサーフェスはセキュリティ制御ではありません。ドラフトの Manifest Store を運搬または合成することは、証明を生成または検証することと同じではありません — また実験的エンベッダーは Claim Signature ボックスを完全に省くため、その出力は構造上署名されていません。本番での出所保証のためにこのプレビューに依存しないでください。クレデンシャルが有効であるとも、ファイルが署名されているとも表明しません。

このサーフェスは適合性の主張を一切行いません。C2PA プロファイルは外部のワーキンググループによって維持されており、凍結されていません。したがって NextPDF は、適合性や認証ではなく、プレビュー機能ステータスとドラフト/ワーキンググループ境界を述べます。規格本文の複製は行っていません。

このページは、外部から観測可能な動作とサポートされるパブリック API サーフェスのみを記述します。内部の名前空間パス、ヘルパークラス、メカニズム表、Runbook のファイル名、 チケットプレフィックスは対象外です。