Add main file

This commit is contained in:
Beat Jäckle 2021-02-26 15:50:02 +01:00
parent 4314dca67d
commit fc3a3fecf3
3 changed files with 131 additions and 1 deletions

14
CH-Kreuz_7mm.svg Executable file
View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 20.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg width="7mm" height="7mm" version="1.1" id="Ebene_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 19.8 19.8" style="enable-background:new 0 0 19.8 19.8;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill:none;stroke:#FFFFFF;stroke-width:1.4357;stroke-miterlimit:10;}
</style>
<polygon points="18.3,0.7 1.6,0.7 0.7,0.7 0.7,1.6 0.7,18.3 0.7,19.1 1.6,19.1 18.3,19.1 19.1,19.1 19.1,18.3 19.1,1.6 19.1,0.7 "/>
<rect x="8.3" y="4" class="st0" width="3.3" height="11"/>
<rect x="4.4" y="7.9" class="st0" width="11" height="3.3"/>
<polygon class="st1" points="0.7,1.6 0.7,18.3 0.7,19.1 1.6,19.1 18.3,19.1 19.1,19.1 19.1,18.3 19.1,1.6 19.1,0.7 18.3,0.7
1.6,0.7 0.7,0.7 "/>
</svg>

After

Width:  |  Height:  |  Size: 903 B

View file

@ -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).
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

91
qrr.py Executable file
View file

@ -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))