Pro édition
Conformité — Référence détaillée
En un coup d’œil
Section intitulée « En un coup d’œil »Le module Compliance regroupe trois surfaces indépendantes sous NextPDF\Pro\Compliance :
- Signalement des balises de langue — une façade de politique
/LangPDF/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.
Disponibilité et licence
Section intitulée « Disponibilité et licence »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).
Surface d’API publique
Section intitulée « Surface d’API publique »composer require nextpdf/pro:^3| Symbole | Paramètres | Comportement par défaut | Retourne | Lève ou échoue avec | Notes |
|---|---|---|---|---|---|
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-3 | void | JsonException si l’enregistrement échoue à l’encodage JSON | warn = 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() | void | Comme ci-dessus | Chemin de commodité |
LangComplianceReporter::buildRecord() | string $severity, string $tag, string $reason, ?string $clauseReference = null | Construit le tableau d’enregistrement sans journalisation | array | Ne lève pas | Pour des puits personnalisés tels que des résumés JSON par fichier |
ConformancePolicy::default() | ?LoggerInterface $logger = null | Politique UA-2 stricte : les balises /Lang malformées ou non enregistrées sont rejetées | self | Ne lève pas | Le défaut en v5.0 est strict |
ConformancePolicy::fromCore() | CoreConformancePolicy $core, ?LoggerInterface $logger = null | Encapsule une politique Core existante telle quelle ; aucun axe inversé | self | Ne lève pas | Préférer default() pour la posture stricte |
ConformancePolicy::withStrictUa2() | bool $enabled | Retourne une copie avec l’axe strict défini ; la désactivation émet un notice PSR-3 | self | Ne lève pas | Désactivation dépréciée ; cible de suppression 6.0.0 |
ConformancePolicy::isStrictUa2() / ::mode() | — | Lit la politique Core sous-jacente | bool / ConformanceMode | Ne lève pas | — |
EInvoiceValidator::validate() | string $pdfPath | Pipeline complet : vérification du conteneur PDF/A-3, extraction des pièces jointes, détection du profil, règles EN 16931, Schematron | EInvoiceValidationResult | Sous-classe d’EInvoiceException en cas d’échec d’E/S, de structure PDF malformée ou de plantage de l’outillage | Interface SPI figée ; un PDF non-e-facture bien formé retourne un résultat, ne lève jamais |
EInvoiceXmlValidator::validate() | string $xmlPayload, ValidatorContext $context | Pré-vérification structurelle plus le corpus de règles sémantiques approfondies EN 16931 sur une charge utile CII | contrat ValidationResult | Ne lève pas pour une entrée invalide ; le rejet se manifeste par un résultat en échec avec des constats | Validateur 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’existe | bool | Ne lève pas | Une liste de violations vide ne suffit pas à établir la validité |
EInvoiceValidationResult::notAnEInvoice() | — | Résultat déterministe tout-null, tout-faux | self | Ne lève pas | Fabrique pour le cas « pas une facture hybride » |
EInvoiceProfile | énumération basée sur chaîne | Cas MINIMUM, BASIC_WL, BASIC, EN16931, EXTENDED, adossés aux URN BT-24 | — | — | isEn16931Conformant() est faux pour MINIMUM et BASIC_WL |
EInvoiceSyntax | énumération basée sur chaîne | Cas UN_CEFACT_CII, UBL_INVOICE, UBL_CREDIT_NOTE | — | — | Seul CII est isFacturXEligible() ; UBL est réservé au validateur |
BusinessRuleViolation | string $ruleId, BusinessRuleSeverity $severity, string $message, ?string $xpath = null, ?string $ramPath = null | DTO de violation immuable | — | — | Familles d’identifiants de règle BR-, BR-CO-, BR-CL-, BR-DEC-, BR-FXEXT- |
BusinessRuleSeverity | énumération basée sur chaîne | FATAL invalide la facture ; WARNING signale un problème de qualité | — | — | Reflète les niveaux Schematron EN 16931 |
FacturXEmbedder::embed() | voir le bloc de signature | Ajoute un flux de fichier intégré, une filespec et du XMP à une source PDF/A ; réécrit la xref | void | EInvoiceException 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 sortie | Le fichier source reste intact |
FacturXEmbedderOptions::default() | — | /AFRelationship /Alternative, nom de fichier factur-x.xml, type INVOICE, version 1.0 | self | Ne lève pas | Les valeurs par défaut satisfont le mandat allemand et restent acceptées en France |
FacturXEmbedderOptions::withRelationship() / ::withFilename() | string | Retourne une copie avec le remplacement appliqué | self | InvalidArgumentException en dehors des ensembles d’acceptation | Relations : Source, Data, Alternative ; les noms de fichiers incluent zugferd-invoice.xml et xrechnung.xml |
FacturXEmbedderOptions::withDocumentType() | string $documentType | Retourne une copie avec le remplacement du type de document XMP | self | Ne lève pas | Les valeurs ne sont pas énumérées de façon défensive |
FacturXContractEmbedder::embed() | string $pdfBytes, string $xmlPayload, EmbedderOptions $options | Adaptateur octets-en-entrée, octets-en-sortie au-dessus de FacturXEmbedder via des fichiers temporaires éphémères | string | EInvoiceException ; le profil XRECHNUNG est rejeté car réservé à Enterprise | Implémentation inter-niveaux d’EmbedderInterface |
C2paManifestEmbedder::embed() | string $pdfBytes, ManifestStore $store | Intègre la sérialisation en octets du magasin à l’emplacement du profil | string | C2paException en cas d’échec d’intégration | Interface SPI figée ; octets uniquement, aucune E/S |
C2paManifestEmbedder::extract() | string $pdfBytes | Analyse un magasin intégré via l’analyseur JUMBF renforcé | ManifestStore|null | Sous-classe de C2paException lorsqu’un magasin est présent mais enfreint un plafond de renforcement | Null signale l’absence ; l’absence ne lève jamais |
ManifestStore::fromBoxes() / ::empty() | list<JumbfBox> / — | Construit l’objet valeur immuable du magasin | self | Ne lève pas | L’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 vide | string / bool / int | Ne lève pas | — |
JumbfBoxParser::parse() | string $bytes | Analyse les boîtes JUMBF de niveau racine sous des plafonds stricts | list<JumbfBox> | MalformedJumbfException, JumbfBombException, JumbfCycleDetectedException, JumbfDepthExceededException | Plafonds : 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’analyseur | self | MalformedJumbfException lorsque le TBox ne fait pas exactement 4 octets | — |
C2paCapabilityStatus::current() / ::summary() | — | Signale la maturité de la fonctionnalité C2PA, actuellement preview-draft | self / string | Ne lève pas | Marqueur d’aperçu vérifiable par machine |
Feature::PREVIEW_C2PA_DRAFT->isEnabled() | — | Lit l’environnement du processus à chaque appel ; seul le littéral '1' active | bool | Ne lève pas | Variable d’environnement NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT |
ExperimentalC2paEmbedder::buildManifestStore() | string $sourceBytes, string $producer | Construit un magasin de manifestes épinglé à un brouillon avec une assertion de revendication de liaison par hachage SHA-256 | ManifestStore | Le 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): selfpublic function withStrictUa2(bool $enabled): selfpublic function isStrictUa2(): boolpublic function validate(string $pdfPath): EInvoiceValidationResultpublic function embed( string $sourcePdfPath, string $xml, EInvoiceProfile $profile, string $outputPdfPath, ?FacturXEmbedderOptions $options = null,): voidpublic function embed(string $pdfBytes, ManifestStore $store): stringpublic function extract(string $pdfBytes): ?ManifestStoreContrat de comportement
Section intitulée « Contrat de comportement »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.
Cas limites et modes de défaillance
Section intitulée « Cas limites et modes de défaillance »- 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,/XRefStmhybride). 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
XmlGuardCore : les déclarations DOCTYPE ou d’entités, une entrée surdimensionnée et un UTF-8 invalide sont rejetés avec uneEInvoiceExceptionsur le chemin d’intégration, ou un résultat en échec sur le chemin de validation. FacturXContractEmbedderrejette le profilXRECHNUNGde 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 deC2paExceptionnommant l’invariant enfreint : structure malformée, bombe de taille ou de compte, cycle de décalage, profondeur d’imbrication).- La construction d’
ExperimentalC2paEmbedderlève uneLogicExceptionsauf 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.
Conformité
Section intitulée « Conformité »| Comportement | Référence | Statut |
|---|---|---|
Déclaration de langue naturelle (/Lang) | ISO 14289-2:2024 §8.4.4 | Vérifié / signalé |
| Modèle sémantique de facture de base | EN 16931-1:2026 | Vérifié (l’émetteur reste responsable) |
| Fichiers associés / flux de fichiers intégrés | ISO 32000-2:2020 §14.13.2 | Émis (/AF, /EF, /Params) |
| Règles de relation de pièce jointe et de conteneur | Factur-X 1.08 §3.1, §6.2 | Émis / vérifié (défaut /AFRelationship /Alternative) |
| Magasin de manifestes C2PA / JUMBF | C2PA 2.1 §11.1 | Inté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.
Notes de développement
Section intitulée « Notes de développement »- 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
JumbfBoxParsersont des constantes publiques ; dimensionne les entrées que tu acceptes en fonction d’elles plutôt que de redériver des limites.
Périmètre de publication
Section intitulée « Périmètre de publication »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.