Pular para o conteúdo

Conformidade PDF/A-4: o que o NextPDF emite para a ISO 19005-4

Declaração de limite. O NextPDF produz uma saída destinada a se conformar ao PDF/A-4. A biblioteca não declara conformidade; quem faz isso é um validador, como o veraPDF.

O PDF/A-4 é a ISO 19005-4:2020, o perfil de arquivamento baseado em PDF 2.0. O NextPDF Core carrega o discriminador ConformanceMode (PdfA4, PdfA4e, PdfA4f). O mecanismo Premium nextpdf/pro emite o OutputIntent, o perfil ICC incorporado e o esquema de identificação pdfaid do Extensible Metadata Platform (XMP) durante o save(). A biblioteca produz os artefatos; o veraPDF decide a conformidade. A ISO 19005-4 §6.7.3 é explícita: as propriedades pdfaid:part/pdfaid:rev “não determinam, por si só, a conformidade”.

Terminal window
composer require nextpdf/core:^3
composer require nextpdf/pro # OutputIntent + ICC + XMP authoring

O Core registra a capacidade security.pdfa, mas a reporta como indisponível sem o nextpdf/pro. Nesse caso, enablePdfA() lança InvalidConfigException com um caminho de upgrade, em vez de emitir um arquivo não conforme.

Document::enablePdfA(?object $version = null) mapeia uma entrada do enum PdfAVersion para um caso de ConformanceMode. Por padrão, ele assume ConformanceMode::PdfA4 para entradas não reconhecidas ('4e' → PdfA4e, '4f' → PdfA4f). O modo determina três obrigações de emissão para um arquivo conforme:

  • OutputIntent + ICC — a §6.2.3 permite que um arquivo conforme especifique suas características de cor com um OutputIntent PDF/A-4 que referencia um stream International Color Consortium (ICC) DestOutputProfile. Conforme a §6.2.4.1, essa é uma das duas rotas permitidas para cor independente de dispositivo (a outra é especificar diretamente espaços de cor independentes de dispositivo). O OutputIntent é a rota que o NextPDF adota, não uma exigência incondicional da norma.
  • Identificação pdfaid — a §6.7.3 exige o esquema de identificação PDF/A no XMP em nível de documento (o namespace AIIM pdfaid) com pdfaid:part/pdfaid:rev. O PDF/A-4e e o PDF/A-4f também definem pdfa:conformance (E / F). A §6.7.3 determina que um arquivo que não se conforme a nenhum dos dois não deve fornecer um valor pdfa:conformance.
  • Incorporação de fontes — a §6.2.10 exige que todas as fontes usadas na renderização sejam incorporadas.

O NextPDF emite esses artefatos. Ele não executa a determinação de conformidade da §5. Essa é a tarefa do veraPDF, e a §6.7.3 reserva a determinação para esse processo.

MétodoEfeito
enablePdfA(?object $version = null): staticRoteia para ConformanceMode::PdfA4/PdfA4e/PdfA4f; agenda OutputIntent + ICC + XMP no save(). Lança InvalidConfigException|PageLayoutException|CompressionException if nextpdf/pro estiver ausente.
ConformanceMode::pdfaPart(): ?intRetorna a parte da ISO 19005 correspondente ao modo ativo (4 para PdfA4*).
ConformanceMode::pdfaConformanceLetter(): stringRetorna a letra de pdfa:conformance (E / F) ou uma string vazia.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
use NextPDF\Exception\InvalidConfigException;
use NextPDF\Support\CapabilityRegistry;
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/archival.pdf';
$registry = CapabilityRegistry::getInstance();
if (!$registry->get('security.pdfa')->isAvailable()) {
fwrite(STDERR, "PDF/A-4 requires nextpdf/pro.\n");
exit(1);
}
try {
$doc = Document::createStandalone();
$doc->enablePdfA(); // ConformanceMode::PdfA4
$doc->setTitle('Archival Record 2026-0042');
$doc->setLanguage('en');
$doc->writeHtml('<h1>Archival record</h1><p>Body.</p>');
$doc->save($out); // OutputIntent + ICC + XMP scheduled here
} catch (InvalidConfigException $e) {
fwrite(STDERR, $e->getMessage() . "\n");
exit(1);
}
echo "Wrote {$out} — validate: verapdf --flavour 4 {$out}\n";

