Aller au contenu
getnextpdf.com

Pro édition

Conformité — Référence détaillée

Le module Compliance regroupe trois surfaces indépendantes sous NextPDF\Pro\Compliance :

  • Signalement des balises de langue — une façade de politique /Lang PDF/UA-2 stricte ainsi qu’un rapporteur d’événements de conformité structuré, au format PSR-3.
  • Gestion des e-factures — validation Factur-X 1.08 / ZUGFeRD 2.4 par rapport au modèle sémantique EN 16931, et émission hybride PDF/A-3.
  • Provenance — intégration et extraction de magasins de manifestes C2PA fournis par l’appelant via un analyseur JUMBF renforcé contre les attaques ; la synthèse de revendications reste réservée à l’aperçu.

Le module signale ce qu’il vérifie. Il ne certifie pas les documents et n’effectue pas de signature cryptographique.

Cette fonctionnalité est fournie dans NextPDF Pro (nextpdf/pro) et s’active avec une enveloppe de licence de niveau Pro. Un déploiement sans ce droit ne charge pas les classes de la fonctionnalité. Comparer les éditions et obtenir une licence.

Il n’existe pas d’indicateur de licence par fonctionnalité. Il s’agit d’une fonctionnalité de l’édition Pro. Le générateur de revendications C2PA expérimental nécessite en plus une activation explicite via l’environnement (voir Cas limites et modes de défaillance).

