From fc3a3fecf3b9141d3a89d66886d95fd184a4011d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20J=C3=A4ckle?= Date: Fri, 26 Feb 2021 15:50:02 +0100 Subject: [PATCH] Add main file --- CH-Kreuz_7mm.svg | 14 ++++++++ README.md | 27 +++++++++++++- qrr.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 1 deletion(-) create mode 100755 CH-Kreuz_7mm.svg create mode 100755 qrr.py diff --git a/CH-Kreuz_7mm.svg b/CH-Kreuz_7mm.svg new file mode 100755 index 0000000..f1296f3 --- /dev/null +++ b/CH-Kreuz_7mm.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/README.md b/README.md index 28da190..8301823 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,28 @@ # qrr-py -Erstelle ein vektorisierter QR code für die [QR Rechnung](https://www.einfach-zahlen.ch/de/home/issuer/qr-bill.html). \ No newline at end of file +Erstelle ein vektorisierter QR Code für die [QR Rechnung]( +https://www.einfach-zahlen.ch/de/home/issuer/qr-bill.html). + +Das Programm validiert die txt Datei nicht, sondern schriebt direkt eine +SVG Datei daraus. + + +## Installationsanleitung + +Zuerst müssen Sie Python3 für Ihr Betriebssystem installieren. + +Mit `pip3 install --user qrcode svgutils` können sie sich die +notwendigen Pakete herunterladen. + +## Ausführen des Programms + +Mit `python3 qrr.py Rechnung1.txt Rechnung1.svg` wird das Porgramm +gestartet. +Wenn das Programm keinen Output generiert, so gab es keine Fehler und +die SVG Datei sollte erstellt sein. + +# `CH-Kreuz_7mm.svg` Datei +Diese Datei ist von [SIX Group AG]( +https://www.paymentstandards.ch/de/home/software-partner.html) zur +Verfügung gestellt. Der direkte Download ist dieser: +https://www.paymentstandards.ch/dam/downloads/swiss-cross.zip diff --git a/qrr.py b/qrr.py new file mode 100755 index 0000000..1d7bef8 --- /dev/null +++ b/qrr.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 + +import os.path +import qrcode +import qrcode.image.svg +import svgutils.transform as st + + +class qr_rechnung(): + data = '' + error_correction = None + + def __init__(self, data=None, textfile=None): + if textfile is not None: + self.set_data_from_textfile(textfile) + + def set_data(self, data): + self.data = data + + def set_data_from_textfile(self, textfile): + with open(textfile, 'r') as f: + self.data = f.read() + + def write_file(self, filepath, force=False): + global qrcode + mode = 'w' if force else 'x' + try: + assert force or not os.path.isfile(filepath) + factory = qrcode.image.svg.SvgPathImage + img = qrcode.make( + self.data, + error_correction=qrcode.constants.ERROR_CORRECT_M, + image_factory=qrcode.image.svg.SvgPathImage + ) + img.save(filepath) + except AssertionError: + print(f"ERROR: Datei {filepath} existiert bereits.") + return 1 + + qrcode = st.fromfile(filepath) + offset = self.calc_move_offset(qrcode.get_size()[0]) + swisscross = st.fromfile("CH-Kreuz_7mm.svg").getroot() + swisscross.moveto( + x=offset['offset'], + y=offset['offset'], + scale_x=offset['scale'], + scale_y=offset['scale'] + ) + qrcode.append(swisscross) + qrcode.save(filepath) + + def calc_move_offset(self, size): + org = float(size[:-2]) + return { + 'offset': org*0.427935156, + 'scale': org/137.364857143 + } + + +def help(args): + return '{0}: Ungültige Eingabe\nAufruf: \ + {0} TEXTDATEI [SVG-ZIELDATEI]'.format(args[0]) + + +def main(args): + try: + textfile = args[1] + except IndexError: + print(help(args)) + return 1 + try: + svgfile = args[2] + except IndexError: + try: + assert textfile[-4:] == '.txt' + svgfile = textfile[:-4]+'.svg' + except AssertionError: + print(help(args)) + return 1 + try: + x = qr_rechnung(textfile=textfile) + x.write_file(svgfile, force=False) + except (PermissionError, FileNotFoundError) as e: + print(e) + return 1 + return 0 + + +if __name__ == '__main__': + import sys + sys.exit(main(sys.argv))