Pular para o conteúdo

Conformidade: validador de PDF/R-1, gramática Arlington e ferramentas de ciclo de vida

NextPDF\Compliance reúne validadores de fluxo de bytes e uma verificação cruzada de gramática que leem um arquivo Portable Document Format (PDF) finalizado e indicam onde ele diverge de um contrato normativo. Quando um validador não retorna ocorrências, o resultado está verificado em relação às cláusulas que ele implementa. Isso não equivale a um certificado abrangente.

Terminal window
composer require nextpdf/core:^3

O módulo se divide em três partes.

PdfRValidator valida um fluxo de bytes candidato à ISO 23504-1:2020 (PDF/R-1). Ele opera sobre bytes brutos, não sobre o estado interno do gravador. Ele detecta divergências entre o que o gravador pretende emitir e o que a especificação exige, atuando como a verificação final. O conjunto de cláusulas implementado é o cluster v5.1.0: §5 comentário de identificação de versão, lista de permissão de cabeçalho §6.2.2/§6.2.3, proibição de geração-0 e de fluxo de objetos §6.2.4, lista de permissão de operadores de fluxo de conteúdo §6.5.7 (somente q, Q, cm, Do), lista de permissão de chaves de XObject de imagem §6.6.1, lista de permissão de chaves do dicionário Info §6.4.3 e lista de permissão de chaves do Catalog §6.3. §6.7 atualizações incrementais e §6.8 criptografia estão explicitamente fora do escopo do cluster inicial e são declaradas assim em claims.json. O validador não para na primeira ocorrência. Ele coleta todas as divergências em uma única passagem para que você possa ver o diff completo.

PdfRConformancePolicy é uma política imutável para as faixas recomendadas-mas-informativas relacionadas ao PDF/R-1. O piso normativo da §6 não é configurável. A política controla apenas as recomendações de limite de implementação da §A.5, o desencorajamento de múltiplas faixas da §6.6.1 e o requisito XMP Extensible Metadata Platform (XMP) da §A.6 para uma reclassificação PDF/A posterior.

ArlingtonValidator executa o modelo Arlington PDF da PDF Association em modo somente-relatório. Ele permanece consultivo durante todo o ciclo atual: validateReportOnly() nunca lança exceção. Ele opera em três modos em cascata. Quando o binário do verificador de referência está disponível, ele analisa ocorrências estruturadas. Quando apenas a gramática fixada está disponível, ele emite uma ocorrência info que comprova que a gramática fixada foi carregada. Quando a gramática está indisponível, ele retorna uma lista vazia. Um WaiverRegistry permite que o orquestrador suprima discordâncias reconhecidas como aceitáveis, preservando a trilha de auditoria.

A regra de honestidade segue a matriz de suporte a Cascading Style Sheets (CSS) e o módulo de conformidade. Uma cláusula só é Verified quando há um teste aprovado e a cláusula normativa é citada. Uma cláusula implementada, mas sem uma fixture dedicada aprovada, é Claimed. As cláusulas fora do escopo são declaradas explicitamente, sem ambiguidade. Um resultado do PdfRValidator sem ocorrências afirma apenas as cláusulas que ele verifica. Ele não faz nenhuma afirmação sobre §6.7 ou §6.8, que ele não implementa.

