Swiss QR Code in C# und VBA erzeugen

Swiss QR Code in C-Sharp und VBAHeute begeben wir uns einmal etwas mehr ins geschäftliche Umfeld. Seit Ende April hat die SIX die Spezifikation für den neuen Swiss QR Code nach ISO 20022 herausgegeben. Der Swiss QR Code ist integraler Bestandteil des neuen Schweizer Einzahlungsschein, der sogenannten QR-Rechnung, die bis spätetens Mitte 2018 durch alle Unternehmen umgesetzt werden soll. Der Swiss QR Code wird im sogenannten “Zahlteil mit QR Code” der QR-Rechnung platziert.

Im folgenden soll es darum gehen, wie der Swiss QR Code mittels C# oder VBA erzeugt werden kann. Dazu nutzen wir die kostenfreie QRCoder-Bibliothek, welche ich vor knapp 4 Jahren entwickelt und kürzlich um den Swiss QR Code erweitert habe. Gezeigt wird nur die Implementierung des QR Codes, nicht aber die Erstellung einer kompletten QR-Rechnung bzw. eines vollständigen QR-Rechnung-Formulars.

Swiss QR Code in C# erzeugen

Um die QR Codes erzeugen zu können muss zuerst der Verweis auf den QRCoder hinzugefügt werden. Am einfachsten geht dies per NuGet-Paket-Manager. (Alternativ kann der Source-Code aber auch aus dem Github-Repository heruntergeladen und selbst kompiliert werden.)

Für die Installation per NuGet-Konsole ist folgender Befehl nötig:

Install-Package QRCoder

Alternativ kann das Paket auch über den grafischen Paketmanager in Visual Studio installiert werden. Folgende Schritte sind hierzu notwendig: Rechtsklick auf “Verweise” im Projektmappenexplorer –> NuGet-Pakete verwalten… –> “Durchsuchen”-Reiter –> Nach “QRCoder” suchen –> installieren

Ist der Verweis auf den QRCoder gesetzt, kann dessen Funktionalität mittels folgendem kurzen Code geprüft werden:

//QR-Code Generator erzeugen
QRCodeGenerator qrGenerator = new QRCodeGenerator();
//"Bespiel-Text" ins QR-Daten-Format bringen
QRCodeData qrCodeData = qrGenerator.CreateQrCode("Beispiel-Text", QRCodeGenerator.ECCLevel.M);
//Rohdaten-QR-Code erzeugen
QRCode qrCode = new QRCode(qrCodeData);
//QR-Code-Bild aus Rohdaten erzeugen
Bitmap qrCodeImage = qrCode.GetGraphic(20);

Das Bild in qrCodeImage kann nun testweise gespeichert oder zum Beispiel in einer PictureBox ausgegeben werden. Funktioniert die grundlegende Erzeugung, können wir uns den Swiss QR Code spezifischen Ausprägungen zuwenden. Hierzu ist es wichtig zu verstehen, dass ein Swiss QR Code technisch gesehen ein ganz normaler QR Code nach ISO/IEC 18004 ist. Die Besonderheiten finden lediglich innerhalb des Textes, der encodiert wird und bei der grafischen Ausgabe statt.

Um nun den korrekten Text zu erzeugen bietet der QRCoder den sogenannten Payload-Generator. Diese Klasse hilft beim erzeugen des passenden Textes für viele verschiedene QR-Code-Formate. So auch für den Swiss QR Code. Nachfolgend erstellen wir die Payload (=Text der im QR-Code encodiert wird) für einen Swiss QR Code, der die Summe 100,25 CHF an den Empfänger John Doe aus dem Parlamentsgebäude überweist. (Eine komplette Referenz des Swiss QR Code Payload Generators finden Sie hier.)

//Anlegen der Kontaktdaten
SwissQrCode.Contact contactGeneral = new SwissQrCode.Contact("John Doe", "3003", "Bern", "CH", "Parlamentsgebäude", "1");
//Anlegen der IBAN
SwissQrCode.Iban iban = new SwissQrCode.Iban("CH2609000000857666015", PayloadGenerator.SwissQrCode.Iban.IbanType.Iban);
//Anlegen der Referenz
SwissQrCode.Reference reference = new SwissQrCode.Reference(SwissQrCode.Reference.ReferenceType.QRR, "990005000000000320071012303", SwissQrCode.Reference.ReferenceTextType.QrReference);
//Festlegen der Währung und Summe
SwissQrCode.Currency currency = SwissQrCode.Currency.CHF;
decimal amount = 100.25m;

//Erstellung der Swiss QR Code Payload
SwissQrCode generator = new SwissQrCode(iban, currency, contactGeneral, reference, null, amount, null, null);
string payload = generator.ToString();

Nun haben wir den größten Teil der Swiss QR Code Erstellung bereits geschafft. Setzen wir die String-Variable “payload” in unser Eingangsbeispiel ein, erhalten wir einen fast vollständigen Swiss QR Code:

//[...] Payload Erzeugung

//QR-Code Generator erzeugen
QRCodeGenerator qrGenerator = new QRCodeGenerator();
//Swiss QR Code payload in QR code format bringen
QRCodeData qrCodeData = qrGenerator.CreateQrCode(payload, QRCodeGenerator.ECCLevel.M);
//Rohdaten-QR-Code erzeugen
QRCode qrCode = new QRCode(qrCodeData);
//QR-Code-Bild aus Rohdaten erzeugen
Bitmap qrCodeImage = qrCode.GetGraphic(20);

