Documentation et premiers pas
Comment intégrer Validator, Creator et Reader dans votre propre application .NET – du package NuGet au premier appel fonctionnel, jusqu’aux valeurs de retour et à la gestion des erreurs.
- .NET Framework 4.8
- .NET 8
- .NET 10
- ZUGFeRD 2.5.2 / Factur-X 1.09.2
- XRechnung 3.0 (CII & UBL)
Démarrage rapide
Du PDF au verdict de conformité en trois étapes. L’exemple ci-dessous reprend le déroulement réel utilisé par la démo en ligne.
- Ajouter le package
Facturexa.ZugferdValidatorvia NuGet. Les référentiels officiels (schéma XML et Schematron) sont fournis et trouvés automatiquement. - Enregistrer la clé de licence une fois au démarrage de l’application. Vous la recevez par e-mail et la retrouvez à tout moment dans votre compte client.
- Pour chaque facture, valider le PDF (ou le XML) en un seul appel.
using Facturexa.ZugferdValidator;
// Une fois au démarrage : enregistrer la clé de licence.
ZugferdValidatorLicense.RegisterLicense("…");
// Valider la facture PDF : enveloppe PDF, schéma XML et Schematron officiel en un seul appel.
var result = ZugferdValidator.Validate("facture.pdf", "FA-2026-0001");
Console.WriteLine(result.IsValid ? "Valide" : "Non conforme");
Le déroulement complet avec gestion des erreurs figure dans la section Validator.
Installation et prérequis
Chaque bibliothèque est un package NuGet autonome et peut être intégrée séparément.
dotnet add package Facturexa.ZugferdValidator
Install-Package Facturexa.ZugferdValidator
dotnet add package Facturexa.ZugferdCreator
Install-Package Facturexa.ZugferdCreator
dotnet add package Facturexa.ZugferdReader
Install-Package Facturexa.ZugferdReader
Prérequis
- .NET 10, .NET 8 ou .NET Framework 4.8
- Windows, Linux ou macOS
- Validator : dossier
Official Schematron\à côté de l’application (copié automatiquement par le package) - Validator : pas de trimming (
PublishTrimmed) ni de Native AOT
Essayer sans code
La démo en ligne montre le Validator directement dans le navigateur, sans aucune intégration dans votre code.
Déploiement des référentiels (Validator)
- Fonctionnement hors ligne : tous les référentiels (schéma XML, Schematron, listes de codes) sont inclus dans le package. Aucune connexion Internet n’est nécessaire à l’exécution et le Validator n’appelle aucun service externe – la vérification de licence est également locale. Aucune règle de pare-feu n’est requise.
- Le package copie automatiquement
Official Schematron\(les règles Schematron et, sousXSD\, le schéma XML) à côté de votre application lors de la compilation et de la publication – y compris pour ASP.NET classique (sousbin\), le fichier unique (single-file), ClickOnce et lorsque vous intégrez le Validator via votre propre bibliothèque ou votre propre package NuGet. - Après une rétrogradation du package, nettoyer ou régénérer une fois la solution afin que les fichiers de référentiel plus anciens remplacent les plus récents dans le dossier de sortie.
- Fournir le dossier vous-même : définir
<FacturexaContentAutoCopy>false</FacturexaContentAutoCopy>dans le projet, avec PackageReference ajouterExcludeAssets="contentFiles"à la référence du package, et définirSchematronChecker.SchematronDirectorysur ce dossier.
Profils et versions
Factur-X/ZUGFeRD définit plusieurs profils avec des niveaux de détail différents. Le tableau ci-dessous indique ceux que le Validator contrôle et que le Creator génère.
| Profil | Description | Validator | Creator |
|---|---|---|---|
| MINIMUM | Données d’en-tête, pas un format de facture électronique valable à lui seul | ✔ Oui | ✔ Oui |
| BASIC WL | Données d’en-tête sans lignes de facture | ✔ Oui | ✔ Oui |
| BASIC | Informations essentielles, lignes de facture comprises | ✔ Oui | ✔ Oui |
| EN 16931 / COMFORT | Norme européenne de base – format de facture électronique valable | ✔ Oui | ✔ Oui |
| EXTENDED | Jeu de données étendu ; à partir de Factur-X 1.09.2 / ZUGFeRD 2.5.2 avec sous-lignes, kits et lots | ✔ Oui | ✔ Oui |
| XRechnung 3.0 (CIUS) | Variante allemande B2G (secteur public), en deux étapes EN 16931 + CIUS | ✔ Oui (CII + UBL) | ✔ Oui (CII) |
| Génération UBL | Produire la XRechnung en UBL plutôt qu’en CII | n/a (la validation est déjà assurée) | Prévu |
Version
Le Creator écrit toujours selon la spécification en vigueur : Factur-X 1.09.2 / ZUGFeRD 2.5.2
(applicable à partir du 1er septembre 2026), y compris les sous-lignes EXTENDED pour
les kits et les lots. Vous ne choisissez pas de version dans Save(…) – les
nouvelles spécifications arrivent avec une nouvelle version du package.
La spécification implémentée par la DLL intégrée peut être interrogée à l’exécution :
ZugferdCreatorInfo.SupportedSpecification.
Validator : valider un PDF
Enregistrez la clé de licence une fois au démarrage de l’application. Le Validator trouve
automatiquement les référentiels officiels à côté de la DLL (sous bin\ pour ASP.NET
classique) ; ensuite, un appel par validation suffit. Passez le PDF complet : le Validator extrait
lui-même le XML embarqué, contrôle l’enveloppe PDF (PDF/A-3, métadonnées Factur-X), puis valide le XML
selon le schéma XML et le Schematron officiel. Un fichier XML seul fonctionne de la même façon – la
détection se fait sur le contenu, pas sur l’extension. IsValid est vrai si aucune étape ne
signale d’erreur ; IsPdfValid et IsSchemaValid donnent les verdicts partiels.
using Facturexa.ZugferdValidator;
// Une fois au démarrage de l’application.
ZugferdValidatorLicense.RegisterLicense("…");
// PDF ou XML : enveloppe PDF, schéma XML et Schematron officiel en un seul appel.
var result = ZugferdValidator.Validate("facture.pdf", "FA-2026-0001");
Console.WriteLine(result.IsValid ? "Valide" : "Non conforme");
Console.WriteLine($"Enveloppe PDF : {result.IsPdfValid}"); // null pour un XML seul
Console.WriteLine($"Référentiel : {result.SchematronRuleSet}");
foreach (var error in result.Errors)
Console.WriteLine($"{error.Stage}: {error}"); // p. ex. "Schematron: BR-CO-15 (BT-112): ..."
Pour aller plus loin : page produit Validator · essayer la démo
Creator : créer une facture
Enregistrer la clé de licence une fois au démarrage, puis renseigner l’en-tête, les parties, les lignes et les totaux, choisir un profil et enregistrer. La sortie est actuellement en CII (UBL est prévu).
using Facturexa.ZugferdCreator;
// Une fois au démarrage de l’application.
ZugferdCreatorLicense.RegisterLicense("…");
var invoice = new EInvoice
{
InvoiceNumber = "FA-2026-0001",
InvoiceDate = DateTime.Today
};
invoice.SetSellerTradeParty("Exemple SAS", "75001", "Paris", "1 rue de l’Exemple", CountryID.FR);
invoice.AddSellerSpecifiedTaxRegistration("FR12345678901", TaxRegistrationSchemeID.VA);
invoice.SetBuyerTradeParty("Client SARL", "69002", "Lyon", "2 place du Client", CountryID.FR);
invoice.AddIncludedSupplyChainTradeLineItem(
name: "Prestation de conseil", netUnitPrice: 100.00m, unitCode: UnitCode.C62,
billedQuantity: 3m, lineTotalAmount: 300.00m, taxPercent: 20m);
invoice.AddApplicableTradeTax(300.00m, 20m, 60.00m, TaxTypeCode.VAT, TaxCategoryCode.S);
invoice.LineTotalAmount = 300.00m;
invoice.TaxBasisAmount = 300.00m;
invoice.TaxTotalAmount = 60.00m;
invoice.GrandTotalAmount = 360.00m;
invoice.DuePayableAmount = 360.00m;
using var xmlStream = new MemoryStream();
invoice.Save(xmlStream, InvoiceProfile.Comfort);
Pour aller plus loin : page produit Creator · essayer la démo
Reader : lire une facture
Le Reader lit une facture – XML seul (CII ou UBL) ou PDF avec XML embarqué ; le format est détecté automatiquement – et renvoie les champs sous forme d’objet. Il peut aussi en générer une vue PDF lisible.
using Facturexa.ZugferdReader;
// Lire un PDF ou un XML – le nom de fichier aide à détecter le format.
using var stream = File.OpenRead("facture.pdf");
var invoice = ZugferdReader.Read(stream, "facture.pdf");
Console.WriteLine(invoice.InvoiceNumber);
Console.WriteLine(invoice.InvoiceDate?.ToString("dd/MM/yyyy"));
Console.WriteLine(invoice.Seller?.Name);
Console.WriteLine($"{invoice.LineItems.Count} ligne(s), {invoice.GrandTotalAmount:N2} {invoice.CurrencyCode}");
// Facultatif : générer une vue PDF lisible de la facture.
byte[] viewPdf = ZugferdReader.CreatePdf(invoice);
File.WriteAllBytes("facture-vue.pdf", viewPdf);
Pour aller plus loin : page produit Reader · essayer la démo
Valeurs de retour
Les principaux champs des objets résultat en un coup d’œil.
ZugferdValidationResult – Validator.Validate(…)
| Membre | Type | Signification |
|---|---|---|
IsValid | bool | Vrai si aucune étape ne signale d’erreur (enveloppe PDF, schéma XML, Schematron officiel) et si le contrôle PDF n’a pas échoué. |
IsPdfValid | bool? | Verdict du contrôle PDF ; null si un XML a été validé au lieu d’un PDF. |
IsSchemaValid | bool | Vrai si le schéma XML (XSD) ne signale aucune erreur. |
PdfCheck | ZugferdPdfCheckResult | Résultat du contrôle PDF avec ses lignes d’état (voir ci-dessous) ; null pour un XML seul. |
PdfFindings / SchemaFindings / SchematronFindings | List<ValidationFinding> | Constats d’une étape de contrôle ; chaque constat indique son étape dans Stage. |
EmbeddedXml / EmbeddedXmlFileName | byte[] / string | Le XML validé et, pour un PDF, le nom de la pièce jointe, p. ex. « factur-x.xml » – par exemple pour le transmettre au Reader. |
Errors | List<ValidationFinding> | Constats bloquants (gravité Error). |
Warnings | List<ValidationFinding> | Avertissements ; n’empêchent pas l’envoi. |
Findings | List<ValidationFinding> | Tous les constats, non filtrés. |
SchematronRuleSet | string | Référentiel officiel appliqué, p. ex. « ZUGFeRD 2.5.2 / Factur-X 1.09.2, profile EXTENDED – release date 2026-08-04 (FACTUR-X_EXTENDED.xslt) ». Null si le profil n’est pas couvert ou si le Schematron n’a pas pu s’exécuter. |
ProfileInfo | InvoiceProfileInfo | Version/profil déclarés par le document lui-même (BT-24). |
GetErrorMessages() | List<string> | Erreurs sous forme de messages prêts à l’emploi, numéro de facture compris. |
ZugferdPdfCheckResult – ZugferdValidationResult.PdfCheck
| Membre | Type | Signification |
|---|---|---|
OverallValid | bool | Verdict global du contrôle PDF (identique à IsPdfValid). |
Format | string | Identification PDF/A issue des métadonnées XMP, p. ex. « PDFA_3_B », sinon « unknown ». |
FacturXVersion | string | Version Factur-X issue des métadonnées XMP, p. ex. « 1.0 ». |
XmlExtractable / EmbeddingCompliant / FileNameCompliant / XmpCompliant | ZugferdPdfCheckStatus | Lignes d’état : Yes, No ou Unknown. |
Findings | List<ValidationFinding> | Constats du contrôle PDF (PDF-CHECK-01 à -16, PDF-XML-MISSING). |
API précédente : ZugferdPdfReader.ReadZugferdXml(…) et ZugferdPdfValidator.Validate(…) continuent de fonctionner jusqu’à la version 8.0, mais sont marquées obsolètes depuis la 7.4.0. Passez plutôt le PDF directement à ZugferdValidator.Validate(…).
InvoiceViewModel – ZugferdReader.Read(…)
| Membre | Type | Signification |
|---|---|---|
InvoiceNumber | string | Numéro de facture (BT-1). |
InvoiceDate | DateTime? | Date de facture (BT-2). |
Seller / Buyer | InvoicePartyViewModel | Vendeur/acheteur avec .Name et adresse. |
LineItems | List<…> | Lignes de facture. |
GrandTotalAmount | decimal? | Montant total TTC (BT-112). |
CurrencyCode | string | Devise (BT-5), p. ex. « EUR ». |
ProfileUrn | string | URN du profil issue du CustomizationID. |
Gestion des erreurs et dépannage
Les pièges les plus fréquents lors de l’intégration et leur cause. Les messages des bibliothèques sont en anglais et cités tels quels.
| Symptôme | Cause et solution |
|---|---|
ZugferdValidatorLicenseException ou ZugferdCreatorLicenseException : « No license key found » |
La clé n’a pas été enregistrée. Appeler ZugferdValidatorLicense.RegisterLicense("…") ou ZugferdCreatorLicense.RegisterLicense("…") une fois au démarrage, avant la première validation ou création. |
Constat XSD-ERROR : la validation selon le schéma XML n’a pas pu être effectuée |
Les fichiers XSD (Official Schematron\XSD\) n’ont pas été déployés ou le dossier ne se trouve pas à côté de la DLL. Déployer l’intégralité du dossier Official Schematron\ ou définir une fois SchematronChecker.SchematronDirectory sur son chemin. Un contrôle impossible à effectuer est volontairement signalé comme erreur. |
Constat PDF-XML-MISSING, message « The PDF file contains no attachments » |
Le PDF ne contient aucun XML embarqué – ce n’est pas une facture Factur-X/ZUGFeRD. Utiliser un vrai PDF Factur-X/ZUGFeRD ou valider directement le XML. |
IsValid == false alors que la facture semble valide ; l’erreur mentionne Saxon/Schematron |
La DLL Saxon ou les artefacts Schematron n’ont pas été déployés. Un contrôle impossible à effectuer est volontairement signalé comme erreur. Déployer les artefacts. |
Après publication avec PublishTrimmed : constat SCHEMATRON-ERROR, le message mentionne DotNetLocaleHelper |
Le moteur Saxon ne supporte ni le trimming ni Native AOT. Publier sans PublishTrimmed. |
ZugferdReaderException / UnsupportedFormatException |
Le fichier n’est ni un PDF avec XML embarqué ni un XML en syntaxe CII ou UBL. Utiliser un format pris en charge ; encapsuler l’appel à ZugferdReader.Read(…) dans un try/catch. |