TipoEspécieMembros principais
NextPDF\Compliance\Validator\PdfRValidatorfinal classvalidate(string $pdfBytes): list<PdfRValidationFinding>
NextPDF\Compliance\Validator\PdfRValidationFindingfinal readonly classstring $clause, 'error'|'warning'|'info' $severity, string $message
NextPDF\Compliance\Profile\PdfRConformancePolicyfinal readonly class__construct(bool $enforceA5ImplementationLimits = true, bool $rejectMultiStripPages = false, bool $requireXmpForA6Compatibility = false); lax(), strictArchival()
NextPDF\Compliance\Validator\ArlingtonValidatorfinal classvalidateReportOnly(string $pdfPath): list<ArlingtonFinding>
NextPDF\Compliance\Validator\WaiverRegistryfinal classisWaived(string $validator, string $ruleId, string $scopeKey): bool
<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\PdfRValidator;
$validator = new PdfRValidator();
$findings = $validator->validate(file_get_contents('candidate.pdf'));
if ($findings === []) {
// Zero divergences from the §6 clauses PdfRValidator implements.
// This is NOT a PDF/R-1 certificate — §6.7 and §6.8 are not checked.
echo "No PDF/R-1 §6 divergences detected (implemented clause set).\n";
} else {
foreach ($findings as $f) {
echo "[{$f->severity}] §{$f->clause}: {$f->message}\n";
}
}
<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\ArlingtonValidator;
use NextPDF\Compliance\Validator\ArlingtonGrammarLoader;
use NextPDF\Compliance\Validator\WaiverRegistry;
$validator = new ArlingtonValidator(
waivers: new WaiverRegistry(/* loaded waiver entries */),
grammar: new ArlingtonGrammarLoader(/* pinned submodule path */),
adapter: null, // grammar-only mode when the reference checker is absent
);
// Advisory by contract — never throws on findings.
$findings = $validator->validateReportOnly('artifact.pdf');
foreach ($findings as $finding) {
// Each finding pins the Arlington grammar commit SHA for provenance.
logger()->info('arlington', [
'rule' => $finding->ruleId,
'severity' => $finding->severity,
'grammarSha' => $finding->grammarSha,
]);
}
  • O PdfRValidator é baseado em regex, não é um parser completo. Ele mira a saída determinística do NextPDF\Writer\PdfRWriter. Use-o como detector de desvios para esse gravador, não como parser geral de PDF.
  • Zero ocorrências ≠ conformidade PDF/R-1 completa. §6.7 (atualizações incrementais) e §6.8 (criptografia) não estão implementadas no cluster v5.1.0 e são declaradas como fora do escopo em claims.json. Trate um resultado limpo como “nenhuma divergência no conjunto de cláusulas implementado”, e nada além disso.
  • O Arlington é consultivo. No ciclo atual, validateReportOnly() nunca faz o build falhar. A integração contínua (CI) consome o artefato, mas não o usa como gate.
  • A validação PDF/A do International Color Consortium (ICC) não está neste módulo. A validação ICC de OutputIntent da ISO 19005-4:2020 §6.2.2 fica no PdfAManager Enterprise (nextpdf/pro), não no módulo Compliance do Core. A superfície PDF/A do Core é apenas o discriminador ConformanceMode.
  • As dispensas preservam a trilha de auditoria. Uma regra dispensada é suprimida da lista de ocorrências, mas a entrada de dispensa continua sendo o registro do porquê.

PdfRValidator::validate() faz uma única passagem linear, com varreduras de regex limitadas sobre o fluxo de bytes. O custo escala com o tamanho do documento e permanece bem dentro do orçamento do módulo. No modo somente-gramática, o ArlingtonValidator é O(grammar-rule-count) para emitir a ocorrência que comprova o carregamento. O caminho do verificador de referência é executado como subprocesso e é limitado pela ferramenta upstream, não pelo NextPDF. É uma etapa de CI fora de banda.

Esses validadores leem bytes de PDF não confiáveis. PdfRValidator remove literais entre parênteses e literais hexadecimais antes de extrair chaves, de modo que uma string Creator forjada não consiga injetar uma chave /Name falsa (tratamento de escape da ISO 32000-1:2008 §7.3.4.2). O adaptador Arlington executa o verificador upstream como subprocesso limitado. Ele trata um tempo limite ou erro de execução como “nenhuma ocorrência”, em vez de confiar em saída parcial. Consulte o modelo de ameaças do projeto para a superfície de ataque da análise de PDF.

NormaCláusulaO que o módulo Compliance fazStatus
ISO 23504-1:2020 (PDF/R-1)§6.5.7PdfRValidator impõe a lista de permissão {q,Q,cm,Do} de operadores de fluxo de conteúdoVerified (testes de unidade + perfil de normas + integração passam)
ISO 23504-1:2020 (PDF/R-1)§6.4.3PdfRValidator impõe a lista de permissão de chaves do dicionário InfoVerified (respaldado por testes)
ISO 23504-1:2020 (PDF/R-1)§6.7, §6.8Não implementado no cluster v5.1.0Não-cobertura explícita (declarada em claims.json)
ISO 32000-2:2020 (PDF 2.0)§7.5.2Varredura pela lista de permissão de chaves do CatalogClaimed (percurso de regex; estrutural)
ISO 19005-4:2020 (PDF/A-4)§6.7.3Reconhecimento do esquema de identificação por meio do módulo ConformanceReferência cruzada (consulte /specifications/pdfa4/)

Suporte não é conformidade. Uma execução do PdfRValidator sem ocorrências comprova apenas que a entrada não divergiu das cláusulas da §6 que o validador implementa. Ela não afirma que o arquivo está em conformidade com PDF/R-1: §6.7 e §6.8 não são verificadas. A verificação cruzada Arlington é consultiva e nunca afirma conformidade. Para PDF/A-4, o veraPDF é o validador autoritativo e é executado fora de banda. Consulte o módulo de conformidade para o oráculo veraPDF e seu gating opcional.

As citações são parafraseadas a partir do corpus de conformidade do NextPDF. Os digests completos de 64 caracteres do reference_id são registrados no front-matter da página e em _normative-evidence-conf.md.