Générer une sortie PDF/A-4 archivable
En un coup d’œil
Section intitulée « En un coup d’œil »Ce recipe génère une sortie PDF/A-4 archivable (ISO 19005-4) avec le PdfAManager Pro. Lors de l’enregistrement, NextPDF planifie l’OutputIntent, le profil ICC intégré et les métadonnées d’identification. NextPDF produit une sortie destinée à être conforme ; un validateur indépendant décide de la conformité. Ce recipe suit examples/32-pdfa4-icc.php.
Installation
Section intitulée « Installation »composer require nextpdf/core:^3composer require nextpdf/proPDF/A-4 est une fonctionnalité du niveau Pro. Sur une installation limitée au cœur, enablePdfA() lève InvalidConfigException. Le message indique la capacité security.pdfa manquante ainsi que le correctif composer require nextpdf/pro. L’étape de vérification nécessite un validateur PDF/A disponible sur le PATH. Les exemples utilisent veraPDF avec --flavour 4.
Vue d’ensemble conceptuelle
Section intitulée « Vue d’ensemble conceptuelle »PDF/A-4 est le profil d’archivage ISO 19005-4 bâti sur ISO 32000-2 (PDF 2.0). Un fichier conforme rend les couleurs de façon déterministe et reste autonome. Il déclare un OutputIntent qui référence un profil ICC de destination intégré afin que les couleurs puissent être reproduites sans ressources externes (§6.2.3). Chaque programme de fonte est intégré (§6.2.10.4.1). Le document contient les métadonnées d’identification pdfaid dans le XMP (§6.7.3). Le fichier n’est pas chiffré (§6.6.4 : PDF/A interdit la clé de trailer Encrypt).
NextPDF modélise PDF/A avec l’énumération typée ConformanceMode. enablePdfA() instancie le PdfAManager Pro, avec ConformanceMode::PdfA4 par défaut. Le gestionnaire planifie l’OutputIntent, le flux ICC et les schémas d’extension XMP pendant save(). Les discriminants pdfaPart() et pdfaConformanceLetter() gardent les métadonnées pdfaid:part / pdfaid:conformance alignées sur la variante choisie (base 4, 4e, 4f). Le profil de base n’émet aucune lettre pdfa:conformance, comme l’exige la partie.
Surface d’API
Section intitulée « Surface d’API »La surface d’API est générée à partir du PHPDoc. Les points d’entrée clés :
\NextPDF\Core\Document::createStandalone(): DocumentDocument::enablePdfA(?object $version = null): static\NextPDF\Support\CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable(): bool\NextPDF\Conformance\ConformanceMode::PdfA4/PdfA4e/PdfA4fConformanceMode::pdfaPart(): 2|3|4|nulletConformanceMode::pdfaConformanceLetter(): string
Exemple de code — Démarrage rapide
Section intitulée « Exemple de code — Démarrage rapide »<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Support\CapabilityRegistry;
$out = __DIR__ . '/output/32-pdfa4-icc.pdf';
// Probe before activating a Pro-gated feature so a Core-only install// gets an actionable message instead of a stack trace.$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);}
$doc = Document::createStandalone();$doc->enablePdfA(); // defaults to ConformanceMode::PdfA4$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);$doc->save($out); // PdfAManager emits OutputIntent + ICC + XMP here
echo "Created: output/32-pdfa4-icc.pdf\n";Exemple de code — Production
Section intitulée « Exemple de code — Production »Voici le programme autonome, exécutable dans le harnais. En production, fais du verdict du validateur le point de contrôle du build. Un save() réussi prouve que NextPDF a émis les artefacts ; seul le validateur prouve la conformité.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Exception\InvalidConfigException;use NextPDF\Support\CapabilityRegistry;
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: (__DIR__ . '/archival.pdf');
if (!CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable()) { fwrite(STDERR, "PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro\n"); exit(1);}
try { $doc = Document::createStandalone(); $doc->enablePdfA(); // ConformanceMode::PdfA4
$doc->setTitle('Archival Record 2026-0042'); $doc->setLanguage('en'); $doc->addPage(); $doc->setFont('helvetica', '', 12); $doc->cell(0, 10, 'Long-term archival record. PDF/A-4 (ISO 19005-4).', newLine: true);
// Do NOT call setEncryption(): PDF/A prohibits the Encrypt key and // the call raises an incompatibility exception in either order. $doc->save($out);} catch (InvalidConfigException $e) { fwrite(STDERR, "PDF/A-4 activation failed: {$e->getMessage()}\n"); exit(1);}
$exitCode = 0;$report = [];exec('verapdf --flavour 4 ' . escapeshellarg($out), $report, $exitCode);
if ($exitCode !== 0) { fwrite(STDERR, "veraPDF FAILED — output is not PDF/A-4 conforming\n"); fwrite(STDERR, implode("\n", $report) . "\n"); exit(1);}
echo "veraPDF PASS — archival.pdf is reported PDF/A-4 conforming\n";La sortie STDOUT attendue, sur un hôte où nextpdf/pro est installé et où verapdf signale le fichier comme conforme, est :
veraPDF PASS — archival.pdf is reported PDF/A-4 conformingSur un hôte limité au cœur, le programme se termine avec un code non nul après avoir écrit PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro sur STDERR. Si verapdf signale un problème, le programme se termine avec un code non nul après veraPDF FAILED — output is not PDF/A-4 conforming. La formulation attribue le verdict à veraPDF : NextPDF n’affirme pas la conformité PDF/A-4.
Cas limites & pièges
Section intitulée « Cas limites & pièges »- Verrou Pro. Sur une installation limitée au cœur,
enablePdfA()lèveInvalidConfigException. Le message indiquesecurity.pdfaet le correctifcomposer require nextpdf/pro. Interroge d’abord le registre pour obtenir un message d’opérateur propre. - Conflit de chiffrement. Appeler
setEncryption(),useAesGcm()ousetPublicKeyEncryption()sur un document PDF/A lève une exception d’incompatibilité quel que soit l’ordre des appels — PDF/A-4 interdit la clé de trailerEncrypt(ISO 19005-4 §6.6.4). - Variante de conformité. Passe le
PdfAVersionPro àenablePdfA()pour4e(ingénierie, 3D) ou4f(pièces jointes). Le profil de base n’émet aucune lettrepdfa:conformance;4e/4fdéfinissentE/F. Le discriminantConformanceModegardepdfaid:partcohérent. - Le balisage est indépendant. Le profil PDF/A-4 de base traite le balisage comme optionnel. Pour un livrable à la fois accessible et archivable, active le mode balisé et PDF/A séparément ; voir le recipe PDF/UA-2.
- Le point de contrôle, c’est le validateur. Un
save()réussi signifie que les artefacts ont été émis, pas que le fichier est conforme. N’affirme pas la conformité PDF/A-4 tant que le validateur n’a pas réussi.
Performance
Section intitulée « Performance »L’OutputIntent ajoute un flux de profil ICC (quelques centaines de Ko pour sRGB), ainsi que le paquet XMP. L’intégration des fontes pèse le plus dans la taille lorsque le document utilise des fontes hors des 14 fontes de base. Pour des documents d’archivage classiques, le recipe reste dans le budget de 2000 ms / 128 Mo. Le profil de reproductibilité sémantique s’applique : un livrable destiné à être validé se compare par AST structurel et métadonnées plutôt que par octets bruts.
Notes de sécurité
Section intitulée « Notes de sécurité »Résidence des données & atténuation des données personnelles
Section intitulée « Résidence des données & atténuation des données personnelles »La sortie d’archivage est, par conception, durable et autonome. Toute donnée personnelle présente dans le contenu persiste pendant toute la durée de vie de l’archive. Le profil ICC intégré et les métadonnées voyagent avec le fichier. Applique une politique de rétention et de minimisation avant l’archivage. PDF/A-4 ne fournit aucune sémantique de caviardage.
Télémétrie sûre & nettoyage des journaux
Section intitulée « Télémétrie sûre & nettoyage des journaux »Le recipe n’écrit qu’une ligne de progression fixe. La sortie de veraPDF peut inclure des fragments de contenu — garde les journaux du validateur hors des collecteurs de journaux partagés pour les documents au contenu sensible.
Modèle de menace
Section intitulée « Modèle de menace »PDF/A-4 est un profil de fidélité d’archivage, pas un contrôle d’intégrité ni d’authenticité. Il ne signe pas le fichier et ne le rend pas inaltérable. Combine-le avec une signature quand la provenance compte. Un recipe distinct couvre la signature. Le chiffrement est mutuellement exclusif avec PDF/A par spécification.
Comportement en mode FIPS
Section intitulée « Comportement en mode FIPS »Ce recipe n’effectue aucune opération cryptographique. Le mode FIPS ne change pas son comportement. PDF/A-4 interdit le chiffrement, donc aucun algorithme de chiffrement n’est sélectionné.
Conformité
Section intitulée « Conformité »| Affirmation | Spécification | Clause | reference_id |
|---|---|---|---|
| PDF/A-4 exige un OutputIntent qui référence un profil ICC intégré. | ISO 19005-4 | §6.2.3 | |
| La couleur est indépendante du périphérique grâce au profil de destination de sortie. | ISO 19005-4 | §6.2.4.3 | |
| Chaque programme de fonte est intégré. | ISO 19005-4 | §6.2.10.4.1 | |
| Le document contient l’identification pdfaid dans le XMP. | ISO 19005-4 | §6.7.3 | |
| Le chiffrement est interdit dans PDF/A-4. | ISO 19005-4 | §6.6.4 | |
| C’est un validateur, et non le producteur, qui décide de la conformité. | ISO 19005-4 | §6.7.3 |
NextPDF produit une sortie destinée à être conforme à PDF/A-4. Le support n’est pas la conformité ; un profil testé n’est pas une certification. Ce recipe n’affirme pas la conformité ; celle-ci est décidée par un validateur indépendant (par exemple veraPDF). Fais de son verdict le point de contrôle du build.