Cumplimiento: validador PDF/R-1, gramática Arlington y herramientas de ciclo de vida
De un vistazo
Sección titulada «De un vistazo»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.
Instalación
Sección titulada «Instalación»composer require nextpdf/core:^3Panorama conceptual
Sección titulada «Panorama conceptual»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.
Superficie de API
Sección titulada «Superficie de API»| Tipo | Clase | Miembros clave |
|---|---|---|
NextPDF\Compliance\Validator\PdfRValidator | final class | validate(string $pdfBytes): list<PdfRValidationFinding> |
NextPDF\Compliance\Validator\PdfRValidationFinding | final readonly class | string $clause, 'error'|'warning'|'info' $severity, string $message |
NextPDF\Compliance\Profile\PdfRConformancePolicy | final readonly class | __construct(bool $enforceA5ImplementationLimits = true, bool $rejectMultiStripPages = false, bool $requireXmpForA6Compatibility = false); lax(), strictArchival() |
NextPDF\Compliance\Validator\ArlingtonValidator | final class | validateReportOnly(string $pdfPath): list<ArlingtonFinding> |
NextPDF\Compliance\Validator\WaiverRegistry | final class | isWaived(string $validator, string $ruleId, string $scopeKey): bool |
Ejemplo de código — Inicio rápido
Sección titulada «Ejemplo de código — Inicio rápido»<?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"; }}Ejemplo de código — Producción
Sección titulada «Ejemplo de código — Producció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, ]);}Casos límite y trampas
Sección titulada «Casos límite y trampas»PdfRValidatorse basa en expresiones regulares; no es un analizador completo. Está orientado a la salida determinista deNextPDF\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
PdfAManagerde Enterprise (nextpdf/pro), no en el módulo de Cumplimiento de Core. La superficie de PDF/A de Core es únicamente el discriminadorConformanceMode. - 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.
Rendimiento
Sección titulada «Rendimiento»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.
Notas de seguridad
Sección titulada «Notas de seguridad»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.
Conformidad
Sección titulada «Conformidad»| Estándar | Cláusula | Qué hace el módulo de Cumplimiento | Estado |
|---|---|---|---|
| ISO 23504-1:2020 (PDF/R-1) | §6.5.7 | PdfRValidator aplica la lista de permitidos {q,Q,cm,Do} de operadores de flujo de contenido | Verificado (pasan las pruebas unitarias, de perfil de estándares y de integración) |
| ISO 23504-1:2020 (PDF/R-1) | §6.4.3 | PdfRValidator aplica la lista de permitidos de claves del diccionario Info | Verificado (respaldado por pruebas) |
| ISO 23504-1:2020 (PDF/R-1) | §6.7, §6.8 | No implementado en el grupo v5.1.0 | No cobertura explícita (declarada en claims.json) |
| ISO 32000-2:2020 (PDF 2.0) | §7.5.2 | Recorrido de la lista de permitidos de claves del Catalog | Declarado (recorrido por expresiones regulares; estructural) |
| ISO 19005-4:2020 (PDF/A-4) | §6.7.3 | Conocimiento del esquema de identificación a través del módulo de Conformidad | Referencia 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.
Véase también
Sección titulada «Véase también»- Módulo de conformidad — enrutamiento de
ConformanceModey el oráculo veraPDF - Módulo de auditoría — superficie de rastro de auditoría y atestación
- Mapeo de la especificación PDF/A-4 — cobertura frente a no cobertura de ISO 19005-4
- Módulo de seguridad — modelo de amenazas del análisis de PDF