Use o veredito do validador como uma barreira de build. Execute verapdf --flavour 4 sobre a saída e faça o build falhar diante de um código de saída diferente de zero. O veredito do validador é a barreira; a emissão da biblioteca é a entrada para ela, nunca o próprio veredito. Consulte /cookbook/php/pdfa4-conformance-gate/ para conhecer o pipeline completo com barreira.

  • Habilite antes do conteúdo. Chame enablePdfA() antes de adicionar conteúdo. A habilitação retroativa não reprocessa objetos já gravados.
  • Sem criptografia. O PDF/A proíbe a chave Encrypt. Não chame setEncryption() em um documento PDF/A. A criptografia diz respeito à confidencialidade, não à integridade de arquivamento, e as duas são mutuamente exclusivas aqui.
  • pdfa:conformance é condicional. Apenas o PDF/A-4e e o PDF/A-4f a definem. Emiti-la em um arquivo PDF/A-4 simples é, por si só, uma violação de conformidade (§6.7.3) — o caso de ConformanceMode impede isso por construção.
  • Anexos do PDF/A-4f. Os arquivos incorporados em um arquivo PDF/A-4f devem conter as chaves F e UF (Desc recomendado) conforme a §6.7.5. Isso dá suporte ao caminho híbrido ZUGFeRD/Factur-X.

A incorporação de OutputIntent + ICC adiciona um stream ICC de tamanho fixo (o perfil de espaço de trabalho) e o pacote XMP no save(). O orçamento é de tempo total ≤ 1500 ms e pico ≤ 128 MB para um documento típico.

O PDF/A-4 proíbe a criptografia. O perfil é uma restrição de arquivamento e longevidade, não um controle de segurança. A custódia de chaves e a política do verificador estão fora do escopo deste perfil; consulte o centro de confiança.

A emissão PDF/A-4 é executada no próprio processo e grava apenas o documento, o perfil ICC incorporado e o pacote XMP. Nenhum conteúdo deixa o processo. As informações de identificação pessoal (PII) no conteúdo de origem são de responsabilidade do integrador. O perfil não faz redação.

O exemplo grava no STDERR apenas o caminho de saída e o comando do validador. Ele não registra nenhum byte do documento. A receita respeita NEXTPDF_COOKBOOK_OUTPUT e nunca imprime o PDF no STDOUT.

Um arquivo PDF/A-4 não tem controle de acesso. Qualquer pessoa que tenha o arquivo pode lê-lo. O perfil dá suporte à longevidade da renderização, não à confidencialidade. Trate o stream ICC do OutputIntent como público.

A emissão PDF/A-4 não realiza criptografia. Uma assinatura digital em um arquivo PDF/A-4 (a §6.5 do PDF/A-4 permite perfis PAdES) é uma preocupação separada, tratada pela receita de assinatura, e herda a postura FIPS dessa receita. Esta página não faz nenhuma afirmação sobre assinatura.

AfirmaçãoNormaCláusulareference_id
Um arquivo PDF/A-4 pode especificar suas características de cor com um OutputIntent PDF/A que referencie um perfil ICC DestOutputProfile.ISO 19005-4§6.2.3
A cor independente de dispositivo pode ser especificada direta ou indiretamente via DestOutputProfile do OutputIntent (uma das duas rotas permitidas).ISO 19005-4§6.2.4.1
A versão PDF/A é identificada via esquema de identificação PDF/A (pdfaid) no XMP do documento.ISO 19005-4§6.7.3
pdfaid:part / pdfaid:rev não determinam, por si só, a conformidade; a determinação é realizada conforme a Cláusula 5.ISO 19005-4§6.7.3
Um arquivo que não se conforme nem ao PDF/A-4e nem ao PDF/A-4f não deve fornecer um valor pdfa:conformance.ISO 19005-4§6.7.3
Os arquivos incorporados do PDF/A-4f exigem as chaves F e UF (Desc recomendado).ISO 19005-4§6.7.5
Todas as fontes usadas na renderização devem ser incorporadas.ISO 19005-4§6.2.10
O uso de transparência / cor depende de um OutputIntent declarado.ISO 19005-4§6.2.9

As citações são o ID da cláusula e ponteiros reference_id para o corpus de verificação. Nenhum texto da norma é reproduzido; o NextPDF resume as cláusulas com suas próprias palavras.