Produire une sortie PDF/A-4 et la contrôler avec l'oracle veraPDF
Ce recipe produit une sortie PDF/A-4 avec le PdfAManager Premium, exécute veraPDF et utilise son verdict comme contrôle de build. La bibliothèque produit les artefacts ; le validateur décide de la conformité. Il suit examples/32-pdfa4-icc.php.
Prérequis
Section intitulée « Prérequis »- Core installé :
composer require nextpdf/core:^3. - Premium installé :
composer require nextpdf/pro. Le PDF/A-4 est une fonctionnalité du niveau Premium (ADR-011). Sans Premium,enablePdfA()lèveInvalidConfigExceptionavec un chemin de mise à niveau. - veraPDF disponible dans le
PATHpour l’étape de contrôle.
- Sonde le registre de capacités pour
security.pdfaafin qu’une installation Core seule reçoive un message clair au lieu d’une trace d’appels. - Crée le document et appelle
enablePdfA()avant d’ajouter du contenu. - Définis les métadonnées et écris le contenu. N’appelle pas
setEncryption(); le PDF/A interdit la cléEncrypt. - Sauvegarde. Lors de
save(), lePdfAManagerplanifie l’OutputIntent, le profil ICC embarqué et les schémas d’extension XMP. - Exécute
verapdf --flavour 4sur la sortie. Fais échouer le build si le code de sortie est non nul. Le verdict du validateur constitue le contrôle.
Exemple complet
Section intitulée « Exemple complet »<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Exception\InvalidConfigException;use NextPDF\Support\CapabilityRegistry;
$out = __DIR__ . '/archival.pdf';
// Step 1 — probe before activating a Premium-gated feature.$registry = CapabilityRegistry::getInstance();if (!$registry->get('security.pdfa')->isAvailable()) { fwrite(STDERR, "PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro\n"); exit(1);}
try { $doc = Document::createStandalone();
// Step 2 — enable PDF/A-4 before content. Defaults to PdfA4. $doc->enablePdfA();
// Step 3 — metadata and content. No setEncryption() on a PDF/A document. $doc->setTitle('Archival Record 2026-0042'); $doc->setLanguage('en'); $doc->addPage(); $doc->setFont('helvetica', '', 12); $doc->cell(0, 10, 'This document targets PDF/A-4.', newLine: true);
// Step 4 — save. PdfAManager emits OutputIntent + ICC + XMP here. $doc->save($out);} catch (InvalidConfigException $e) { fwrite(STDERR, "PDF/A-4 activation failed: {$e->getMessage()}\n"); exit(1);}
// Step 5 — the gate. veraPDF, not the library, asserts conformance.$exitCode = 0;$output = [];exec('verapdf --flavour 4 ' . escapeshellarg($out), $output, $exitCode);
if ($exitCode !== 0) { fwrite(STDERR, "veraPDF FAILED — output is not PDF/A-4 conforming\n"); fwrite(STDERR, implode("\n", $output) . "\n"); exit(1);}
echo "veraPDF PASS — archival.pdf is reported PDF/A-4 conforming by veraPDF\n";Sortie attendue
Section intitulée « Sortie attendue »Quand veraPDF réussit :
veraPDF PASS — archival.pdf is reported PDF/A-4 conforming by veraPDFQuand le paquet Premium est absent, le script se termine avec un code non nul, affiche un message exploitable et n’écrit aucun fichier.
Cas limites
Section intitulée « Cas limites »- Contrôle Premium. Sur une installation Core seule,
enablePdfA()lèveInvalidConfigExceptionen indiquantsecurity.pdfaet le remèdecomposer require nextpdf/pro. Sonde d’abord le registre. - Conflit de chiffrement. Appeler
setEncryption(),useAesGcm()ousetPublicKeyEncryption()sur un document PDF/A déclenche une exception d’incompatibilité, quel que soit l’ordre d’appel. Le PDF/A interdit la cléEncryptdu trailer. - Variante de conformité. Passe un
PdfAVersionàenablePdfA()pour4eou4f. La valeur par défaut est4. - Le contrôle, c’est le validateur, pas le moteur. Un
save()réussi signifie que NextPDF a émis les artefacts qu’exige le PDF/A-4. À lui seul, il ne prouve pas la conformité. veraPDF atteste la conformité ; ce recipe fait de son verdict le contrôle. N’affirme pas qu’un fichier est conforme au PDF/A-4 tant que le validateur n’a pas rendu un verdict positif.
Conformité
Section intitulée « Conformité »| Énoncé | Spécification | Article | reference_id |
|---|---|---|---|
| Un fichier PDF/A-4 peut spécifier ses caractéristiques colorimétriques avec un OutputIntent PDF/A qui référence un profil ICC embarqué (les couleurs indépendantes du périphérique peuvent aussi être spécifiées directement ; §6.2.4.1). | ISO 19005-4 | §6.2.3 | |
| Le chiffrement est interdit en PDF/A-4. | ISO 19005-4 | §6.6.4 | |
| Le PDF/A-4 contient l’identification pdfaid dans les métadonnées XMP. | ISO 19005-4 | §6.7.5 |
Le validateur atteste la conformité. La bibliothèque produit une sortie destinée à être conforme ; l’oracle décide.