Ga naar inhoud

CLI: commandhandlers en adapters voor externe validators

De command-line interface (CLI)-module biedt de commando-interface van de engine voor diagnostiek en conformiteit. De module bevat handlers voor de commando’s benchmark, diff, init, verify en capabilities, plus adapters die externe Portable Document Format (PDF)-validators, waaronder veraPDF en het Arlington PDF model, achter één interface verpakken. Eén verify-commando kan elke adapter uitvoeren.

Terminal window
composer require nextpdf/core:^3

Elk commando gebruikt een handlerklasse waarvan de methode execute() een proces-exitcode retourneert. BenchmarkHandler voert benchmarkscenario’s uit. DiffHandler vergelijkt documenten. InitHandler genereert de basisstructuur van een project. VerifyHandler voert conformiteitsverificatie uit. CapabilitiesHandler rapporteert de runtime-ondersteuning. CliOutput is de lichtgewicht stdout/stderr-writer die de handlers delen, zodat de uitvoer testbaar blijft in plaats van gekoppeld te zijn aan globals. BinaryFinder bepaalt het pad naar een extern hulpprogramma op de host (@since 2.5.0).

Het validatie-oppervlak is de centrale architecturale grens. AlternateValidatorAdapter is de interface die een externe validator implementeert. validate() neemt een PDF-pad en een ComplianceFlavour en retourneert een ComplianceValidationResult. isAvailable() rapporteert of het onderliggende hulpprogramma is geïnstalleerd. toolIdentifier() benoemt het hulpprogramma. VeraPdfCliAdapter, ArlingtonValidatorAdapter en AsyncValidatorAdapter implementeren deze interface. De engine implementeert validators van derden niet opnieuw. De engine voert de referentiehulpprogramma’s uit en normaliseert hun oordeel. Een validator die niet is geïnstalleerd, rapporteert isAvailable() === false in plaats van de run te laten mislukken, zodat de verificatie het ontbrekende hulpprogramma expliciet vastlegt. De adapters zijn @since 3.0.0; de core-handlers zijn @since 2.3.0@since 2.5.0.

KlasseBelangrijkste membersRol
BenchmarkHandlerexecute(string $format = 'pretty', ?string $scenario = null): intVoert benchmarkscenario’s uit (@since 2.4.0)
VerifyHandlerexecute(): intStuurt de conformiteitsverificatie aan
DiffHandler / InitHandlerexecute(): intDocumentvergelijking / projectscaffolding
CapabilitiesHandlerexecute(string $format = 'pretty'): intRapporteert de runtime-mogelijkheden (@since 2.3.0)
AlternateValidatorAdapter (interface)validate(), isAvailable(), toolIdentifier()Contract voor externe validators (@since 3.0.0)
VeraPdfCliAdapterimplementeert de adapterVerpakt de veraPDF CLI (@since 3.0.0)
ArlingtonValidatorAdapterimplementeert de adapterVerpakt het Arlington PDF model (@since 3.0.0)
AsyncValidatorAdapterimplementeert de adapterAsync-geschikte validator-wrapper (@since 3.0.0)
CliOutputwrite(), writeln(), error()Testbare stdout/stderr-writer (@since 2.3.0)
BinaryFinderpadresolutie voor externe hulpprogramma’sVindt hulpprogramma’s op de host (@since 2.5.0)

Voor de volledige PHPDoc-tabel voer je composer docs:generate-api-php -- --module=Cli uit.

Bron: examples/33-validate-conformance.php. Selecteer een validator-adapter en controleer de beschikbaarheid voordat je die gebruikt:

<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Cli\VeraPdfCliAdapter;
use NextPDF\Compliance\ComplianceFlavour;
$validator = new VeraPdfCliAdapter(/* binary path / process factory */);
if (!$validator->isAvailable()) {
fwrite(STDERR, "veraPDF is not installed; conformance verification skipped.\n");
exit(2);
}
$result = $validator->validate('/srv/out/report.pdf', ComplianceFlavour::PdfA4);
echo $result->isCompliant() ? "PASS\n" : "FAIL\n";

