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

 

42 Kommentare

  1. Ulrich Zauggsays:

    Hallo Raffael, sicher kannst Du mir meine folgende Frage kurz beantworten.
    ich erhalte beim Validieren “meiner” QR-Codes mit dem ISO-Payments-Portal die Warnung, dass nicht leer sein darf, wenn es denn geliefert wird.
    Wo im QRCoder kann ich diese Einstellung steuern?
    Vielen herzlichen Dank für Deine Auskunft. Du darfst mir den Aufwand für diese Frage auch verrechnen (bitte aber vorher um kurzen Bescheid, danke!)

    Beste Grüsse
    Ulrich

    • Hallo Ulrich, bin zwar nicht Raffael aber man müsste schon noch genauer wissen, WAS nicht leer sein darf. Das Portal gibt da eigentlich ziemlich genau an, was falsch ist.
      (Habe mich seit 5 Jahren mit der QR-Rechnung beschäftigt und schon ein Dutzend Umstellungen mit Access und Excel gemacht, habe also Erfahrung damit)
      Kannst mir auch gerne schreiben: zv (at) s-e-m (punkt) ch

  2. Lukesays:

    kleines Problem, habe mir in VBA für Excel den QR Code zusammengebastelt, so weit so gut, nur wie bringe ich jetzt das verdammte CH-Kreuz in die Mitte des QR Codes?
    Kennt da jemand ein Lösung? Für VBA und Excel?

  3. Marcelsays:

    Ich habe die Version 1.3.6 getestet. Ich finde sie ausgezeichnet. Ich mag es, wenn etwas so kurz und einfach aufgerufen werden kann. Allerdings hat das Programm noch ein paar kleine Probleme mit den Umlauten. Während das Wort Zuberbühler einwandfrei umgesetzt wird, geht es mit Köniz nicht. das ö wird als 2 Fragezeichen im schwarzen Quadrat dargestellt. ä geht auch nicht. Dies wird als chinesisches Zeichen ausgegeben. In der Schweiz kommen Umlaute immer wieder vor. Deshalb sollte das Programm ä,ö,ü,Ä,Ö,Ü richtig übernehmen können.
    Alles andere funktioniert aber einwandfrei und sehr rasch.
    Gruss Marcel

  4. Kamran Kazemisays:

    Hi Raffael

    We have used your QRCoder along with Google.Authenticator in a C# DLL to successfully generate QR codes and validate them using the Google and Microsoft Authenticator apps on our development machines. However, when we deploy our application along with this new DLL, it fails to load because some PCs and servers do not have the api-* DLLs that QRCoder uses. Any idea what we need to do to make this work?

    Thank you so much for all your hard work and hope to hear from you sometime soon.

    Regards
    Kamran

  5. theCreativeMindsays:

    HI,
    would it be possible to integrate this qr code generator into invoice ninja?

  6. Saurabhsays:

    Thanks raffael, you saved my day.

    Thanks

  7. Walter Schützsays:

    Ich habe noch nicht mit der Umsetzung begonnen, aber ich habe irgendwie das Gefühl, dass die Beispiele in der Dokumentation keinen vollständigen Swiss QR-Code erzeugen!

    Wie wäre es, für die Beispiele den zugehörigen Permalink von https://qr-rechnung.net/ gleich mitzubublizieren – dann hätte man einen direkten Vergleich. Bei den S1 Rechnungsinformationen (Swico) könnte man die Beispiele aus der Syntaxdefinition von SWICO verwenden und so die Syntaxdefinition als Vergleichsreferenz benutzen.

    So wäre man mit minimalem Schreibaufwand sicher, dass alle Felder korrekt abgefüllt werden!

  8. Ulrichsays:

    Hallo Raffael, vielen Dank für diesen Code. Sehr gerne bin ich bereit, dafür auch etwas zu bezahlen, um diesen Baustein in meinen Lösungen einzusetzen.
    Allerdings muss er dann auch funktionieren…tut er leider nicht, da der Referenztyp QRR nicht verwendet werden kann (dauernde Fehlermeldungen).
    Ganz sicher gibt es eine intelligente Lösung dafür.
    Grüsse

    Ulrich

  9. Peter Neumannsays:

    Es gibt inzwischen bereits eine Version 2.1 des Standards.
    Wann wird der hier erwähnte Code entsprechend angepasst?

  10. Hallo zäme

    Vielen Dank für den Code. Funktioniert super bei mir als Web-Applikation auf IIS mit RESTful API. Von Office (VBA) hole ich dort die Bitmap ab.

    Es gibt da noch ein Problem: Auf der Validierungs-Seite von SIX kommt der fertige QR-Code noch nicht durch. Fehler: “Muss QR-IBAN sein, beim QRR-Typ”

    Liegt das daran, dass die QR-IBAN noch gar nicht existieren, oder stimmt etwas an dem QR-Code noch nicht?

  11. Mathanisays:

    Hallo Raffael,
    Ich habe den Quellencode heruntergeladen aber ich weiß nicht welcher Solution ich starten soll, ich habe fast alle probiert aber keiner ist bei mir gelaufen! Daher konnte den Projekt-Typ auf COM umbauen. Was müsste ich machen oder wo könnte ich etwas finden wo mir dabei weiter hilft.
    Danke !

    PS.
    Ich habe vorher noch nie mit Visual Studio oder C# gearbeitet, Wäre das ein großes Hindernis?

  12. Michaelsays:

    Ist der SwissQrCode Teil, beim QRCoder, bereits auf die Version 2.0 der Swiss Payment Standards 2018 aktualisiert worden oder können wir uns da auf ein Update freuen?

    Grüsse & besten Dank für den Artikel und die SwissQrCode Erweiterung :)
    Michael

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

    • Peter Schwagersays:

      Hallo Bettina
      Hast Du eine Lösung? Meine kannst Du gerne gratis haben (psschwager@gmail.com).
      Gruss
      Peter

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

      • Peter Schwagersays:

        Ms-Access VBA Lösung
        Danke für den Code! Ich habe einen Com Wrapper geschrieben für einen Teil der Funktionalität. Den Wrapper verwende ich in MS-Access mit VBA um Musikschul-Rechnungen in einem Access-Report mit QR-Referenz zu erzeugen. Ich muss alles noch verifizieren lassen!

        • Fabiansays:

          Hallo Peter
          Ich habe leider zu wenig Erfahrung im Umgang mit Com Wrapper. Würdest du allenfalls einen Code zur Verfügung stellen, damit ich diesen ebenfalls für einen kleinen Verein verwendet könnte?

        • Hi Peter,

          I am writing an invoicing application in MS-ACCESS, and I am looking for VBA code to generate QR code.

          Would you be ok to help me?

        • Gregoriosays:

          Hallo Peter
          Hast Du für Access und VBA ein funktionierend Code generiert.
          darf ich von dir haben? ich bin nicht Programmierer doch probiere ich immer wieder.
          Ich habe eine Access Anwendung zum anpassen.
          Vielen Dank

          • Peter Schwagersays:

            Sorry, ja klar ich gebe den Code gerne weiter. Er ist sehr einfach anzuwenden und es gibt schon einige die ihn verwenden und das Resultat auch verifiziert haben. Bitte E-Mail an psschwager@gmail.com
            Gruss
            Peter Schwager

    • 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

  15. 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…

  16. 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?

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

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

  19. 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 … ;-)

Schreibe einen Kommentar zu Raffael Antworten abbrechen

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