Ga naar inhoud

Compliance: PDF/R-1-validator, Arlington-grammatica en levenscyclus-hulpmiddelen

NextPDF\Compliance levert byte-stroomvalidators en een grammatica-kruiscontrole die een voltooid Portable Document Format (PDF)-bestand inlezen en rapporteren waar het afwijkt van een normatief contract. Als een validator nul bevindingen oplevert, is het resultaat getoetst aan de clausules die de validator implementeert. Het is geen algemeen certificaat.

Terminal window
composer require nextpdf/core:^3

De module bestaat uit drie onderdelen.

PdfRValidator valideert een kandidaat-byte-stroom volgens ISO 23504-1:2020 (PDF/R-1). Hij werkt op ruwe bytes, niet op de interne status van de writer. Hij signaleert drift tussen wat de writer beoogt uit te voeren en wat de specificatie vereist, en fungeert als eindcontrole. De geïmplementeerde set clausules is het v5.1.0-cluster: §5 versie-identificatiecommentaar, §6.2.2/§6.2.3 header-allowlist, §6.2.4 verbod op generatie-0 en objectstreams, §6.5.7 allowlist voor content-stream-operatoren (alleen q, Q, cm, Do), §6.6.1 allowlist voor sleutels van afbeelding-XObjects, §6.4.3 allowlist voor sleutels van het Info-dictionary, en §6.3 allowlist voor sleutels van de Catalog. §6.7 incrementele updates en §6.8 versleuteling vallen expliciet buiten het bereik van het initiële cluster en worden als zodanig vastgelegd in claims.json. De validator stopt niet bij de eerste bevinding. Hij verzamelt elke afwijking in één doorloop, zodat de volledige diff zichtbaar is.

PdfRConformancePolicy is een onveranderlijk beleid voor de aanbevolen-maar-informatieve marges rond PDF/R-1. De normatieve §6-ondergrens is nooit configureerbaar. Het beleid regelt alleen de §A.5-aanbevelingen voor implementatielimieten, het ontmoedigen van multi-strips in §6.6.1, en de §A.6-eis voor XMP Extensible Metadata Platform (XMP) met het oog op een latere PDF/A-herclassificatie.

ArlingtonValidator voert het upstream Arlington PDF-model van de PDF Association uit in report-only-modus. In de huidige cyclus is hij adviserend: validateReportOnly() gooit nooit een exception. Hij gebruikt drie fallbackmodi. Wanneer de binary van de referentie-checker beschikbaar is, parseert hij gestructureerde bevindingen. Wanneer alleen de vastgepinde grammatica beschikbaar is, geeft hij één info-bevinding af die aantoont dat de grammatica-pin is geladen. Wanneer de grammatica niet beschikbaar is, retourneert hij een lege lijst. Een WaiverRegistry laat de orchestrator bekende, acceptabele meningsverschillen onderdrukken terwijl het audittraject behouden blijft.

De eerlijkheidsregel sluit aan op de ondersteuningsmatrix voor Cascading Style Sheets (CSS) en op de conformance-module. Een clausule is alleen Verified wanneer er een slagende test bestaat en de normatieve clausule wordt aangehaald. Een clausule die wel is geïmplementeerd maar geen specifieke, slagende fixture heeft, is Claimed. Clausules die buiten het bereik vallen, worden expliciet vermeld. Ze blijven niet impliciet. Een resultaat van PdfRValidator met nul bevindingen bevestigt alleen de clausules die de validator controleert. Hij doet geen uitspraak over §6.7 of §6.8, die hij niet implementeert.