Fenêtre de terminal
composer require nextpdf/pro:^3
SymboleParamètresComportement par défautRetourneLève ou échoue avecNotes
LangComplianceReporter::warn() / ::error()string $tag, string $reason, ?string $clauseReference = nullÉmet un enregistrement JSON structuré par événement de balise de langue via le journaliseur PSR-3voidJsonException si l’enregistrement échoue à l’encodage JSONwarn = rejet en mode laxiste ; error = rejet en mode strict
LangComplianceReporter::reportException()InvalidBcp47TagException $exception, string $severity = 'error'Extrait la balise et la raison de l’exception ; délègue à warn() ou error()voidComme ci-dessusChemin de commodité
LangComplianceReporter::buildRecord()string $severity, string $tag, string $reason, ?string $clauseReference = nullConstruit le tableau d’enregistrement sans journalisationarrayNe lève pasPour des puits personnalisés tels que des résumés JSON par fichier
ConformancePolicy::default()?LoggerInterface $logger = nullPolitique UA-2 stricte : les balises /Lang malformées ou non enregistrées sont rejetéesselfNe lève pasLe défaut en v5.0 est strict
ConformancePolicy::fromCore()CoreConformancePolicy $core, ?LoggerInterface $logger = nullEncapsule une politique Core existante telle quelle ; aucun axe inverséselfNe lève pasPréférer default() pour la posture stricte
ConformancePolicy::withStrictUa2()bool $enabledRetourne une copie avec l’axe strict défini ; la désactivation émet un notice PSR-3selfNe lève pasDésactivation dépréciée ; cible de suppression 6.0.0
ConformancePolicy::isStrictUa2() / ::mode()Lit la politique Core sous-jacentebool / ConformanceModeNe lève pas
EInvoiceValidator::validate()string $pdfPathPipeline complet : vérification du conteneur PDF/A-3, extraction des pièces jointes, détection du profil, règles EN 16931, SchematronEInvoiceValidationResultSous-classe d’EInvoiceException en cas d’échec d’E/S, de structure PDF malformée ou de plantage de l’outillageInterface SPI figée ; un PDF non-e-facture bien formé retourne un résultat, ne lève jamais
EInvoiceXmlValidator::validate()string $xmlPayload, ValidatorContext $contextPré-vérification structurelle plus le corpus de règles sémantiques approfondies EN 16931 sur une charge utile CIIcontrat ValidationResultNe lève pas pour une entrée invalide ; le rejet se manifeste par un résultat en échec avec des constatsValidateur concret inter-niveaux ; entrée filtrée via XmlGuard
EInvoiceValidationResult::isValid()Vrai uniquement lorsque le conteneur, la spécification de pièce jointe, le profil et la syntaxe tiennent et qu’aucune violation FATAL n’existeboolNe lève pasUne liste de violations vide ne suffit pas à établir la validité
EInvoiceValidationResult::notAnEInvoice()Résultat déterministe tout-null, tout-fauxselfNe lève pasFabrique pour le cas « pas une facture hybride »
EInvoiceProfileénumération basée sur chaîneCas MINIMUM, BASIC_WL, BASIC, EN16931, EXTENDED, adossés aux URN BT-24isEn16931Conformant() est faux pour MINIMUM et BASIC_WL
EInvoiceSyntaxénumération basée sur chaîneCas UN_CEFACT_CII, UBL_INVOICE, UBL_CREDIT_NOTESeul CII est isFacturXEligible() ; UBL est réservé au validateur
BusinessRuleViolationstring $ruleId, BusinessRuleSeverity $severity, string $message, ?string $xpath = null, ?string $ramPath = nullDTO de violation immuableFamilles d’identifiants de règle BR-, BR-CO-, BR-CL-, BR-DEC-, BR-FXEXT-
BusinessRuleSeverityénumération basée sur chaîneFATAL invalide la facture ; WARNING signale un problème de qualitéReflète les niveaux Schematron EN 16931
FacturXEmbedder::embed()voir le bloc de signatureAjoute un flux de fichier intégré, une filespec et du XMP à une source PDF/A ; réécrit la xrefvoidEInvoiceException en cas de XML malformé, de source illisible, de catalogue manquant, de source à flux d’objets ou à flux xref, ou d’échec d’écriture en sortieLe fichier source reste intact
FacturXEmbedderOptions::default()/AFRelationship /Alternative, nom de fichier factur-x.xml, type INVOICE, version 1.0selfNe lève pasLes valeurs par défaut satisfont le mandat allemand et restent acceptées en France
FacturXEmbedderOptions::withRelationship() / ::withFilename()stringRetourne une copie avec le remplacement appliquéselfInvalidArgumentException en dehors des ensembles d’acceptationRelations : Source, Data, Alternative ; les noms de fichiers incluent zugferd-invoice.xml et xrechnung.xml
FacturXEmbedderOptions::withDocumentType()string $documentTypeRetourne une copie avec le remplacement du type de document XMPselfNe lève pasLes valeurs ne sont pas énumérées de façon défensive
FacturXContractEmbedder::embed()string $pdfBytes, string $xmlPayload, EmbedderOptions $optionsAdaptateur octets-en-entrée, octets-en-sortie au-dessus de FacturXEmbedder via des fichiers temporaires éphémèresstringEInvoiceException ; le profil XRECHNUNG est rejeté car réservé à EnterpriseImplémentation inter-niveaux d’EmbedderInterface
C2paManifestEmbedder::embed()string $pdfBytes, ManifestStore $storeIntègre la sérialisation en octets du magasin à l’emplacement du profilstringC2paException en cas d’échec d’intégrationInterface SPI figée ; octets uniquement, aucune E/S
C2paManifestEmbedder::extract()string $pdfBytesAnalyse un magasin intégré via l’analyseur JUMBF renforcéManifestStore|nullSous-classe de C2paException lorsqu’un magasin est présent mais enfreint un plafond de renforcementNull signale l’absence ; l’absence ne lève jamais
ManifestStore::fromBoxes() / ::empty()list<JumbfBox> / —Construit l’objet valeur immuable du magasinselfNe lève pasL’ordre des boîtes est déterminant pour l’égalité en aller-retour
ManifestStore::toBytes() / ::isEmpty() / ::size()Sérialise les boîtes racines ; un magasin vide se sérialise en une chaîne videstring / bool / intNe lève pas
JumbfBoxParser::parse()string $bytesAnalyse les boîtes JUMBF de niveau racine sous des plafonds strictslist<JumbfBox>MalformedJumbfException, JumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededExceptionPlafonds : profondeur 8, 64 Mio par boîte, 128 Mio au total, MAX_CHILDREN_PER_SUPERBOX 4096
JumbfBox::superbox() / ::leaf()string $tbox, …Construit une boîte validée ; toBytes() fait un aller-retour via l’analyseurselfMalformedJumbfException lorsque le TBox ne fait pas exactement 4 octets
C2paCapabilityStatus::current() / ::summary()Signale la maturité de la fonctionnalité C2PA, actuellement preview-draftself / stringNe lève pasMarqueur d’aperçu vérifiable par machine
Feature::PREVIEW_C2PA_DRAFT->isEnabled()Lit l’environnement du processus à chaque appel ; seul le littéral '1' activeboolNe lève pasVariable d’environnement NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT
ExperimentalC2paEmbedder::buildManifestStore()string $sourceBytes, string $producerConstruit un magasin de manifestes épinglé à un brouillon avec une assertion de revendication de liaison par hachage SHA-256ManifestStoreLe constructeur lève LogicException lorsque l’indicateur d’aperçu est désactivéAperçu ; format de fil épinglé à un instantané de brouillon ; aucune signature de revendication émise

