Factur-X is a Franco-German e-invoicing standard which complies with the European e-invoicing standard EN 16931 <https://ec.europa.eu/digital-building-blocks/wikis/display/DIGITAL/Obtaining+a+copy+of+the+European+standard+on+eInvoicing>
. The Factur-X specifications are available on the FNFE-MPE website <http://fnfe-mpe.org/factur-x/>
in English and French. The Factur-X standard is also called ZUGFeRD 2.2 in Germany <https://www.ferd-net.de/standards/zugferd-2.2/zugferd-2.2.html>
_.
Order-X is the equivalent of Factur-X for purchase orders. The Order-X specifications are available in English on the FNFE-MPE website <https://fnfe-mpe.org/factur-x/order-x/>
and on the FeRD website <https://www.ferd-net.de/standards/order-x/index.html>
.
The main feature of this Python library is to generate Factur-X invoices and Order-X orders from a regular PDF document and a Factur-X or Order-X compliant XML file.
This lib provides additionnal features such as:
XML Schema Definition <https://en.wikipedia.org/wiki/XML_Schema_(W3C)>
_.Some of the features provided by this lib also work for ZUGFeRD 1.0 (the ancestor of the Factur-X standard).
To install it on Linux, run:
.. code::
sudo pip3 install --upgrade factur-x
.. code::
from facturx import generate_from_file
generate_from_file(regular_pdf_file, xml_file)
The PDF file regular_pdf_file will be updated to Factur-X/Order-X. If you want to write the resulting Factur-X/Order-X PDF to another file, use the argument output_pdf_file.
To have more examples, look at the docstrings in the source code or look at the source code of the command line tools located in the bin subdirectory.
Several command line tools are provided with this lib:
All these commande line tools have a --help option that explains how to use them and shows all the available options.
Download the last version of Python for Windows from python.org/downloads <https://www.python.org/downloads/>
_.
Launch the installer. On the first screen of the installer, enable the option Add python.exe to PATH. At the end of the installation process, the installer displays a screen with the message Setup was successful ; at that step, it may propose you Disable path length limit with a help message that says Changes your machine configuration to allow programs, including Python, to bypass the 260 character "MAX_PATH" limitation. You must accept this proposal (otherwise the installation of the factur-x library will fail): click on the label Disable path length limit and follow the instructions.
Open a Windows command prompt as Administrator and enter the following command to download and install the factur-x library:
.. code::
pip3 install --upgrade factur-x
Look at the installation logs and make sure there are no error messages. Close the Windows command prompt.
Open a new Windows command prompt (not as Administrator) and enter the following command (adapt the path to your filesystem):
.. code::
python C:\Users\Alexis\AppData\Local\Programs\Python\Python311\Scripts\facturx-pdfgen --help
It should display the help of the command facturx-pdfgen.
Enter the following command to generate a Factur-X invoice:
.. code::
python C:\Users\Alexis\AppData\Local\Programs\Python\Python311\Scripts\facturx-pdfgen C:\Users\Alexis\Documents\invoice.pdf C:\Users\Alexis\Documents\fx.xml C:\Users\Alexis\Documents\invoice-facturx.pdf
where:
This project also provides a webservice to generate a Factur-X or Order-X PDF file from a regular PDF file, the XML file and additional attachments (if any). This webservice uses Flask <https://www.palletsprojects.com/p/flask/>
_. To run the webservice, run facturx-webservice available in the bin subdirectory of the project. To query the webservice, you must send an HTTP POST request in multipart/form-data using the following keys:
To deploy this webservice in production, follow the guidelines <https://flask.palletsprojects.com/en/2.3.x/deploying/>
of the official Flask documentation: you should use a WSGI server (such as Gunicorn <https://gunicorn.org/>
) and a reverse proxy (such as Nginx <https://www.nginx.com/>
or Apache <https://httpd.apache.org/>
). You will certainly have to increase the default maximum upload size (default value is only 1MB under Nginx!): use the parameter client_max_body_size for Nginx and LimitRequestBody for Apache.
I recommend this tutorial <https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-20-04-fr>
_ (in French) which explains how to deploy a Flask application with Gunicorn and Nginx on Ubuntu.
You can use curl <https://curl.haxx.se/>
_, a command line tool to send HTTP requests (on Linux Ubuntu/Debian, just install the curl package) to generate the request:
.. code::
curl -X POST -F 'pdf=@/home/me/regular_invoice.pdf' -F 'xml=@/home/me/factur-x.xml' -F 'attachment1=@/home/me/delivery_note.pdf' -o /home/me/facturx_invoice.pdf https://ws.fnfe-mpe.org/generate_facturx
A public instance of this webservice is available on a server of FNFE-MPE <http://fnfe-mpe.org/>
_ at the URL https://ws.fnfe-mpe.org/generate_facturx.
This library is published under the BSD licence (same licence as pypdf <https://github.com/py-pdf/pypdf/>
_ on which this lib depends).
Version 3.1 dated 2023-08-13
Version 3.0 dated 2023-08-13
article <https://martinthoma.medium.com/pypdf-the-2022-review-8925dea750d9>
_.Version 2.5 dated 2023-03-24
Version 2.4 dated 2023-03-13
Version 2.3 dated 2021-04-12
Version 2.2 dated 2021-04-08
Version 2.1 dated 2021-04-07
Version 2.0 dated 2021-04-04
Add support for Order-X. This implies several changes:
method check_facturx_xsd() deprecated in favor of the new method xml_check_xsd() but still operates with a warning
method get_facturx_flavor() deprecated in favor of the new method get_flavor() but still operates with a warning
method generate_facturx_from_binary() deprecated in favor of the new method generate_from_binary() but still operates with a warning
method generate_facturx_from_file() deprecated in favor of the new method generate_from_file() but still operates with a warning
new optional argument orderx_type for methods generate_from_file() and generate_from_binary() with default value autodetect
new method get_orderx_type() to get the Order-X type (order, order change or order response)
new method get_xml_from_pdf() that work both on Factur-X and Order-X (the method get_facturx_xml_from_pdf() still exists and only operates on Factur-X)
scripts updated
Add lang argument to methods generate_from_file() and generate_from_binary() to set the lang of the PDF. This is one of the requirements for PDF accessibility, which is important for people with disabilities: it allows PDF speech synthesizers for blind people to choose the right language.
Add ability to choose the AFRelationship PDF property for the Factur-X/Order-X XML file and also for the additionnal attachments:
new argument afrelationship for methods generate_from_file() and generate_from_binary()
new key afrelationship for the attachments dict as argument of generate_from_file() and generate_from_binary()
Argument additional_attachments was deprecated in method generate_facturx_from_file() in version 1.8: it doesn't operate any more and only displays a warning.
Replace the optparse lib by the argparse lib in scripts.
Version 1.12 dated 2020-07-16
Version 1.11 dated 2020-05-11
Version 1.10 dated 2020-04-14
Version 1.9 dated 2020-02-11
Version 1.8 dated 2020-01-16
New tool facturx-webservice which implements a REST webservice using Flask to generate a Factur-X PDF invoice via a simple POST request.
New argument 'attachments' for generate_facturx_from_file() which replaces argument additional_attachments:
Possibility to set a filename for the attachment different from filename of the filepath
Possibility to set creation dates for attachments
Update script facturx-pdfgen to use the new attachments argument
Version 1.7 dated 2020-01-13
Version 1.6 dated 2020-01-09
Version 1.5 dated 2019-11-13
Version 1.4 dated 2019-07-24
Version 1.3 dated 2019-06-12
Version 1.2 dated 2019-06-12
Version 1.1 dated 2019-04-22
Version 1.0 dated 2019-01-26
Version 0.9 dated 2019-01-25
Version 0.8 dated 2018-06-10
Version 0.7 dated 2018-05-24
Version 0.6 dated 2018-05-01
Version 0.5 dated 2018-03-29
Version 0.4 dated 2018-03-27