Skip to main content

A library to generate Swiss QR-bill payment slips

Project description

Python library to generate Swiss QR-bills

From 2020, Swiss payment slips will progressively be converted to the QR-bill format. Specifications can be found on

This library is aimed to produce properly-formatted QR-bills as SVG files either from command line input or by using the QRBill class.


You can easily install this library with:

$ pip install qrbill

Command line usage example


$ qrbill --account "CH5800791123000889012" --creditor-name "John Doe"
  --creditor-postalcode 2501 --creditor-city "Biel"

More complete:

$ qrbill --account "CH44 3199 9123 0008 8901 2" --reference-number "210000000003139471430009017"
--creditor-name "Robert Schneider AG" --creditor-street "Rue du Lac 1268"
--creditor-postalcode "2501" --creditor-city "Biel"
--additional-information "Bill No. 3139 for garden work and disposal of cuttings."
--debtor-name "Pia Rutschmann" --debtor-street "Marktgasse 28" --debtor-postalcode "9400"
--debtor-city "Rorschach" --language "de"

For usage:

$ qrbill -h

If no –output SVG file path is specified, the SVG file will be named after the account and the current date/time and written in the current directory.

Note that if you don’t like the automatic line wrapping in the human-readable part of some address, you can replace a space by a newline sequence in the creditor or debtor name, line1, line2, or street to force a line break in the printed addresses. (e.g. –creditor-street “Rue des Quatorze Contours du Cheminndu Creux du Van”) The data encoded in the QR bill will not have the newline character. It will be replaced by a regular space.

Python usage example

>>> from qrbill import QRBill
>>> my_bill = QRBill(
            'name': 'Jane', 'pcode': '1000', 'city': 'Lausanne', 'country': 'CH',
>>> my_bill.as_svg('/tmp/my_bill.svg')

Outputting as PDF or bitmap

If you want to produce a PDF version of the resulting bill, we suggest using the svglib <> library. It can be used on the command line with the svg2pdf script, or directly from Python:

>>> import tempfile
>>> from qrbill import QRBill
>>> from svglib.svglib import svg2rlg
>>> from import renderPDF

>>> my_bill = QRBill(
            'name': 'Jane', 'pcode': '1000', 'city': 'Lausanne', 'country': 'CH',
>>> with tempfile.TemporaryFile(encoding='utf-8', mode='r+') as temp:
>>>     my_bill.as_svg(temp)
>>>     drawing = svg2rlg(temp)
>>> renderPDF.drawToFile(drawing, "file.pdf")

or to produce a bitmap image output:

>>> from import renderPM
>>> dpi = 300
>>> drawing.scale(dpi/72, dpi/72)
>>> renderPM.drawToFile(drawing, "file.png", fmt='PNG', dpi=dpi)

Running tests

You can run tests either by executing:

$ python tests/


$ python test



1.1.0 (2023-12-16)

  • Add Arial font name in addition to Helvetica for better font fallback on some systems.

  • Drop support for Python < 3.8, and add testing for Python 3.11 and 3.12.

1.0.0 (2022-09-21)

  • BREAKING: Removed the due-date command line argument and the due_date QRBill init kwarg, as this field is no longer in the most recent specs (#84).

  • Handle line breaks in additional information, so it is showing in the printed version, but stripped from the QR data (#86).

  • Improved performance by deactivating debug mode in svgwrite (#82).

0.8.1 (2022-05-10)

  • Fixed a regression where the currency was not visible in the payment part (#81).

0.8.0 (2022-04-13)

  • Replaced ## with // as separator in additional informations (#75).

  • Print scissors symbol on horizontal separation line when not in full page. WARNING: the resulting bill is 1 millimiter higher to be able to show the entire symbol (#65).

  • Renamed --extra-infos command line parameter to --additional-information and renamed extra_infos and ref_number QRBill.__init__ arguments to additional_information and reference_number, respectively. The old arguments are still accepted but raise a deprecation warning (#68).

0.7.1 (2022-03-07)

  • Fixed bad position of amount rect on receipt part (#74).

  • Increased title font size and section spacing on payment part.

0.7.0 (2021-12-18)

  • License changed from GPL to MIT (#72).

  • Prevented separation line filled on some browsers.

  • Scissors symbol is now an SVG path (#46).

0.6.1 (2021-05-01)

  • Added --version command-line option.

  • QR-code size is now more in line with the specs, including the embedded Swiss cross (#58, #59).

  • Widen space at the right of the QR-code (#57).

  • A new --font-factor command-line option allows to scale the font if the actual size does not fit your needs (#55).

0.6.0 (2021-02-11)

  • Added the possibility to include newline sequences in name, street, line1, or line2 part of addresses to improve printed line wrapping of long lines.

  • Moved QR-code and amount section to better comply with the style guide (#52).

  • Dropped support for EOL Python 3.5 and confirmed support for Python 3.9.

0.5.3 (2021-01-25)

  • Enforced black as swiss cross background color.

  • Allowed output with extension other than .svg (warning instead of error).

  • Split long address lines to fit in available space (#48).

0.5.2 (2020-11-17)

  • Final creditor is only for future use, it was removed from command line parameters.

  • Capitalized Helvetica font name in code (#43).

  • The top line was printed a bit lower to be more visible (#42).

0.5.1 (2020-08-19)

  • Fix for missing country field in QR code when using CombinedAddress (#31).

  • Added support for printing bill to full A4 format, using the full_page parameter of QRBill.as_svg() or the CLI argument --full-page.

  • The vertical separation line between receipt and main part can be omitted through the --no-payment-line CLI argument.

  • A new --text command line parameter allows for a raw text output.

  • Support for Alternate procedures lines was added (--alt-procs argument, #40).

0.5 (2020-06-24)

  • QRBill.as_svg() accepts now file-like objects.

  • Added support for combined address format.

  • A top separation line is now printed by default. It can be deactivated through the top_line boolean parameter of QRBill.__init__().

  • The error correction level of the QR code conforms now to the spec (M).

0.4 (2020-02-24)

Changes were not logged until version 0.4. Development stage was still alpha.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qrbill-1.1.0.tar.gz (23.0 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page