Generate e-invoices (E-Rechnung in German) conforming to EN16931 (Factur-X/ZUGFeRD, UBL, CII, XRechnung aka X-Rechnung) from LibreOffice Calc/Excel data or JSON.
npm install @e-invoice-eu/core
src="https://raw.githubusercontent.com/gflohr/e-invoice-eu/main/assets/e-invoice-eu-logo-2.webp"
width="256" height="256" />







Free and open source tool chain for generating EN16931 conforming e-invoices
(Factur-X/ZUGFeRD, UBL, CII, XRechnung) from popular spreadsheet formats or
JSON.
This package contains the core library of @e-invoice-eu/core. Both the
E-Invoice-EU command line tool
and the E-Invoice-EU web service
use it as their foundation.
- Features
- Documentation
- Installation
- Usage
- Importing/Requiring the Library
- Creating Invoice Data from Spreadsheet Files
- Generating an Invoice from Data in the Internal Format
- Argument format
- Argument lang
- Argument embedPDF
- Argument pdf
- Argument data
- Argument attachments
- Getting Supported Formats
- Getting the JSON Schema Definitions
- Reporting Bugs
- Copyright
- Disclaimer
The library can create e-invoices in the following formats:
- Cross Industry Invoice - CII
- Universal Business Language - UBL
- Factur-X/ZUGFeRD (all profiles including XRECHNUNG) with full PDF/A support
E-Invoices can be created directly from data in the E-Invoice-EU internal
format
or via a mapping definition
from popular spreadsheet formats like .ods, .xlsx, .csv, ...
The library is implemented in TypeScript and provides complete type definitions
out of the box. No additional @types package is required. All data structures,
including those for the internal invoice format and mapping definitions, are
fully typed, ensuring comprehensive IntelliSense support.
The library is available as an ES module, CommonJS, and UMD, making it
compatible with both browser environments and JavaScript runtimes like Node.js.
The general documentation of e-invoice-eu is available at thee-invoice-eu GitHub page.
For reference, you can also consult the
API documentation.
``sh`
npm install @e-invoice-eu/core
If you have the import keyword:
`typescript`
import { InvoiceService, MappingService } from '@e-invoice-eu/core';
With require:
`javascript`
const { InvoiceService, MappingService } = require('@e-invoice-eu/core');
In the browser:
`html`
For this optional step, you need both the spreadsheet file as a Buffer and aMapping
mapping definition as a
object:
`typescript
import { MappingService } from '@e-invoice-eu/core';
const mappingService = new MappingService(console);
const invoice = mappingService.transform(
spreadsheet, // a BufferMapping
'Factur-X-Extended', // see https://gflohr.github.io/e-invoice-eu/en/docs/basics/supported-formats/
mapping, // a `
);
The returned invoice object is anInvoice
instance in the internal format. It is not yet an XML string or PDF buffer!
You can either provide the invoice data yourself as an
Invoice
instance or you can create it from spreadsheet data and a mapping definition
as shown in the previous section.
`typescript
import { InvoiceService } from '@e-invoice-eu/core';
const invoiceService = new InvoiceService(console);
const renderedInvoice = await invoiceService.generate(invoiceData, options);
`
See this summary for the options (optional options are marked with an?
question mark ):
| Name | Type | Description |
| ------------ | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| format | string | a supported format |string
| lang | | a language identifier like fr-fr |boolean
| embedPDF? | | pass true if a PDF version should be embedded into XML output |FileInfo
| pdf? | | the PDF version of the invoice |FileInfo
| data? | | invoice spreadsheet file |FileInfo[]
| attachments? | [](https://gflohr.github.io/e-invoice-eu/api-docs/types/FileInfo.html) | an arbitrary number of attachments |
#### Argument format
This contains the format of the e-invoice as a case-insensitive string. You
can also use aliases. For example, Factur-X-Comfort is an alias forFactur-X-EN16931.
#### Argument lang
A language identifier like fr-fr. This is only used for the Factur-X/ZUGFeRD
formats for some canned texts in the PDF XMP meta data.
#### Argument embedPDF
This is only used for the pure XML formats (everything that is not
Factur-X/ZUGFeRD). If it has a truthy value, a PDF version of the invoice
is embedded as a base64 encoded string in the XML.
#### Argument pdf
This is required in two cases:
1. The format is a Factur-X/ZUGFeRD format and data was not specified.embedPDF
2. The format is a pure XML format, was specified and data was not specified.
#### Argument data
A spreadsheet version of the invoice. If a PDF is required, either because
embedPDF was specified for pure XML or because the format is Factur-X/ZUGFeRD,
LibreOffice is invoked for rendering the spreadsheet
as a PDF.
This feature will trigger an exception if used in the browser.
#### Argument attachments
You can specify an arbitrary number of additional attachments.
In case of the pure XML formats, they are embedded as base64 encoded strings
in the XML. In case of Factur-X/ZUGFeRD they are attached to the PDF,
additionally to the mandatory attachment factur-x.xml.
`typescript
import { FormatFactoryService } from '@e-invoice-eu/core';
const factoryService = new FormatFactoryService();
const formats = factoryService.listFormatServices();
`
In format you will find an array ofFormatInfo
objects.
`typescript`
import { invoiceSchema, mappingSchema } from '@e-invoice-eu/core';
These variables contain the schema for the
Invoice
and Mapping
interfaces. These schemas can be passed as an argument to the compile method of an Ajv instance, see https://ajv.js.org/api.html#ajv-compile-schema-object-data-any-boolean-promise-any for more information!
The schemas have the type
JSONSchemaType
and
JSONSchemaType
respectively.
Please report bugs at https://github.com/gflohr/e-invoice-eu/issues.
Copyright (C) 2024-2025 Guido Flohr
rights reserved.
This is free software available under the terms of the
WTFPL.
This free software has been written with the greatest possible care, but like
all software it may contain errors. Use at your own risk! There is no
warranty and no liability.