Aller au contenu

Conformité : validateur PDF/R-1, grammaire Arlington et outils de cycle de vie

NextPDF\Compliance fournit des validateurs de flux d’octets et un contrôle croisé de grammaire qui lisent un PDF finalisé et signalent les écarts par rapport à un contrat normatif. Un validateur qui ne renvoie aucun signalement donne un résultat vérifié pour les clauses qu’il met en œuvre : ce n’est pas un certificat global.

Fenêtre de terminal
composer require nextpdf/core:^3

Le module comporte trois parties.

PdfRValidator valide un flux d’octets candidat pour ISO 23504-1:2020 (PDF/R-1). Il travaille sur les octets bruts, pas sur l’état interne du writer. Il détecte les écarts entre ce que le writer entend émettre et ce que la spécification exige. C’est le contrôle final. L’ensemble de clauses mis en œuvre est le cluster v5.1.0 : commentaire d’identification de la version du §5, liste d’autorisation de l’en-tête des §6.2.2/§6.2.3, interdiction de génération-0 et de flux d’objets du §6.2.4, liste d’autorisation des opérateurs de flux de contenu du §6.5.7 (q, Q, cm, Do uniquement), liste d’autorisation des clés d’XObject image du §6.6.1, liste d’autorisation des clés du dictionnaire Info du §6.4.3, et liste d’autorisation des clés du Catalog du §6.3. Les mises à jour incrémentales du §6.7 et le chiffrement du §6.8 sont explicitement hors périmètre pour le cluster initial et déclarés comme tels dans claims.json. Le validateur ne lève pas d’erreur dès le premier signalement. Il collecte chaque écart en une seule passe afin que l’appelant voie le diff complet.

PdfRConformancePolicy est une politique immuable pour les marges recommandées mais informatives autour de PDF/R-1. Le plancher normatif du §6 n’est jamais configurable. La politique ne contrôle que les recommandations de limites d’implémentation du §A.5, la recommandation d’éviter le multi-bande du §6.6.1 et l’exigence XMP du §A.6 pour une reclassification PDF/A en aval.

ArlingtonValidator pilote le modèle PDF Arlington maintenu en amont par la PDF Association, en mode rapport uniquement. Il reste toujours consultatif dans le cycle actuel : validateReportOnly() ne lève jamais d’erreur. Il passe en mode dégradé selon trois scénarios. Avec le binaire du vérificateur de référence, il analyse les signalements structurés. Avec la seule grammaire épinglée, il émet un unique signalement info prouvant que la grammaire épinglée s’est chargée. Sans grammaire, il renvoie une liste vide. Un WaiverRegistry permet à l’orchestrateur de supprimer les désaccords connus comme acceptables tout en préservant la piste d’audit.

La règle d’honnêteté est la même que pour la matrice de prise en charge CSS et le module de conformité. Une clause n’est Vérifiée que s’il existe un test passant et que la clause normative est citée. Une clause mise en œuvre sans fixture passante dédiée est Revendiquée. Les clauses hors périmètre sont indiquées explicitement, au lieu d’être laissées dans l’ambiguïté. Un résultat PdfRValidator sans signalement n’affirme que les clauses qu’il vérifie réellement. Il ne fait aucune affirmation sur le §6.7 ni sur le §6.8, qu’il ne met pas en œuvre.

TypeGenreMembres clés
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 s’appuie sur des expressions régulières : ce n’est pas un parseur complet. Il cible la sortie déterministe de NextPDF\Writer\PdfRWriter. Il sert de détecteur d’écart pour ce writer. Ce n’est pas un parseur PDF générique.
  • Zéro signalement ≠ conformité PDF/R-1 complète. Le §6.7 (mises à jour incrémentales) et le §6.8 (chiffrement) ne sont pas mis en œuvre dans le cluster v5.1.0 et sont déclarés hors périmètre dans claims.json. Traite un résultat propre comme « aucun écart sur l’ensemble de clauses mis en œuvre », et rien de plus.
  • Arlington est consultatif. validateReportOnly() ne fait jamais échouer le build dans le cycle actuel. La CI consomme l’artefact sans s’en servir comme verrou.
  • La validation ICC PDF/A n’est pas dans ce module. La validation ICC OutputIntent d’ISO 19005-4:2020 §6.2.2 se trouve dans le PdfAManager Enterprise (nextpdf/pro), pas dans le module Compliance de Core. La surface PDF/A de Core se limite au discriminateur ConformanceMode.
  • Les waivers préservent la piste d’audit. Une règle couverte par un waiver est supprimée de la liste des signalements, mais l’entrée de waiver conserve la trace du pourquoi.

PdfRValidator::validate() effectue une seule passe linéaire, avec des parcours regex bornés sur le flux d’octets. Le coût croît avec la taille du document et reste largement dans le budget du module. En mode grammaire seule, ArlingtonValidator est en O(nombre-de-règles-de-grammaire) pour le signalement qui prouve le chargement. Le chemin du vérificateur de référence passe par un sous-processus borné par l’outil amont, pas par NextPDF. Il s’agit d’une étape de CI hors bande.

Ces validateurs lisent des octets PDF non fiables. PdfRValidator supprime les littéraux entre parenthèses et les littéraux hexadécimaux avant l’extraction des clés, afin qu’une chaîne Creator forgée ne puisse pas injecter une fausse clé /Name (avec gestion des échappements d’ISO 32000-1:2008 §7.3.4.2). L’adaptateur Arlington exécute le vérificateur amont dans un sous-processus borné. Il traite un dépassement de délai ou une erreur d’exécution comme « aucun signalement » plutôt que de se fier à une sortie partielle. Consulte le modèle de menace du projet pour la surface d’attaque de l’analyse PDF.

StandardClauseCe que fait le module ComplianceStatut
ISO 23504-1:2020 (PDF/R-1)§6.5.7PdfRValidator applique la liste d’autorisation {q,Q,cm,Do} des opérateurs de flux de contenuVérifié (tests unitaires + profil de standards + intégration réussis)
ISO 23504-1:2020 (PDF/R-1)§6.4.3PdfRValidator applique la liste d’autorisation des clés du dictionnaire InfoVérifié (étayé par des tests)
ISO 23504-1:2020 (PDF/R-1)§6.7, §6.8Le cluster v5.1.0 ne les met pas en œuvreNon-couverture explicite (déclarée dans claims.json)
ISO 32000-2:2020 (PDF 2.0)§7.5.2Parcours de la liste d’autorisation des clés du CatalogRevendiqué (parcours regex ; structurel)
ISO 19005-4:2020 (PDF/A-4)§6.7.3Prise en compte du schéma d’identification via le module de conformitéRéférence croisée (voir /specifications/pdfa4/)

La prise en charge n’est pas la conformité. Une exécution de PdfRValidator qui ne renvoie aucun signalement prouve que l’entrée ne s’écarte pas des seules clauses du §6 que le validateur met en œuvre. Elle n’affirme pas que le fichier est un PDF/R-1 conforme : le §6.7 et le §6.8 ne sont pas vérifiés. Le contrôle croisé Arlington est consultatif et n’affirme jamais la conformité. Pour PDF/A-4, le validateur faisant autorité reste veraPDF, exécuté hors bande : voir le module de conformité pour l’oracle veraPDF et son verrouillage optionnel.

Les citations sont paraphrasées à partir du corpus de conformité NextPDF. Les empreintes reference_id de 64 caractères complètes sont enregistrées dans le front-matter de la page et dans _normative-evidence-conf.md.