Aller au contenu

Conformité PDF/A-4 : ce que NextPDF émet pour ISO 19005-4

Délimitation du périmètre. NextPDF produit une sortie destinée à être conforme à PDF/A-4 ; la bibliothèque n’affirme pas elle-même la conformité — ce rôle revient à un validateur comme veraPDF.

PDF/A-4 correspond à ISO 19005-4:2020, le profil d’archivage basé sur PDF 2.0. NextPDF Core expose le discriminateur ConformanceMode (PdfA4, PdfA4e, PdfA4f). Le moteur Premium nextpdf/pro émet l’OutputIntent, le profil ICC incorporé et le schéma d’identification XMP pdfaid lors de save(). La bibliothèque produit les artefacts ; veraPDF décide de la conformité. ISO 19005-4 §6.7.3 est explicite : les propriétés pdfaid:part/pdfaid:rev « ne déterminent pas à elles seules la conformité ».

Fenêtre de terminal
composer require nextpdf/core:^3
composer require nextpdf/pro # OutputIntent + ICC + XMP authoring

La capacité Core security.pdfa est enregistrée, mais se déclare indisponible sans nextpdf/pro. enablePdfA() lève alors InvalidConfigException avec un chemin de mise à niveau, au lieu d’émettre un fichier non conforme.

Document::enablePdfA(?object $version = null) associe une entrée de l’énumération PdfAVersion à un cas ConformanceMode. La méthode se rabat par défaut sur ConformanceMode::PdfA4 si l’entrée n’est pas reconnue ('4e' → PdfA4e, '4f' → PdfA4f). Le mode pilote trois obligations d’émission que la norme impose à tout fichier conforme :

  • OutputIntent + ICC — §6.2.3 permet à un fichier conforme de spécifier ses caractéristiques colorimétriques au moyen d’un OutputIntent PDF/A-4 qui référence un flux ICC DestOutputProfile. Selon §6.2.4.1, c’est l’une des deux voies autorisées vers une couleur indépendante du périphérique (l’autre étant des espaces colorimétriques indépendants du périphérique spécifiés directement). L’OutputIntent est donc la voie que NextPDF utilise, pas une exigence inconditionnelle de la norme.
  • Identification pdfaid — §6.7.3 exige le schéma d’identification PDF/A dans le XMP au niveau du document (l’espace de noms AIIM pdfaid) avec pdfaid:part/pdfaid:rev. PDF/A-4e et PDF/A-4f ajoutent pdfa:conformance (E / F). §6.7.3 indique aussi qu’un fichier qui n’est conforme ni à PDF/A-4e ni à PDF/A-4f ne doit pas fournir de valeur pdfa:conformance.
  • Incorporation des polices — §6.2.10 exige que toutes les polices utilisées pour le rendu soient incorporées.

NextPDF émet ces éléments ; il ne réalise pas la détermination de conformité du §5. Ce rôle revient à veraPDF, et §6.7.3 réserve la détermination à ce processus.

MéthodeEffet
enablePdfA(?object $version = null): staticSélectionne ConformanceMode::PdfA4/PdfA4e/PdfA4f ; planifie OutputIntent + ICC + XMP lors de save(). Lève InvalidConfigException|PageLayoutException|CompressionException si nextpdf/pro est absent.
ConformanceMode::pdfaPart(): ?intRenvoie la partie d’ISO 19005 pour le mode actif (4 pour PdfA4*).
ConformanceMode::pdfaConformanceLetter(): stringRenvoie la lettre pdfa:conformance (E / F) ou une chaîne vide.
<?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';
$registry = CapabilityRegistry::getInstance();
if (!$registry->get('security.pdfa')->isAvailable()) {
fwrite(STDERR, "PDF/A-4 requires nextpdf/pro.\n");
exit(1);
}
try {
$doc = Document::createStandalone();
$doc->enablePdfA(); // ConformanceMode::PdfA4
$doc->setTitle('Archival Record 2026-0042');
$doc->setLanguage('en');
$doc->writeHtml('<h1>Archival record</h1><p>Body.</p>');
$doc->save($out); // OutputIntent + ICC + XMP scheduled here
} catch (InvalidConfigException $e) {
fwrite(STDERR, $e->getMessage() . "\n");
exit(1);
}
echo "Wrote {$out} — validate: verapdf --flavour 4 {$out}\n";

