Pular para o conteúdo
getnextpdf.com

Pro ediçãoestabilidade: Experimental

Status de capacidade de pré-visualização do C2PA

Status de capacidade de pré-visualização. Nunca GA. Esta página declara o que a superfície C2PA faz hoje como pré-visualização. Não é uma reivindicação de conformidade, não é uma certificação e não é uma declaração de que o NextPDF produz arquivos assinados com C2PA. A superfície é uma pré-visualização e nunca é descrita como disponível em caráter geral.

O NextPDF Pro expõe uma superfície de pré-visualização de Content Credentials (C2PA) por meio de C2paCapabilityStatus. Esta página é o limite honesto dessa superfície: o que está sempre disponível, o que permanece por trás de uma flag opcional de rascunho e por que nenhuma reivindicação de estado final é feita.

Duas camadas: seam estável vs. síntese restringida por flag

Seção intitulada “Duas camadas: seam estável vs. síntese restringida por flag”

A superfície tem duas camadas claramente separadas, e a distinção é todo o propósito do limite:

  • Sempre disponível — o seam estável. ManifestStore e a interface C2paManifestEmbedder são um seam congelado e neutro em relação a fornecedores. Eles podem transportar um Manifest Store nos dois sentidos: embed() grava os bytes de um Store fornecido pelo chamador em um PDF, e extract() analisa um Store de volta (retornando null quando nenhum está presente). Este seam não faz síntese de claim — ele nunca monta asserções ou claims por conta própria; ele move um ManifestStore opaco que o chamador já possui.
  • Por trás da flag opcional — síntese de claim. Construir de fato um Manifest Store (montar o claim e a asserção de ingredient-hash) reside apenas em ExperimentalC2paEmbedder, restringido por trás de uma flag de ambiente desativada por padrão. Esta é a parte em formato de rascunho, que quebra sem aviso.

Então a afirmação precisa é: extração e transporte de bytes são sempre alcançáveis; a síntese do conteúdo do manifesto só é alcançável quando a flag de pré-visualização é explicitamente ativada.

A decisão de suporte separa um seam de transporte estável do caminho volátil de síntese, em vez de um único embedder fazendo tudo. O perfil C2PA-PDF ainda pertence a um grupo de trabalho externo e não está congelado. Sua caixa Claim Signature (c2cs, uma estrutura COSE_Sign1) é a parte com maior probabilidade de mudar. Por isso, a síntese omite essa caixa e reside por trás de uma flag desativada por padrão, enquanto extrair-e-transportar não depende de nenhum campo não congelado e permanece alcançável para todos. O objeto de status expõe a maturidade como dado, com generallyAvailable e conformanceClaimed fixados em código como false, de modo que os chamadores não possam confundir a intenção do produtor com um resultado validado. Essa separação permite que as equipes adotem o seam durável agora e adicionem um adaptador assinado depois, sem nenhuma promessa de formato de fio que o NextPDF ainda não pode cumprir.

Contexto de design: Conformidade que você pode entregar a um auditor.

C2paCapabilityStatus informa o status da superfície explicitamente como dado, não como prosa. Suas propriedades generallyAvailable e conformanceClaimed são fixadas em código como false e permanecem false independentemente da flag; ativar a pré-visualização altera apenas previewEnabled. O token maturity é o rótulo não reivindicatório preview-draft, e specPin registra o commit de rascunho fixado. Um chamador lê “preview”, não “assinado e verificado”.

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

A especificação C2PA é mantida por um grupo de trabalho externo, e o perfil que o NextPDF visaria não está congelado. Como o perfil não está congelado, a pré-visualização deliberadamente não faz nenhuma reivindicação de estado final. Quando o perfil do grupo de trabalho estabilizar, o que mudaria seria o status da superfície — não o seu marketing.

A opção opcional é uma única variável de ambiente de processo, NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT. Ela é lida ao vivo e comparada de forma estrita com a string "1" — qualquer outro valor (incluindo 0, true, yes, a string vazia ou ausência) é tratado como OFF. Uma licença Pro sozinha não a ativa; o operador precisa optar conscientemente.

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

Em uma implantação real, defina a flag na inicialização (não via putenv() em runtime), condicione-a a uma opção humana explícita e verifique o status de capacidade antes de tocar no embedder experimental, de modo que o caminho de rascunho só seja alcançado de propósito.

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

Não há fallback silencioso. Se ExperimentalC2paEmbedder for construído enquanto NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT não for exatamente "1", o construtor lança uma LogicException cuja mensagem nomeia a flag, a variável de ambiente e o SHA/data do rascunho fixado. Um chamador não pode serializar acidentalmente bytes em formato de rascunho em um PDF de produção apenas por possuir uma licença Pro.