Voer de verificatie uit via de validators die aanwezig zijn. Behandel een ontbrekend hulpprogramma als een overgeslagen controle, niet als een fout.

<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Cli\AlternateValidatorAdapter;
use NextPDF\Compliance\ComplianceFlavour;
use Psr\Log\LoggerInterface;
final readonly class ConformanceGate
{
/** @param list<AlternateValidatorAdapter> $validators */
public function __construct(
private array $validators,
private LoggerInterface $logger,
) {}
public function verify(string $pdfPath, ComplianceFlavour $flavour): bool
{
$ran = false;
foreach ($this->validators as $validator) {
if (!$validator->isAvailable()) {
$this->logger->info('Validator absent; skipped.', ['tool' => $validator->toolIdentifier()]);
continue;
}
$ran = true;
if (!$validator->validate($pdfPath, $flavour)->isCompliant()) {
$this->logger->error('Conformance failed.', ['tool' => $validator->toolIdentifier()]);
return false;
}
}
// No validator available is not a pass — surface it.
return $ran;
}
}
  • Een niet-beschikbare validator retourneert isAvailable() === false en gooit geen uitzondering. „Geen validator beschikbaar” is geen geslaagde controle; behandel dit als een afzonderlijke toestand, zoals het productievoorbeeld doet.
  • De adapters voeren externe binaries uit. Hun oordeel is het genormaliseerde oordeel van het externe hulpprogramma, geen onafhankelijke herimplementatie. Houd de hulpprogramma’s up-to-date.
  • De execute() van een handler retourneert een proces-exitcode. Een code die niet nul is, betekent een fout. Geef die door vanuit je wrapper in plaats van die te negeren.
  • BinaryFinder bepaalt het pad naar een hulpprogramma op de host. Een andere host kan een andere versie van het hulpprogramma vinden. Leg de omgeving vast voor reproduceerbare verificatie.
  • Het reproduceerbaarheidsprofiel is structural: rapporten op verificatieniveau bevatten tijdstempels en versies van hulpprogramma’s, waardoor die velden per run verschillen.

De overhead van de handlers is verwaarloosbaar. De processen van externe validators bepalen het grootste deel van de kosten, en grote documenten kunnen traag zijn. Met AsyncValidatorAdapter kun je die latentie overlappen. De performance_budget van 1500 ms wall / 64 MB piek is de engine-referentie, geen limiet voor een externe validator. Benchmarkuitvoer heeft een deterministische structuur, maar bevat noodzakelijkerwijs timinggegevens.

De adapters starten externe processen voor een PDF-pad. Behandel de PDF als niet-vertrouwde invoer en voer de verificatie uit in een afgeschermde omgeving. Externe validators verwerken vijandige gegevens. Valideer en canonicaliseer elk bestandspad voordat je het aan een handler doorgeeft, zodat path traversal geen onbedoeld bestand kan bereiken. Geef geen niet-opgeschoonde gebruikersinvoer door als commandoargumenten. De adapters bouwen procesargumenten op, geen shell-strings. Het invoerbestand zelf blijft onder controle van een aanvaller. Zie het dreigingsmodel van de engine in /modules/core/security/.

Deze module doet zelf geen normatieve uitspraak over de PDF-specificatie. De module orkestreert de conformiteitsverificatie door deze te delegeren aan referentievalidators: veraPDF voor PDF/A en PDF/UA, en het Arlington PDF model voor de structurele regels van ISO 32000-2. Het externe hulpprogramma levert het gezaghebbende conformiteitsoordeel. Deze module normaliseert dat oordeel en rapporteert het. End-to-end-conformiteit en de golden baselines worden beschreven in /modules/core/conformance/.