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 368 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


18 Kommentare

  1. Bettinasays:

    Hat schon mal jemand von euch Fachleuten gedacht eine App zu Programieren wo man sich eine Gage auszahlen lassen kann, oder z. Bsp. einen verkauf am Marktstand. Ich wurd dies sofort kaufen. Als Musiker könnte ich so am Handy eine Rechnung stellen sie zum Schuldner rüberschicken und sie gleich bezahlen lassen. Eben auch für Marktstände wie Flohmarkt nützlich. Quasi zahlung auf Rechnung. Würde sich sicher lohnen so eine App zu schreiben. Wenn ich programmieren könnte würde ich es selbst tun.

  2. René Mermodsays:

    Gerne würde ich eine fertige, funktionierende Lösung des Swiss-QR-Code Generators in unserer Segel-Club-Software, die in Access geschrieben ist, einsetzen. Wir fakturieren etwa 440 Rechnungen / Jahr mit unserer Access-Lösung.

    • Jean aus Baselsays:

      Laut Informationen die mir vorliegen, wird sich die Einführung des QR-Codes weiter verzögern. Es ist wohl nicht vor Mitte 2020 damit zu rechnen … Einerseits da sich die Einführung von ISO20022 verzögert hat (offiziell wäre ab 1.7.18 nur noch dieses Format im elektronischen Zahlungsverkehr gültig …) und andererseits weil es eine weitere Vernehmlassung gibt. Es kann sich also noch das eine und andere ändern. Neuester Gag: man will nun noch eine Perforation des Zahlteils… also der Vorteil von handelsüblichem A4 Papier ist vermutlich wieder weg. Wenn der Widerstand nicht doch noch zu gross wird.

    • Hallo René,

      entschuldige, dass ich noch nicht auf deine Mail geantwortet habe. (Da ich im Urlaub war.) Eine VBA-Lösung habe ich immer noch nicht umgesetzt. (Siehe auch meinen langen Kommentar, etwas weiter unten…)

      Gruß,
      Raffael

  3. Hallo
    ich möcht das in Ms Access VBA integrieren.
    hat das schon jemand in VBA umgeschrieben?
    Herzlichen Dank

    • Jean aus Baselsays:

      Hallo Andreas
      diese Frage habe ich vor 7 Monaten auch schon gestellt – siehe unten.
      Bisher aber noch keine Antwort erhalten …

      • Hallo Andreas, hallo Jean,

        da noch keiner geantwortet hat, hat es vermutlich noch niemand implementiert. Ich für meinen Teil kann folgendes sagen. Technisch ist es definitiv möglich, den QRCoder für VBA anzupassen. Wie in meinem Artikel beschrieben, muss ein COM-Interface geschrieben werden, da (wie im obigen C# Code-Beispiel zu sehen ist) der QRCoder sowie der Payload-Generator teilweise Objekte im Konstruktor erwarten. Meines Wissens nach können in VBA jedoch keine Objekte, sondern nur Basistypen (String, int, …) im Konstruktur übergeben werden. Deshalb muss das COM-Interface quasi einen Abstraktionslayer zwischen QRCoder und VBA bilden.

        Für den QRCoder habe ich dieses Interface für eine ältere Version einmal geschrieben und den QRCoder anschließend erfolgreich in Excel per VBA verwendet. Für die aktuelle Version mit SwissQR-Payloadgenerator wird das jedoch etwas aufwändiger, da die SwissQR-Code-Klasse diverse Objekte/Überladungen besitzt. Sollte aber auch machbar sein.

        Was mir damals am meisten zu schaffen gemacht hat, war die fertige, mit COM-Interface versehene DLL im System so zu registrieren, dass diese in Excel/Access/Word im VBA-Editor auch gefunden wurde. Theoretisch lässt sich eine .NET COM-Interop DLL mit 1-2 Kommandobefehlen registrieren. Praktisch funktionierte es manchmal gar nicht, dann erst beim zweiten Mal und am Ende hatte ich die DLL doppelt im VBA-Referenzen Dialog, obwohl sie nur einmal auf dem System existierte.

        Um wieder zurück zum Thema zu kommen. Ja, es ist definitiv möglich – aber es kostet doch einiges an Zeit (und Frusttoleranz). Mir persönlich fehlt momentan diese Freizeit, das Projekt umzusetzen.

        • Hallo zusammen
          ich werde mir mal Zeit nehmen und testen. Bin aber nicht so ein Spezialist.
          Melde mich wieder wenn ich was geschaft habe :-)

          Danke

          • Hallo zusammen,
            auch hier besteht ein Bedürfnis nach einer VBA-Lösung… ich bin allerdings eher Anwender mit VBA-Kenntnissen und möchte gerne in einem Excel-Tabellenblatt, das heute bereits ‚simple‘ ESR-Einzahlungsscheine erstellt, dies erweitern zur QR-Rechnung. Das Bedürfnis wirft allerdings keine Rendite ab, daher sollten sich allfällige Kosten im Hobby-Bereich einstellen…

  4. Roger B.says:

    Danke für deinen super gemachten Blogeintrag.
    Ich besitze Visual Studio 2017 und wollte das Beispiel nachprogrammieren.
    Mit dem NuGet-Paket-Manager habe ich den QRCoder eingebunden, welcher auch in den Verweisen eingetragen ist.
    Nun habe ich ein Formular erstellt und in einer Schlatfläche den Beispielcode eingefügt. Im Code ist wird aber der Text mit ‘QRCodeGenerator’ rot unterstrichen.
    Was mache ich falsch?

  5. Hat schon jemand das Teil mit VBA in MSAccess integriert?

  6. Pascalsays:

    Hello, i have installed the package and the first part compile correctly, but when i get to the line:
    SwissQrCode.Contact contactGeneral(…)
    I get an error.

    The payload must be installed in some way before it works?
    Thank you for your help.

  7. 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!

    • Namesays:

      Qr durch Passwörter ersetzen!? Ohje. Wozu dann getrennte Zugänge und Kennwörter!?

      • Jean aus Baselsays:

        Nicht QR durch Passwörter ersetzen – umgekehrt: Passwort durch QR: dem User wird ein QR auf die Stirn tätowiert, der QR-Reader scannt dann und man ist angemeldet … ;-)

Hinterlasse einen Kommentar

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