O caminho de extração estável também é de falha fechada, mas de forma diferente: extract() retorna null quando nenhum Manifest Store está presente (o caso comum, mantido barato e livre de exceções) e lança uma subclasse de C2paExceptionJumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededException ou MalformedJumbfException — quando um Store está presente, mas viola as invariantes de blindagem adversarial do parser (profundidade, ciclo, tamanho, contagem). Essas nunca são engolidas silenciosamente.

A linguagem a seguir não é usada para esta superfície, por política, e não deve aparecer em nenhuma documentação, UI ou marketing derivado dela:

  • “C2PA conformant” ou “C2PA compliant”.
  • “C2PA certified”.
  • “C2PA signed” como uma capacidade finalizada e afirmada.
  • “GA” / “generally available”.

O que a superfície honestamente é: um seam estável que pode analisar (extract) e transportar (embed) um Manifest Store C2PA, mais um embedder experimental desativado por padrão que sintetiza conteúdo de manifesto em formato de rascunho, e um objeto de status que informa seu próprio estado de pré-visualização. O que ela não é: um produtor de credenciais C2PA atestadas e verificáveis. Notavelmente, o embedder experimental deliberadamente omite a caixa Claim Signature (c2cs) — a parte COSE_Sign1 da especificação com maior probabilidade de mudar — então, mesmo com a flag ativada, a saída é de bytes não assinados, em formato de rascunho. O perfil do grupo de trabalho não está congelado; o limite é o ponto.

O formato de fio que o embedder experimental emite é fixado a um commit de rascunho de c2pa-org/specifications (SPEC_PIN_SHA = 4e2afed8…, datado de 2026-04-26), exposto como uma constante pública para que os chamadores possam fixar o SHA que esperam.

SímboloFunção
C2paCapabilityStatusObjeto de valor de status honesto e legível por máquina. current() lê a flag de ambiente ao vivo; generallyAvailable / conformanceClaimed são sempre false; summary() não carrega nenhuma reivindicação de GA/conformidade.
ManifestStoreObjeto de valor imutável do Manifest Store. O tipo do seam estável; transporta bytes nos dois sentidos. Sem acessores de nível de claim. Sempre disponível.
C2paManifestEmbedderSPI congelado e neutro em relação a fornecedores: embed() / extract(). Sem síntese de claim. extract() retorna null em caso de ausência. Sempre disponível.
ExperimentalC2paEmbedderSíntese desativada por padrão. buildManifestStore() monta um manifesto de rascunho; o construtor lança LogicException a menos que a flag de ambiente seja exatamente "1".
Feature::PREVIEW_C2PA_DRAFTFlag opcional com escopo. ENV_PREVIEW_C2PA_DRAFT = NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT; isEnabled() é o estrito === '1'.
  • Desativado por padrão, opção estrita. A síntese fica por trás de NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT, lida estritamente como === '1'. Qualquer outra coisa é OFF; uma licença Pro sozinha não a ativa.
  • Falha fechada no momento da construção. new ExperimentalC2paEmbedder() lança LogicException quando a flag está desativada — nunca um no-op silencioso.
  • A saída é não assinada e transitória. Mesmo com a flag ativada, a caixa Claim Signature é omitida; trate os bytes como em formato de rascunho e os reincorpore quando um adaptador estável for entregue.
  • Verificação de obsolescência do pin. Execute composer c2pa:draft-status (saída 0 atual / 1 aviso leve / 2 falha rígida) em CI para detectar quando o snapshot de rascunho fixado envelhece.
  • Nenhum veredicto de conformidade. O objeto de status informa o estado de pré-visualização, não um resultado de conformidade. Um validador externo e um perfil congelado de grupo de trabalho seriam pré-requisitos para qualquer discussão de conformidade, e nenhum dos dois é pressuposto.
  • Disciplina de linguagem. Não descreva a saída como “C2PA signed”, “conformant”, “compliant”, “certified” ou “GA”. Use “status de capacidade de pré-visualização”.

Uma superfície de pré-visualização não é um controle de segurança. Transportar ou sintetizar um Manifest Store de rascunho não é o mesmo que produzir ou verificar uma atestação — e o embedder experimental omite inteiramente a caixa Claim Signature, então sua saída é não assinada por construção. Não dependa desta pré-visualização para garantia de procedência em produção; ela não afirma que uma credencial é válida nem que um arquivo está assinado.

Esta superfície não faz nenhuma reivindicação de conformidade. O perfil C2PA é mantido por um grupo de trabalho externo e não está congelado; portanto, o NextPDF declara um status de capacidade de pré-visualização e um limite de rascunho/grupo de trabalho, não conformidade nem certificação. Nenhum texto de norma é reproduzido.

Esta página documenta apenas o comportamento observável externamente e a superfície de API pública suportada. Caminhos de namespace internos, classes auxiliares, tabelas de mecanismos, nomes de arquivos de runbook e prefixos de tickets estão fora de escopo.