von Patrick Gundlach |

Feature der Woche: Erstellen von QR-Codes

Das erste »Feature der Woche« im Jahr 2017 beschäftigt sich mit der Ausgabe von QR-Codes. Kürzlich sind mir GiroCodes über den Weg gelaufen. Das sind QR-Codes, die Rechnungsinformationen enthalten, mit denen man eine Online-Überweisung schnell und einfach durchführen kann.

Ein QR-Code, der Überweisungsinformationen enthält. Der Rahmen und der Text darüber sind nicht notwendig.

Der Befehl, um einen QR-Code zu erzeugen, lautet <Barcode>, z.B.:

<PlaceObject>
  <Barcode select="'Hallo Welt!'" type="QRCode" width="5"/>
</PlaceObject>

Hinweis: Es werden derzeit die Codes Code128, EAN13 und QRCode unterstützt. Sie werden intern erzeugt und benötigen keine Online-Verbindung.

In dem oben gezeigten Code sind die Überweisungsinformationen enthalten. Für das Beispiel nutze ich folgende Datendatei

<data>BCD
001
1
SCT
GENODEM1GLS
Greenpeace e.V.
DE49430609670000033401
EUR100.00


Meine Anschrift
</data>

Die einzelnen Felder nach dem Feld SCT sollten sich leicht erschließen. Es sind die BIC, Empfänger (UTF-8 kodiert), IBAN, Betrag, zwei Leerzeilen und der Verwendungszweck. Wichtig für die Kompatibilität mit dem GiroCode Standard ist, dass die Fehlerkorrektur im QR-Code auf »M« festgelegt ist. Seit der Version 2.7.10 kann man diese explizit festlegen.

So lautet die Ausgabe für den Code:

<Record element="data">
  <PlaceObject>
    <Barcode select="." type="QRCode" eclevel="M" width="4"/>
  </PlaceObject>
</Record>

Als Gimmick habe ich noch einen Rahmen um den Code gezeichnet mit dem Text darüber. Der Text ist in der Schriftart OpenSans Condensed und kann auf der Google Fonts Seite herunter geladen werden.

<Layout xmlns="urn:speedata.de:2009/publisher/en"
    xmlns:sd="urn:speedata:2009/publisher/functions/en">

    <LoadFontfile name="OpenSans-CondensedBold" filename="OpenSans-CondBold.ttf" />
    <DefineFontfamily name="girocode" fontsize="14" leading="14">
        <Regular fontface="OpenSans-CondensedBold"/>
    </DefineFontfamily>

    <Record element="data">
        <SetVariable variable="radius" select="'8pt'"/>
        <SetVariable variable="x" select="4"/>
        <SetVariable variable="y" select="3"/>
        <SetVariable variable="wd" select="4"/>
        <SetVariable variable="gap" select="$wd div 15"/>

        <PlaceObject row="{$y - $gap}" column="{$x - $gap}">
            <Frame framecolor="black"
                border-bottom-left-radius="{$radius}"
                border-bottom-right-radius="{$radius}"
                border-top-left-radius="{$radius}"
                border-top-right-radius="{$radius}"
                rulewidth="2pt">
                <Box width="{$wd + 2 * $gap}" height="{$wd + 2 * $gap}"
                     backgroundcolor="white"/>
            </Frame>
        </PlaceObject>

        <PlaceObject row="{$y - 3 * $gap}" column="{$x}">
            <Textblock width="{$wd}" textformat="centered" fontface="girocode">
                <Paragraph>
                    <Color name="#000066"><Value>GIRO</Value></Color>
                    <Color name="#FF000A"><Value>CODE</Value></Color>
                </Paragraph>
            </Textblock>
        </PlaceObject>


        <PlaceObject column="{$x}" row="{$y}" allocate="no">
            <Barcode select="." type="QRCode" eclevel="M" width="{$wd}"/>
        </PlaceObject>

    </Record>
</Layout>

Die Idee ist, erst eine leere Box zu zeichnen mit dem abgerundeten Rahmen. Die Box muss etwas größer sein, als der eigentliche Code. Anschließend wird der Text GIROCODE geschrieben und zum Schluss der eigentliche QR-Code eingepasst. Mit den Variablen kann man die Größe und Position leicht anpassen. Das Ergebnis ist im Bild oben zu sehen.

Viel Spaß beim Spenden.

Dieser Artikel bezieht sich auf den speedata Publisher in der Version 2.7.10. Andere Versionen haben womöglich andere Befehle oder die genannten Befehle zeigen ein anderes Verhalten. Bitte schau im Zweifelsfall in der Anleitung nach.

In der Serie »Feature der Woche« beschreibe ich einmal in der Woche mehr oder weniger nützliche Eigenschaften des Publishers. Kommentare gerne an mich per E-Mail oder einfach im Kommentarfeld.