Conformité : validateur PDF/R-1, grammaire Arlington et outils de cycle de vie
En un coup d’œil
Section intitulée « En un coup d’œil »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.
Installation
Section intitulée « Installation »composer require nextpdf/core:^3Aperçu conceptuel
Section intitulée « Aperçu conceptuel »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.
Surface d’API
Section intitulée « Surface d’API »| Type | Genre | Membres clés |
|---|---|---|
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 |
Exemple de code — Démarrage rapide
Section intitulée « Exemple de code — Démarrage rapide »<?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"; }}Exemple de code — Production
Section intitulée « Exemple de code — Production »<?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, ]);}Cas limites et pièges
Section intitulée « Cas limites et pièges »PdfRValidators’appuie sur des expressions régulières : ce n’est pas un parseur complet. Il cible la sortie déterministe deNextPDF\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
PdfAManagerEnterprise (nextpdf/pro), pas dans le module Compliance de Core. La surface PDF/A de Core se limite au discriminateurConformanceMode. - 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.
Performance
Section intitulée « Performance »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.
Notes de sécurité
Section intitulée « Notes de sécurité »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.
Conformité
Section intitulée « Conformité »| Standard | Clause | Ce que fait le module Compliance | Statut |
|---|---|---|---|
| ISO 23504-1:2020 (PDF/R-1) | §6.5.7 | PdfRValidator applique la liste d’autorisation {q,Q,cm,Do} des opérateurs de flux de contenu | Vérifié (tests unitaires + profil de standards + intégration réussis) |
| ISO 23504-1:2020 (PDF/R-1) | §6.4.3 | PdfRValidator applique la liste d’autorisation des clés du dictionnaire Info | Vérifié (étayé par des tests) |
| ISO 23504-1:2020 (PDF/R-1) | §6.7, §6.8 | Le cluster v5.1.0 ne les met pas en œuvre | Non-couverture explicite (déclarée dans claims.json) |
| ISO 32000-2:2020 (PDF 2.0) | §7.5.2 | Parcours de la liste d’autorisation des clés du Catalog | Revendiqué (parcours regex ; structurel) |
| ISO 19005-4:2020 (PDF/A-4) | §6.7.3 | Prise 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.
Voir aussi
Section intitulée « Voir aussi »- Module de conformité — routage
ConformanceModeet l’oracle veraPDF - Module d’audit — piste d’audit et surface d’attestation
- Mappage de spécification PDF/A-4 — couverture ISO 19005-4 et non-couverture
- Module de sécurité — modèle de menace de l’analyse PDF