Aller au contenu

ISO 19005-4 (PDF/A-4) : correspondance des fonctionnalités NextPDF

ISO 19005-4:2020 (PDF/A-4) est le profil d’archivage de PDF 2.0. Cette page le met en regard de NextPDF sans rien masquer : ce que Core émet, ce que l’extension nextpdf/pro ajoute et ce que NextPDF ne couvre explicitement pas. NextPDF émet des structures pertinentes pour PDF/A-4 ; seul un validateur peut affirmer qu’un fichier est conforme.

Fenêtre de terminal
composer require nextpdf/core:^3
# PDF/A-4 file authoring (OutputIntent + ICC + XMP) requires:
# composer require nextpdf/pro

ISO 19005-4:2020 s’appuie sur ISO 32000-2:2020 (PDF 2.0), contrairement à PDF/A-2 et PDF/A-3, qui s’appuient sur ISO 32000-1:2008 (PDF 1.7). NextPDF encode cette différence de filiation dans ConformanceMode::requiresPdf17(). Cette méthode renvoie false pour chaque cas PDF/A-4 et true pour PDF/A-2 et PDF/A-3.

PDF/A-4 définit trois formes de conformité. Le profil de base n’a pas de lettre pdfa:conformance. PDF/A-4e (annexe B, ingénierie / contenu 3D) fixe pdfa:conformance = E. PDF/A-4f (annexe A, fichiers embarqués) fixe pdfa:conformance = F. ISO 19005-4:2020 §6.7.3 spécifie le schéma d’identification PDF/A dans l’espace de noms AIIM. Cette clause impose qu’un fichier conforme ni à PDF/A-4e ni à PDF/A-4f ne fournisse aucune entrée pdfa:conformance. NextPDF reproduit cela exactement dans ConformanceMode::pdfaConformanceLetter() : PdfA4 renvoie la chaîne vide, PdfA4e renvoie E, PdfA4f renvoie F.

La limite critique entre éditions est la suivante : la production de fichiers PDF/A-4 — le dictionnaire OutputIntent, le profil ICC embarqué, le schéma d’extension XMP, les garanties de sous-ensemble de polices et l’interdiction du chiffrement — est implémentée dans le PdfAManager Enterprise. Le PdfAManager Enterprise est livré dans l’extension nextpdf/pro. Dans une installation Core seule, Document::enablePdfA() lève InvalidConfigException parce que la capacité security.pdfa n’est pas enregistrée. L’exemple exécutable (examples/32-pdfa4-icc.php) le démontre en sondant le registre des capacités et en échouant proprement avec un message clair, plutôt qu’avec une trace de pile.

Par conséquent, avec Core uniquement, la surface PDF/A-4 se limite au discriminateur : NextPDF enregistre la variante PDF/A-4 déclarée par un document. NextPDF émet les marqueurs pdfaid:part = 4 / pdfa:conformance définis par le schéma. Produire un fichier PDF/A-4 complet — puis valider qu’il est conforme — sont deux étapes distinctes. La première requiert nextpdf/pro. La seconde requiert veraPDF.

SurfaceÉditionCe qu’elle fournit
ConformanceMode::PdfA4 / PdfA4e / PdfA4fcoreLe discriminateur de variante
ConformanceMode::pdfaPart()4coreNuméro de partie ISO 19005
ConformanceMode::pdfaConformanceLetter()'' / 'E' / 'F'coreLettre de conformité §6.7.3
ConformanceMode::requiresPdf17()falsecoreGarde-fou de filiation PDF 2.0
Document::enablePdfA()proProduction OutputIntent + ICC + XMP ; lève InvalidConfigException en Core
<?php
declare(strict_types=1);
use NextPDF\Conformance\ConformanceMode;
// Core: introspect the declared PDF/A-4f contract.
$mode = ConformanceMode::PdfA4f;
$mode->pdfaPart(); // 4
$mode->pdfaConformanceLetter(); // 'F' (ISO 19005-4:2020 §6.7.3 / Annex A)
$mode->requiresPdf17(); // false (PDF/A-4 is PDF 2.0 lineage)
<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Exception\InvalidConfigException;
use NextPDF\Support\CapabilityRegistry;
// PDF/A-4 file authoring requires the Premium extension. Probe first so a
// Core-only install gets a clear rationale, not a stack trace.
$registry = CapabilityRegistry::getInstance();
if (!$registry->get('security.pdfa')->isAvailable()) {
throw new InvalidConfigException(
configKey: 'security.pdfa',
givenValue: 'Core-only install',
expectedType: 'nextpdf/pro extension (Enterprise PdfAManager)',
);
}
$doc = Document::createStandalone();
$doc->enablePdfA(); // Emits OutputIntent + ICC + pdfaid XMP (Premium).
// … write content …
$doc->save(__DIR__ . '/out/archive-a4.pdf');
// The file now CARRIES PDF/A-4 structures. Conformance is still unproven
// until veraPDF asserts it:
//
// verapdf --flavour 4 out/archive-a4.pdf
  • Core ne peut pas produire un fichier PDF/A-4. enablePdfA() lève une exception en Core. Seuls le discriminateur et les marqueurs XMP relèvent de la surface Core.
  • Le PDF/A-4 de base n’émet aucun pdfa:conformance. Selon ISO 19005-4:2020 §6.7.3, seuls PDF/A-4e et PDF/A-4f fixent la lettre. ConformanceMode::PdfA4 renvoie la chaîne vide par conception.
  • Filiation PDF 2.0, pas PDF 1.7. Une erreur fréquente consiste à réutiliser un pipeline PDF/A-3 en s’attendant à %PDF-1.7. PDF/A-4 est du PDF 2.0 ; requiresPdf17() renvoie false pour tous les cas PDF/A-4.
  • La validation ICC est Premium. La validation ICC de l’OutputIntent (ISO 19005-4:2020 §6.2.2 : nombre magique acsp, table de balises, point blanc D50) relève du PdfAManager Enterprise, pas de Core.
  • La bibliothèque ne certifie pas le fichier. Fixer PdfA4f et émettre les marqueurs ne rend pas la sortie un fichier PDF/A-4f valide. Lance veraPDF.