TypeSoortBelangrijkste members
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 is gebaseerd op reguliere expressies, niet op een volledige parser. Hij richt zich op de deterministische uitvoer van NextPDF\Writer\PdfRWriter. Gebruik hem als driftdetector voor die writer, niet als algemene PDF-parser.
  • Nul bevindingen ≠ volledige PDF/R-1-conformiteit. §6.7 (incrementele updates) en §6.8 (versleuteling) zijn niet geïmplementeerd in het v5.1.0-cluster en zijn als buiten bereik vastgelegd in claims.json. Beschouw een schoon resultaat als “geen afwijking op de geïmplementeerde set clausules”, en niets meer.
  • Arlington is adviserend. In de huidige cyclus laat validateReportOnly() de build nooit mislukken. Continuous integration (CI) gebruikt het artefact, maar laat er geen gate op afhangen.
  • PDF/A-validatie van het International Color Consortium (ICC) zit hier niet in. De ICC-validatie van OutputIntent volgens ISO 19005-4:2020 §6.2.2 zit in de Enterprise-PdfAManager (nextpdf/pro), niet in de Compliance-module van Core. Het PDF/A-oppervlak van Core is beperkt tot de ConformanceMode-discriminator.
  • Waivers behouden het audittraject. Een rule waarvoor een waiver geldt, wordt onderdrukt uit de lijst met bevindingen, maar de waiver-vermelding blijft vastleggen waarom.

PdfRValidator::validate() is één lineaire doorloop met begrensde regex-walks door de byte-stroom. De kosten schalen met de documentgrootte en blijven ruim binnen het modulebudget. In de grammar-only-modus is ArlingtonValidator O(grammar-rule-count) voor de bevinding die aantoont dat de grammatica is geladen. Het pad via de referentie-checker draait als subproces en wordt begrensd door het upstream-hulpmiddel, niet door NextPDF. Het is een out-of-band CI-stap.

Deze validators lezen niet-vertrouwde PDF-bytes. PdfRValidator verwijdert tussen haakjes geplaatste literals en hexadecimale literals vóór het extraheren van sleutels, zodat een geprepareerde Creator-string geen valse /Name-sleutel kan injecteren (ISO 32000-1:2008 §7.3.4.2 escape-afhandeling). De Arlington-adapter voert de upstream-checker uit als een begrensd subproces. Hij behandelt een time-out of uitvoeringsfout als “geen bevindingen” in plaats van gedeeltelijke uitvoer te vertrouwen. Zie het dreigingsmodel van het project voor het aanvalsoppervlak van het PDF-parsen.

StandaardClausuleWat de Compliance-module doetStatus
ISO 23504-1:2020 (PDF/R-1)§6.5.7PdfRValidator handhaaft de {q,Q,cm,Do} allowlist voor content-stream-operatorenVerified (unit- + standards-profile- + integratietests slagen)
ISO 23504-1:2020 (PDF/R-1)§6.4.3PdfRValidator handhaaft de allowlist voor sleutels van het Info-dictionaryVerified (afgedekt door tests)
ISO 23504-1:2020 (PDF/R-1)§6.7, §6.8Niet geïmplementeerd in het v5.1.0-clusterExpliciete niet-dekking (vastgelegd in claims.json)
ISO 32000-2:2020 (PDF 2.0)§7.5.2Doorloopt de Catalog-sleutelallowlistClaimed (regex-doorloop; structureel)
ISO 19005-4:2020 (PDF/A-4)§6.7.3Bewustzijn van het identificatieschema via de Conformance-moduleKruisverwijzing (zie /specifications/pdfa4/)

Ondersteuning is geen conformiteit. Een run van PdfRValidator die geen bevindingen oplevert, bewijst alleen dat de invoer niet afweek van de §6-clausules die de validator implementeert. Het bevestigt niet dat het bestand conform PDF/R-1 is: §6.7 en §6.8 worden niet gecontroleerd. De Arlington-kruiscontrole is adviserend en bevestigt nooit conformiteit. Voor PDF/A-4 is veraPDF de gezaghebbende validator en draait deze out-of-band. Zie de conformance-module voor het veraPDF-oracle en de opt-in-gating ervan.

Citaten zijn geparafraseerd uit de compliance-corpus van NextPDF. De volledige 64-tekens lange reference_id-digests zijn vastgelegd in de frontmatter van de pagina en in _normative-evidence-conf.md.