Signatures des points d’entrée, telles quelles :

public static function default(?LoggerInterface $logger = null): self
public function withStrictUa2(bool $enabled): self
public function isStrictUa2(): bool
public function validate(string $pdfPath): EInvoiceValidationResult
public function embed(
string $sourcePdfPath,
string $xml,
EInvoiceProfile $profile,
string $outputPdfPath,
?FacturXEmbedderOptions $options = null,
): void
public function embed(string $pdfBytes, ManifestStore $store): string
public function extract(string $pdfBytes): ?ManifestStore

Signalement des balises de langue. LangComplianceReporter émet un enregistrement JSON structuré par événement de balise de langue PDF/UA-2. Chaque enregistrement porte le discriminant d’événement fixe, une sévérité (warn pour un rejet en mode laxiste, error pour un rejet en mode strict), la balise fautive telle quelle, une raison lisible par machine, les composants analysés de la balise (ou null lorsque la balise échoue à la grammaire de forme RFC 5646), une référence de clause ISO 14289-2 §8.4.4, et un horodatage UTC avec microsecondes. Le JSON circule comme corps du message PSR-3 ; les puits en aval analysent directement le champ message. ConformancePolicy est la façade Premium au-dessus de la politique de conformité Core. Son défaut applique une gestion de langue UA-2 stricte et rejette une balise malformée ou non enregistrée atteignant /Lang. L’assistant de désactivation withStrictUa2(false) revient au comportement laxiste hérité et journalise un notice PSR-3 lorsque la valeur effective change réellement. NextPDF marque cet assistant déprécié depuis la v5.0, avec une cible de suppression 6.0.0. Pour migrer : auditer le corpus à la recherche de valeurs /Lang malformées avec composer pdfua2:audit-lang-tags <pdf-or-dir>, les corriger, puis supprimer l’appel de désactivation.

Gestion des e-factures. EInvoiceValidator est le contrat SPI figé pour la validation de PDF hybrides : vérification du conteneur PDF/A-3, extraction des pièces jointes /AF, détection du profil à partir de l’identifiant de spécification BT-24, le moteur de règles métier EN 16931 et une passe Schematron. Un PDF non-Factur-X bien formé retourne EInvoiceValidationResult::notAnEInvoice() plutôt que de lever ; seuls les échecs d’E/S, une structure PDF malformée ou des plantages de l’outillage lèvent une sous-classe d’EInvoiceException. EInvoiceXmlValidator est le validateur XML concret inter-niveaux : il filtre l’entrée via le XmlGuard Core, exécute une pré-vérification structurelle et le corpus approfondi de règles sémantiques EN 16931, et échoue de façon fermée — les erreurs du moteur se manifestent comme des constats d’erreur, jamais comme des passages silencieux. FacturXEmbedder transforme une source PDF/A en un PDF/A-3 hybride : il ajoute un flux de fichier intégré, une filespec avec un /AFRelationship configurable et un paquet d’extension XMP Factur-X, puis réécrit la table de références croisées classique. Le tableau /AF du catalogue et l’arbre de noms /Names /EmbeddedFiles référencent tous deux la pièce jointe, de sorte que les lecteurs ZUGFeRD hérités la résolvent.

Provenance. C2paManifestEmbedder intègre un magasin de manifestes C2PA fourni par l’appelant dans une chaîne d’octets PDF, ou en extrait un. ManifestStore est l’objet valeur immuable qui franchit la frontière. La jointure est en octets uniquement et neutre vis-à-vis du fournisseur : elle ne synthétise pas de revendications, n’ingère pas de références URI et ne résout pas de liaisons par hachage, et elle n’effectue aucune E/S réseau ou système de fichiers. extract() retourne null en cas d’absence et reste peu coûteuse sur les PDF sans magasin. Chaque extraction non nulle a déjà franchi les plafonds de renforcement de JumbfBoxParser.