La surface PDF/A-4 de Core est une simple introspection de type-valeur (répartition par enum match, O(1), sans allocation). Le chemin de production Premium ajoute l’OutputIntent et le paquet ICC à l’écriture. Son coût correspond à la taille du profil embarqué, gérée à l’intérieur du budget du writer. La validation veraPDF est une étape hors bande et ne fait pas partie de la génération.

PDF/A-4 interdit le chiffrement. Le PdfAManager Enterprise applique l’invariant d’interdiction du chiffrement. Le PdfAManager Enterprise place cet invariant dans la séquence de enablePdfA() afin qu’un appelant ne puisse pas combiner accidentellement AES-GCM avec le mode archivage. Le garde-fou en amont de Core, dans HasSecurity::enablePdfA(), rejette la combinaison non prise en charge avant qu’aucun octet ne soit écrit. Consulte le modèle de menace du projet pour le détail du pipeline d’archivage.

Cette page présente une correspondance de fonctionnalités, pas une affirmation de conformité.

Domaine ISO 19005-4:2020ArticleCouverture NextPDFStatut
Schéma d’identification de variante§6.7.3ConformanceMode émet pdfaid:part = 4 et la lettre pdfa:conformance correspondantePris en charge (Core ; testé unitairement dans tests/Unit/Conformance/)
Garde-fou de filiation PDF 2.0§6.7.3 / baserequiresPdf17() renvoie false pour tous les cas PDF/A-4Vérifié (testé unitairement)
OutputIntent + ICC embarqué§6.2.2Le PdfAManager Enterprise (nextpdf/pro)Premium uniquement (pas Core)
Schéma d’extension XMP, sous-ensemble de polices, interdiction du chiffrement§6 / annexe A/BLe PdfAManager Enterprise (nextpdf/pro)Premium uniquement (pas Core)
Détermination de la conformitéArticle 5Non effectuée par NextPDF — relève de veraPDFNon-couverture explicite

La prise en charge n’est pas la conformité — et cette page distingue délibérément les deux. (a) NextPDF Core émet les structures que ISO 19005-4:2020 §6.7.3 définit pour l’identification de variante — c’est de l’implémentation, attestée par tests/Unit/Conformance/ConformanceModePdfAVariantTest.php (qui passe). (b) Le fait qu’un fichier soit conforme à PDF/A-4 est une affirmation distincte que seul un validateur peut établir, selon ISO 19005-4:2020 Article 5. L’article 5 énonce que la détermination réelle de la conformité est effectuée par rapport aux exigences normatives par un outil de vérification. NextPDF formule l’affirmation (a). NextPDF ne formule pas l’affirmation (b). Valide avec veraPDF (verapdf --flavour 4 …, ou php oracle/run.php pour le harnais oracle — qui ne s’exécute que lorsque le binaire veraPDF est présent, un garde-fou en opt-in).

Les expressions « PDF/A-4 compliant », « fully conformant » et « PDF/A-4 certified » sont délibérément absentes de cette page. NextPDF émet des structures pertinentes pour PDF/A-4 ; il ne garantit pas qu’un fichier est conforme.

Les citations sont paraphrasées à partir du corpus de conformité NextPDF. Les empreintes reference_id complètes de 64 caractères sont enregistrées dans le front-matter de la page et dans docs/public/modules/core/_normative-evidence-conf.md.