Utilise le verdict du validateur comme barrière de build. Exécute verapdf --flavour 4 sur la sortie et fais échouer le build sur un code de sortie non nul. Le verdict du validateur est cette barrière : l’émission de la bibliothèque lui sert d’entrée, elle n’est jamais le verdict lui-même. Consulte /cookbook/php/pdfa4-conformance-gate/ pour le pipeline complet avec cette barrière.

  • Active avant le contenu. Appelle enablePdfA() avant d’ajouter du contenu ; une activation rétroactive ne retraitera pas les objets déjà écrits.
  • Pas de chiffrement. PDF/A interdit la clé Encrypt. N’appelle pas setEncryption() sur un document PDF/A. Le chiffrement relève de la confidentialité, pas de l’intégrité archivistique ; ici, les deux s’excluent mutuellement.
  • pdfa:conformance est conditionnel. Seuls PDF/A-4e et PDF/A-4f le définissent. L’émettre sur un fichier PDF/A-4 simple constitue en soi une violation de conformité (§6.7.3) — le cas ConformanceMode empêche cela par construction.
  • Pièces jointes PDF/A-4f. Les fichiers incorporés à un fichier PDF/A-4f doivent porter les clés F et UF (Desc recommandé) selon §6.7.5. C’est la base de la voie hybride ZUGFeRD/Factur-X.

L’incorporation d’OutputIntent + ICC ajoute un flux ICC de taille fixe (le profil de l’espace de travail) et le paquet XMP à save(). Le budget est un temps mural ≤ 1500 ms et un pic ≤ 128 Mo pour un document typique.

PDF/A-4 interdit le chiffrement. Le profil impose une contrainte d’archivage et de longévité, pas un contrôle de sécurité. La gestion des clés et la politique du vérificateur sont hors du périmètre de ce profil ; consulte le centre de confiance.

Résidence des données & atténuations des données personnelles

Section intitulée « Résidence des données & atténuations des données personnelles »

L’émission PDF/A-4 s’exécute dans le processus et n’écrit que le document, le profil ICC incorporé et le paquet XMP. Aucun contenu ne quitte le processus. Les données personnelles présentes dans le contenu source relèvent de la responsabilité de l’intégrateur — le profil ne caviarde rien.

L’exemple n’écrit que le chemin de sortie et la commande du validateur sur STDERR. Aucun octet du document n’est écrit dans les journaux. Le recipe respecte NEXTPDF_COOKBOOK_OUTPUT et n’envoie jamais le PDF vers STDOUT.

Un fichier PDF/A-4 n’est protégé par aucun contrôle d’accès. Quiconque possède le fichier peut le lire ; le profil garantit la longévité du rendu, pas la confidentialité. Traite le flux ICC de l’OutputIntent comme public.

L’émission PDF/A-4 n’effectue aucune cryptographie. Une signature numérique sur un fichier PDF/A-4 (PDF/A-4 §6.5 permet les profils PAdES) relève d’un sujet distinct, traité par le recipe de signature, et reprend la posture FIPS de ce recipe. Cette page n’émet aucune affirmation sur les signatures.

AffirmationSpécificationClausereference_id
Un fichier PDF/A-4 peut spécifier ses caractéristiques colorimétriques avec un OutputIntent PDF/A référençant un profil ICC DestOutputProfile.ISO 19005-4§6.2.3
La couleur indépendante du périphérique peut être spécifiée directement ou indirectement via le DestOutputProfile de l’OutputIntent (l’une des deux voies permises).ISO 19005-4§6.2.4.1
La version PDF/A est identifiée via le schéma d’identification PDF/A (pdfaid) dans le XMP du document.ISO 19005-4§6.7.3
pdfaid:part / pdfaid:rev ne déterminent pas à eux seuls la conformité ; la détermination est effectuée selon la Clause 5.ISO 19005-4§6.7.3
Un fichier qui n’est conforme ni à PDF/A-4e ni à PDF/A-4f ne doit pas fournir de valeur pdfa:conformance.ISO 19005-4§6.7.3
Dans PDF/A-4f, les fichiers incorporés doivent comporter les clés F et UF (Desc recommandé).ISO 19005-4§6.7.5
Toutes les polices utilisées pour le rendu doivent être incorporées.ISO 19005-4§6.2.10
L’usage de la transparence / des couleurs dépend d’un OutputIntent déclaré.ISO 19005-4§6.2.9

Les citations sont des pointeurs clause-id + reference_id vers le corpus de vérification. Aucun texte de la norme n’est reproduit ; les clauses sont résumées avec les mots de NextPDF.