Ce module signale ce qu’il vérifie. Il ne certifie pas un document, ne le rend pas juridiquement contraignant et ne garantit pas qu’une sortie satisfait une réglementation. Le validateur d’e-factures n’est pas un validateur d’administration fiscale et exclut les extensions nationales (par exemple SDI italien, Chorus Pro français, XRechnung allemand). Comme l’énonce EN 16931-1, l’émetteur de la facture reste responsable du respect des règles de la législation applicable. La prise en charge d’une norme n’est pas une conformité à celle-ci. Consulte ton équipe conformité pour la suffisance réglementaire.

  • Un PDF non-Factur-X bien formé retourne un résultat « pas une e-facture » ; il ne lève pas.
  • Une liste vide de violations de règles métier ne signifie pas à elle seule que le document est valide ; les vérifications du conteneur et des pièces jointes s’appliquent aussi.
  • FacturXEmbedder échoue de façon fermée sur les sources utilisant des flux d’objets compressés (/Type /ObjStm) ou des flux de références croisées (/Type /XRef, /XRefStm hybride). Réenregistre d’abord ces sources avec une table de références croisées classique.
  • Les charges utiles XML sont filtrées via le XmlGuard Core : les déclarations DOCTYPE ou d’entités, une entrée surdimensionnée et un UTF-8 invalide sont rejetés avec une EInvoiceException sur le chemin d’intégration, ou un résultat en échec sur le chemin de validation.
  • FacturXContractEmbedder rejette le profil XRECHNUNG de façon explicite au lieu de le rétrograder silencieusement ; l’émission XRechnung est une fonctionnalité Enterprise.
  • C2paManifestEmbedder::extract() distingue l’absence (null) de la malformation (sous-classe de C2paException nommant l’invariant enfreint : structure malformée, bombe de taille ou de compte, cycle de décalage, profondeur d’imbrication).
  • La construction d’ExperimentalC2paEmbedder lève une LogicException sauf si l’indicateur d’environnement d’aperçu vaut '1'. Son format de fil est épinglé à un instantané de brouillon C2PA et peut changer sans préavis ; il n’émet aucune signature de revendication. Cette fonctionnalité reste en aperçu jusqu’à ce que le profil PDF C2PA soit figé.
  • La désactivation laxiste de l’UA-2 stricte est dépréciée ; migre vers le défaut strict (voir Contrat de comportement).
  • Ce module n’effectue pas de signature cryptographique. La signature de revendications C2PA et la garde des clés sont hors périmètre ; voir le module Security pour le comportement de signature en mode FIPS.
ComportementRéférenceStatut
Déclaration de langue naturelle (/Lang)ISO 14289-2:2024 §8.4.4Vérifié / signalé
Modèle sémantique de facture de baseEN 16931-1:2026Vérifié (l’émetteur reste responsable)
Fichiers associés / flux de fichiers intégrésISO 32000-2:2020 §14.13.2Émis (/AF, /EF, /Params)
Règles de relation de pièce jointe et de conteneurFactur-X 1.08 §3.1, §6.2Émis / vérifié (défaut /AFRelationship /Alternative)
Magasin de manifestes C2PA / JUMBFC2PA 2.1 §11.1Intégration / extraction prises en charge ; synthèse de revendications en aperçu

Ceci consigne les spécifications par rapport auxquelles le module est construit ainsi que ce qu’il vérifie ou émet. Ce n’est pas une déclaration de certification ou de suffisance réglementaire. NextPDF ne détient aucune certification pour ces normes.

  • La forme d’enregistrement du rapporteur est un contrat stable ; les règles d’alerte en aval peuvent s’ancrer sur le discriminant d’événement fixe.
  • La désactivation de l’UA-2 stricte émet un avis de dépréciation visible en télémétrie uniquement lorsque la valeur effective change ; réaffirmer la valeur actuelle est silencieux.
  • L’intégrateur Factur-X préserve les octets source tels quels et ajoute de nouveaux objets ; il vise à préserver la conformité PDF/A-3 mais ne revalide pas. Fais passer la sortie par un validateur PDF/A externe pour une attestation ferme.
  • La jointure C2PA fige cinq invariants : aucun import tiers, contrat en octets uniquement, aucune E/S, extraction null-en-cas-d’absence, et aucune synthèse de revendications dans la couche stable.
  • Les plafonds de JumbfBoxParser sont des constantes publiques ; dimensionne les entrées que tu acceptes en fonction d’elles plutôt que de redériver des limites.

Cette page documente uniquement le comportement observable de l’extérieur et la surface d’API publique prise en charge. Les chemins de namespace internes, les classes utilitaires, les tables de mécanismes, les noms de fichiers de runbook et les préfixes de tickets sont hors périmètre.