Aller au contenu

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.

  • 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ève InvalidConfigException avec un chemin de mise à niveau.
  • veraPDF disponible dans le PATH pour l’étape de contrôle.
  1. Sonde le registre de capacités pour security.pdfa afin qu’une installation Core seule reçoive un message clair au lieu d’une trace d’appels.
  2. Crée le document et appelle enablePdfA() avant d’ajouter du contenu.
  3. Définis les métadonnées et écris le contenu. N’appelle pas setEncryption() ; le PDF/A interdit la clé Encrypt.
  4. Sauvegarde. Lors de save(), le PdfAManager planifie l’OutputIntent, le profil ICC embarqué et les schémas d’extension XMP.
  5. Exécute verapdf --flavour 4 sur la sortie. Fais échouer le build si le code de sortie est non nul. Le verdict du validateur constitue le contrôle.
<?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";

Quand veraPDF réussit :

veraPDF PASS — archival.pdf is reported PDF/A-4 conforming by veraPDF

Quand le paquet Premium est absent, le script se termine avec un code non nul, affiche un message exploitable et n’écrit aucun fichier.

  • Contrôle Premium. Sur une installation Core seule, enablePdfA() lève InvalidConfigException en indiquant security.pdfa et le remède composer require nextpdf/pro. Sonde d’abord le registre.
  • Conflit de chiffrement. Appeler setEncryption(), useAesGcm() ou setPublicKeyEncryption() sur un document PDF/A déclenche une exception d’incompatibilité, quel que soit l’ordre d’appel. Le PDF/A interdit la clé Encrypt du trailer.
  • Variante de conformité. Passe un PdfAVersion à enablePdfA() pour 4e ou 4f. La valeur par défaut est 4.
  • 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.
ÉnoncéSpécificationArticlereference_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.