Ir al contenido

Cumplimiento: validador PDF/R-1, gramática Arlington y herramientas de ciclo de vida

NextPDF\Compliance incluye validadores de flujo de bytes y una comprobación cruzada de gramática que leen un PDF terminado y señalan en qué puntos se desvía de un contrato normativo. Que un validador devuelva cero hallazgos constituye un resultado comprobado frente a las cláusulas que implementa; no es un certificado general.

Ventana de terminal
composer require nextpdf/core:^3

El módulo tiene tres partes.

PdfRValidator valida un flujo de bytes candidato a ISO 23504-1:2020 (PDF/R-1). Opera sobre los bytes en bruto, no sobre el estado interno del escritor. Detecta la desviación entre lo que el escritor pretende emitir y lo que exige la especificación. Es la comprobación final. El conjunto de cláusulas implementado es el grupo v5.1.0: comentario de identificación de versión del §5, lista de permitidos de la cabecera del §6.2.2/§6.2.3, prohibición de generación-0 y de flujos de objetos del §6.2.4, lista de permitidos de operadores de flujo de contenido del §6.5.7 (solo q, Q, cm, Do), lista de permitidos de claves de XObject de imagen del §6.6.1, lista de permitidos de claves del diccionario Info del §6.4.3, y lista de permitidos de claves del Catalog del §6.3. Las actualizaciones incrementales del §6.7 y el cifrado del §6.8 quedan explícitamente fuera del alcance del grupo inicial y se declaran así en claims.json. El validador no lanza una excepción ante el primer hallazgo. Recopila todas las divergencias en una sola pasada para que quien lo invoca vea el conjunto completo de diferencias.

PdfRConformancePolicy es una política inmutable para los rangos recomendados-pero-informativos relativos a PDF/R-1. El mínimo normativo del §6 nunca es configurable. La política controla únicamente las recomendaciones de límites de implementación del §A.5, la recomendación de evitar tiras múltiples del §6.6.1 y el requisito de XMP del §A.6 para una reclasificación posterior como PDF/A.

ArlingtonValidator ejecuta el modelo Arlington PDF upstream de la PDF Association en modo solo de informe. En el ciclo actual, siempre tiene carácter consultivo: validateReportOnly() nunca lanza una excepción. Se degrada a través de tres modos. Con el binario del verificador de referencia, analiza hallazgos estructurados. Cuando solo está disponible la gramática fijada, emite un hallazgo info que prueba que esa gramática se cargó. Sin la gramática, devuelve una lista vacía. Un WaiverRegistry permite al orquestador suprimir desacuerdos aceptables conocidos mientras conserva el rastro de auditoría.

La regla de honestidad es la misma que se aplica en la matriz de compatibilidad de CSS y en el módulo de conformidad. Una cláusula está Verificada solo cuando existe una prueba que pasa y se cita la cláusula normativa. Una cláusula implementada que carece de un fixture dedicado que pase está Declarada. Las cláusulas fuera de alcance se declaran explícitamente; no se dejan ambiguas. Un resultado de cero hallazgos de PdfRValidator solo afirma las cláusulas que realmente comprueba. No hace ninguna afirmación sobre el §6.7 ni el §6.8, que no implementa.

TipoClaseMiembros clave
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,
]);
}
  • PdfRValidator se basa en expresiones regulares; no es un analizador completo. Está orientado a la salida determinista de NextPDF\Writer\PdfRWriter. Funciona como detector de desviaciones para ese escritor. No es un analizador de PDF de propósito general.
  • Cero hallazgos ≠ conformidad total con PDF/R-1. El §6.7 (actualizaciones incrementales) y el §6.8 (cifrado) no están implementados en el grupo v5.1.0 y se declaran fuera de alcance en claims.json. Trata un resultado limpio como «sin divergencia en el conjunto de cláusulas implementado», nada más.
  • Arlington es de carácter consultivo. validateReportOnly() nunca hace fallar la compilación en el ciclo actual. CI consume el artefacto, pero no lo usa como compuerta.
  • La validación ICC de PDF/A no está aquí. La validación ICC del OutputIntent del §6.2.2 de ISO 19005-4:2020 reside en el PdfAManager de Enterprise (nextpdf/pro), no en el módulo de Cumplimiento de Core. La superficie de PDF/A de Core es únicamente el discriminador ConformanceMode.
  • Las exenciones conservan el rastro de auditoría. Una regla exenta se suprime de la lista de hallazgos, pero la entrada de exención sigue siendo el registro del motivo.

PdfRValidator::validate() es una única pasada lineal con recorridos acotados de expresiones regulares sobre el flujo de bytes. El costo escala con el tamaño del documento y se mantiene holgadamente dentro del presupuesto del módulo. ArlingtonValidator en modo solo de gramática es O(número-de-reglas-de-gramática) para generar el hallazgo de prueba de carga. La ruta del verificador de referencia es un subproceso y queda acotada por la herramienta upstream, no por NextPDF. Es un paso de CI fuera de banda.

Estos validadores leen bytes de PDF no confiables. PdfRValidator elimina los literales entre paréntesis y hexadecimales antes de extraer las claves, de modo que una cadena Creator manipulada no pueda inyectar una clave /Name falsa (manejo de escapes del §7.3.4.2 de ISO 32000-1:2008). El adaptador de Arlington ejecuta el verificador upstream como un subproceso acotado. Trata un tiempo de espera agotado o un error de ejecución como «sin hallazgos» en lugar de confiar en una salida parcial. Consulta el modelo de amenazas del proyecto para conocer la superficie de ataque del análisis de PDF.

EstándarCláusulaQué hace el módulo de CumplimientoEstado
ISO 23504-1:2020 (PDF/R-1)§6.5.7PdfRValidator aplica la lista de permitidos {q,Q,cm,Do} de operadores de flujo de contenidoVerificado (pasan las pruebas unitarias, de perfil de estándares y de integración)
ISO 23504-1:2020 (PDF/R-1)§6.4.3PdfRValidator aplica la lista de permitidos de claves del diccionario InfoVerificado (respaldado por pruebas)
ISO 23504-1:2020 (PDF/R-1)§6.7, §6.8No implementado en el grupo v5.1.0No cobertura explícita (declarada en claims.json)
ISO 32000-2:2020 (PDF 2.0)§7.5.2Recorrido de la lista de permitidos de claves del CatalogDeclarado (recorrido por expresiones regulares; estructural)
ISO 19005-4:2020 (PDF/A-4)§6.7.3Conocimiento del esquema de identificación a través del módulo de ConformidadReferencia cruzada (consulta /specifications/pdfa4/)

Compatibilidad no es conformidad. Una ejecución de PdfRValidator que no devuelve hallazgos prueba que la entrada no se desvió de las cláusulas del §6 que el validador implementa. No afirma que el archivo sea un archivo PDF/R-1 conforme: el §6.7 y el §6.8 no se comprueban. La comprobación cruzada de Arlington es de carácter consultivo y nunca afirma conformidad. Para PDF/A-4, el validador autoritativo es veraPDF, ejecutado fuera de banda; consulta el módulo de conformidad para conocer el oráculo veraPDF y su control opcional.

Las citas están parafraseadas del corpus de cumplimiento de NextPDF. Los resúmenes reference_id completos de 64 caracteres se registran en el front-matter de la página y en _normative-evidence-conf.md.