Nun fehlt nur noch ein letzter Schritt zum validen Swiss QR Code – die kleine Grafik mit dem Schweizer-Kreuz in der Mitte des QR Codes. Die Grafik selbst kann von der ISO 20022 Seiten bezogen werden:

https://www.paymentstandards.ch/dam/downloads/swiss-cross.zip

Eine Funktion um Grafiken auf QR-Codes zu setzen bringt der QRCoder bereits mit. Für unser Beispiel legen wir die Kreuz-Grafik namen “CH-Kreuz_7mm.png” in das Ausführungsverzeichnis unseres Programms. Um den QR-Code mit dem Kreuz zu versehen tauschen wir folgende Zeilen aus:

//Alt:
//Bitmap qrCodeImage = qrCode.GetGraphic(20);

//Neu:
Bitmap qrCodeImage = qrCode.GetGraphic(20, Color.Black, Color.White, (Bitmap)Bitmap.FromFile(Application.StartupPath + "\\CH-Kreuz_7mm.png"), 14, 1);

Der Parameter “14” gibt an, dass das Kreuz den QR-Code zu 14% bedecken soll. Laut Spezifikation muss das Kreuz 7mm im gedruckten Swiss QR Code groß sein. Da der QR-Code selbst 46mm (bzw. 49,2mm mit weißem Rand) groß sein soll, ergeben 7mm eine Abdeckung von 14%. Die weiteren Parameter können bei Interesse im Wiki des QRCoders nachgeschlagen werden.

Abschließend noch einmal das vollständige Code-Beispiel:

//Anlegen der Kontaktdaten
SwissQrCode.Contact contactGeneral = new SwissQrCode.Contact("John Doe", "3003", "Bern", "CH", "Parlamentsgebäude", "1");
//Anlegen der IBAN
SwissQrCode.Iban iban = new SwissQrCode.Iban("CH2609000000857666015", PayloadGenerator.SwissQrCode.Iban.IbanType.Iban);
//Anlegen der Referenz
SwissQrCode.Reference reference = new SwissQrCode.Reference(SwissQrCode.Reference.ReferenceType.QRR, "990005000000000320071012303", SwissQrCode.Reference.ReferenceTextType.QrReference);
//Festlegen der Währung und Summe
SwissQrCode.Currency currency = SwissQrCode.Currency.CHF;
decimal amount = 100.25m;

//Erstellung der Swiss QR Code Payload
SwissQrCode generator = new SwissQrCode(iban, currency, contactGeneral, reference, null, amount, null, null);
string payload = generator.ToString();

//QR-Code Generator erzeugen
QRCodeGenerator qrGenerator = new QRCodeGenerator();
//Swiss QR Code payload in QR code format bringen
QRCodeData qrCodeData = qrGenerator.CreateQrCode(payload, QRCodeGenerator.ECCLevel.M);
//Rohdaten-QR-Code erzeugen
QRCode qrCode = new QRCode(qrCodeData);
//Swiss-QR-Code-Bild aus Rohdaten erzeugen
Bitmap qrCodeImage = qrCode.GetGraphic(20, Color.Black, Color.White, (Bitmap)Bitmap.FromFile(Application.StartupPath + "\\CH-Kreuz_7mm.png"), 14, 1);

Für Fragen oder Probleme bezüglich des Beispiel stehe ich in den Kommentaren zur Verfügung.

Benötigen Sie Hilfe bei der Implementierung? Suchen Sie nach einer Individuallösung? Brauchen Sie runde, transparente oder besonders gestaltete QR-Codes? Dann kontaktieren Sie mich.

Ich habe bereits einige QR-Code-Individuallösungen für Kunden verschiedener Branchen umgesetzt. Warum also nicht auch für Sie?

Swiss QR Code in VBA erzeugen

Da der QRCoder in C#.NET geschrieben ist und keinerlei Abhängigkeiten zu weiteren Bibliotheken hat, ist die Verwendung aus VBA-Applikation heraus im Prinzip möglich. Hierzu sind jedoch ein paar Änderungen notwendig:

  • Quellcode von Github herunterladen/auschecken
  • Den Projekt-Typ auf COM “umbauen”
  • Die DLL in Visual Studio “COM-Visible” machen
  • Im QRCoder ein “COM-Interface” implementieren, da die Methoden durch ihre Methoden-Signaturen mit Vorbelegung nicht VBA-tauglich sind
  • Die DLL (idealerweise + TLB) per RegASM am System registrieren

Alles diese Schritte sind definitv machbar – der QRCoder ist bereits in einigen VBA-Projekten im Einsatz. Sollten Sie bei der Umwandlung/Implementierung in VBA Hilfe benötigen, können Sie mich gerne bezüglich einer Beauftragung kontaktieren. (Kleinere Fragen, Hilfestellungen gibt es in der Regel auch umsonst.)

 

Swiss QR Code in C# und VBA erzeugenÜber den Autor: Dieser Artikel, sowie 354 andere Artikel auf code-bude.net, wurden von Raffael geschrieben. – Seit 2011 blogge ich hier über Programmierung, meine Software, schreibe Tutorials und versuche mein Wissen, so gut es geht, mit meinen Lesern zu teilen. Zudem schreibe ich auf derwirtschaftsinformatiker.de über Themen meines Studiums.  //    •  • Facebook  • Twitter


1 Kommentare

  1. Das geht ja hier schon ziemlich in die Tiefe! Aber immer noch interessant zu sehen, für was so QR-Codes alles herhalten können. Wir wollen z.B. das Passwort mithilfe von QR Codes beseitigen.

    Grüße aus Gelsenkirchen,
    Markus

    P.S. schöner Blog!

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.