106 lines
2.8 KiB
Python
Executable file
106 lines
2.8 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
import os.path
|
|
from qrcode import make as qrcode_make
|
|
import qrcode.image.svg
|
|
from svgutils import transform as st
|
|
from ch_kreuz import swisscross as get_swisscross
|
|
from ch_kreuz import white as get_white
|
|
from svgutils.compose import Figure
|
|
from chardet import detect
|
|
|
|
|
|
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
|
|
self.data = data.encode('latin-1')
|
|
|
|
def set_data_from_textfile(self, textfile):
|
|
with open(textfile, 'rb') as rawdata:
|
|
charenc = detect(rawdata.read())['encoding']
|
|
with open(textfile, 'r', encoding=charenc) as f:
|
|
self.set_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)
|
|
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)
|
|
try:
|
|
assert qrcode.width[-2:] == 'mm'
|
|
qr_scale = 49.5/float(qrcode.width[:-2])
|
|
except AssertionError as e:
|
|
print(f"ERROR: Ein unerwarteter Fall in der Skallierung.")
|
|
print(e)
|
|
return 1
|
|
|
|
qrr = Figure(
|
|
'49.5mm', '49.5mm',
|
|
get_white().getroot(),
|
|
qrcode.getroot().scale(qr_scale),
|
|
get_swisscross().getroot()
|
|
)
|
|
qrr.save(filepath)
|
|
|
|
|
|
def help(args):
|
|
return '\n'.join([
|
|
'{0}: Ungültige Eingabe',
|
|
'Aufruf: {0} TEXTDATEI [SVG-ZIELDATEI]',
|
|
]).format(args[0])
|
|
|
|
|
|
def main(args):
|
|
try:
|
|
textfile = args[1]
|
|
except IndexError:
|
|
print(help(args))
|
|
return 1
|
|
try:
|
|
output_format = 'svg'
|
|
svgfile = args[2]
|
|
if svgfile[-4:] == '.svg':
|
|
pass
|
|
else:
|
|
svgfile += '.svg'
|
|
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
|
|
if output_format == 'svg':
|
|
return 0
|
|
else:
|
|
print(f"ERROR: Unbekanntes Output_format: {output_format}")
|
|
return 1
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
sys.exit(main(sys.argv))
|