{"id":1887,"date":"2026-01-15T19:44:54","date_gmt":"2026-01-15T17:44:54","guid":{"rendered":"https:\/\/www.lvbprint.de\/?p=1887"},"modified":"2026-01-26T19:00:35","modified_gmt":"2026-01-26T17:00:35","slug":"auto-girocode","status":"publish","type":"post","link":"https:\/\/www.lvbprint.de\/en\/2026\/01\/15\/auto-girocode\/","title":{"rendered":"100% automated EPC QR code (Girocode) embedding directly in the invoice printing process"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Einf\u00fchrung<\/h2>\n\n\n<p>So ein Girocode auf einer Rechnung ist eigentlich sehr praktisch. Eine geeignete Banking-App \u00fcbernimmt automatisch alle Daten und man spart sich die m\u00fchsame Eingabe der IBAN und der anderen Daten.<\/p>\n<p>Mit Hilfe von PrintMulti und dessen F\u00e4higkeiten ist es m\u00f6glich<\/p>\n<ul>\n<li>die relevanten Daten aus dem gerade druckenden Job zu extrahieren<\/li>\n<li>ein Skript aufzurufen, das den QR-Code Code erzeugt und<\/li>\n<li>diesen beim Drucken (auch auf PDF-Drucker) in das Dokument einzubetten.<\/li>\n<\/ul>\n<p>Es werden zwei unterschiedliche Methoden im mitgeliefertem Beispiel angeboten um den QR-Code zu erzeugen.<\/p>\n<ol>\n<li>Mittels eines Powershell-Skripts und dem Tool <a href=\"https:\/\/sourceforge.net\/projects\/zint\/\" target=\"_blank\" rel=\"noopener\">zint<\/a>.<\/li>\n<li>Mit Hilfe eines Python-Skript und dem Modul &#8217;segno&#8216;<\/li>\n<\/ol>\n<p>Alle <a href=\"https:\/\/www.lvbprint.de\/wp-content\/uploads\/2025\/12\/ZUGFeRD.drawio.png\" target=\"_blank\" rel=\"noopener\">Beispiele mit versteckten Texten<\/a> bieten die M\u00f6glichkeit beim Drucken auf den Drucker &#8222;XRechnung&#8220; automatisch einen Girocode in die erzeugte ZUGFeRD Rechnung einzubetten.<\/p>\n<p>Vor- und Nachteile und Installationsanweisungen (auch f\u00fcr PrintMulti) finden Sie in der <a href=\"https:\/\/www.lvbprint.de\/files\/zugferd\/PrintMulti_XRechnung_de.pdf\" target=\"_blank\" rel=\"noopener\">PrintMulti_XRechnung_de.pdf<\/a> Datei. Dort sind auch die Schritte im Einzelnen erkl\u00e4rt, wie man den Girocode in der Konfigurationsdatei aktivieren kann.<\/p>\n\n\n<h2 class=\"wp-block-heading\">So funktioniert&#8217;s<\/h2>\n\n\n\n<p>So sieht es am Ende aus. Im Beispiel ist der Girocode aber oben rechts angeordnet. Das kann leicht angepasst werden.<br>Die relevanten Texte sind rot umrahmt. Im Beispiel ist der Verwendungszweck eine Kombination der Rechnungsnummer und des Empf\u00e4ngers<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"959\" height=\"928\" src=\"https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodePDF.png\" alt=\"\" class=\"wp-image-1890\" style=\"aspect-ratio:1.0334010275321612;width:625px;height:auto\" title=\"\" srcset=\"https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodePDF.png 959w, https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodePDF-300x290.png 300w, https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodePDF-768x743.png 768w, https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodePDF-12x12.png 12w\" sizes=\"auto, (max-width: 959px) 100vw, 959px\" \/><\/figure>\n\n\n\n<p>Im folgenden Bild sind die versteckten Texte sichtbar (durch Makro oder \u00c4ndern der Formatvorlage).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"883\" height=\"883\" src=\"https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodeOriginal.png\" alt=\"\" class=\"wp-image-1891\" style=\"width:732px;height:auto\" title=\"\" srcset=\"https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodeOriginal.png 883w, https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodeOriginal-300x300.png 300w, https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodeOriginal-150x150.png 150w, https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodeOriginal-768x768.png 768w, https:\/\/www.lvbprint.de\/wp-content\/uploads\/2026\/01\/GiroCodeOriginal-12x12.png 12w\" sizes=\"auto, (max-width: 883px) 100vw, 883px\" \/><\/figure>\n\n\n\n<p>Folgende Zeilen in der PrintMultiRechnung.ini sind f\u00fcr die Extraktion zust\u00e4ndig:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-code\"><code><code>invoicenr=$(;rawpage;\\&#91;01\\](&#91;^\u205e]*)\u205e;1;regex)\namount=$(;rawpage;\"\\\\&#91;115\\\\](&#91;^\u205e]*)\u205e\";1;regex)\nbuyer=$(;rawpage;\\&#91;44\\](&#91;^\u205e]*)\u205e;1;regex)\niban=$(;rawpage;\\&#91;84\\](&#91;^\u205e]*)\u205e;1;regex)\nbic=$(;rawpage;\"\\\\&#91;86\\\\](&#91;^\u205e]*)\u205e\";1;regex)\nnf=$(;rawpage;\"\\\\&#91;NF\\\\](&#91;^\u205e]*)\u205e\";1;regex)\ncurrency=$(;rawpage;\"\\\\&#91;05\\\\](&#91;^\u205e]*)\u205e\";1;regex)\nowner=$(;rawpage;\"\\\\&#91;85\\\\](&#91;^\u205e]*)\u205e\";1;regex)<\/code><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8222;rawpage&#8220; ist der Textinhalt des kompletten Dokuments. Alle erkannten Texte werden ohne Trenner in einer Zeile pro Seite verwendet. Ein Ausschnitt sieht z.B: so aus:<br><pre><span style=\"white-space: pre-wrap;\"><code>RECHNUNG [01]2025-0001\u205e[03]INVOICE\u205eDATUM [02]01.03.2024\u205eK\u00e4uferreferenz:[10]991-33333TEST-33\u205e<\/code><\/span><\/pre><\/li>\n\n\n\n<li>Die eckigen Klammern m\u00fcssen durch &#8222;\\[&#8220; und &#8222;\\]&#8220; escaped werden.&nbsp;<\/li>\n\n\n\n<li>Auf den erkannte Text innerhalb der runden Klammern kann \u00fcber den Index zugegriffen werden. Hier gibt es nur eine rundes Klammerpaar, insofern kann nur die 1 verwendet werden.<\/li>\n\n\n\n<li>Das &#8222;<strong>\u205e<\/strong>&#8220; ist einfach ein seltenes Zeichen aus dem Unicode-Zeichensatz, das als Trenner verwendet wird. Es werden also beliebig viele Zeichen au\u00dfer dem Trennzeichen bis zu einem Trennzeichen an die jeweiligen Werte auf der linken Seite zugewiesen.<\/li>\n\n\n\n<li>In der Kommandozeile wird mittels @&#8220;#(xxx)I&#8220; auf den Wert zugegriffen. Falls eine Variable mit einem &#8222;!&#8220; anf\u00e4ngt, dann wird sie als Umgebungsvariable gesetzt und man kann mittels %xxx% darauf zugreifen. Das funktioniert nur nicht mit leeren Texten.&nbsp;<\/li>\n\n\n\n<li>Bei Definitionen zwischen @&#8220;&#8230;&#8220; bleiben die Anf\u00fchrungszeichen erhalten und Escape-Sequencen werden nicht ersetzt.&nbsp;<\/li>\n\n\n\n<li>In der PrintMulti Logdatei &#8222;DbgLog.csv&#8220; sind alle Extraktionen und der Aufruf des Skripts ggf. zu sehen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00f6gliche Anpassungen<\/h2>\n\n\n\n<p>Die Position des Girocodes muss mit Sicherheit auf das Layout Ihrer Rechnung angepasst werden. Die entsprechenden Werte X,Y, Align und Height sind selbsterkl\u00e4rend und finden sich im Abschnitt [QRImage].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-code\"><code><code><code><strong>&#91;QRImage]<\/strong>\nActive=%CreateGiroCode%\nType=Image\nForeground=0\nSource=%QRFile%\n<strong>X=18cm\nY=1cm\nAlign=Left\nHeight=2cm<\/strong><\/code><\/code><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Der Verwendungszweck wird hier zusammengesetzt. In vielen F\u00e4llen reicht vermutlich die Rechnungsnummer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code><code><code><strong>purpose=\"#(invoicenr)I,#(buyer)I\"<\/strong><\/code><\/code><\/code><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Auswahl des Verfahrens<\/h2>\n\n\n\n<p>Sie k\u00f6nnen zwischen einem Powershell-Skript und einem Python-Skript in der Ini w\u00e4hlen. Andere Skriptsprachen k\u00f6nnen ggf. \u00fcber die gleiche Art angebunden werden.<\/p>\n\n\n\n<p>Aktivieren Sie den entsprechenden ExecuteCmd Befehl durch Kommentieren der nicht verwendeten Befehle.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>ExecuteCmd= powerShell.exe -File @\"%BasePath%\\PrintMulti\\Girocode\\CreateGiroQRCode.ps1\" -FileName @\"%QRFile%\" \u2026<\/strong>\n;ExecuteCmd=\"%PythonPath%\" @\"%BasePath%\\PrintMulti\\Girocode\\CreateGiroQRCode.py\" --filename @\"%QRFile%\" \u2026\n;ExecuteCmd=py @\"%BasePath%\\PrintMulti\\Girocode\\CreateGiroQRCode.py\" --filename @\"%QRFile%\" \u2026<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Details zur Installation und Fallstricke finden Sie hier: <a href=\"https:\/\/www.lvbprint.de\/files\/zugferd\/PrintMulti_XRechnung_de.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">PrintMulti_XRechnung_de.pdf<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Girocode ohne ZUGFeRD Rechnung<\/h2>\n\n\n\n<p>Die mit dem ZUGFeRD-Composer mitgelieferten Beispiele mit versteckten Texten erlauben eine einfache Einbettung eines Girocodes, da die Extraktion der notwendigen Daten sehr einfach ist.<\/p>\n\n\n\n<p>Das funktioniert auch mit anderen Rechnungen, sofern die relevanten Daten extrahiert werden k\u00f6nnen. Normalerweise sind die Kontodaten fix, sodass nur der Verwendungszweck und der Betrag aus der Rechnung extrahiert werden m\u00fcssen.<\/p>\n\n\n\n<p>Im Beispiel &#8222;<a href=\"http:\/\/www.lvbprint.de\/files\/girocode\/invoice_two_vat_girocode_only.odt\" target=\"_blank\" data-type=\"link\" data-id=\"www.lvbprint.de\/files\/girocode\/invoice_two_vat_girocode_only.odt\" rel=\"noreferrer noopener\">invoice_two_vat_girocode_only.odt<\/a>&#8220; wurden alle versteckten Texte entfernt. Wenn Sie einen Blick in die extrahierten Texte im <em>&#8222;C:\\ZUGFeRD\\Temp&#8220;<\/em> Verzeichnis werfen, stellen Sie fest, dass die Rechnungsnummer (=Verwendungszweck) und der Betrag extrahiert werden k\u00f6nnen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Die relevanten Stellen sind (Leerstellen am Anfang und Ende werden von den Girocode Skripten entfernt)\n<code>...RECHNUNG: <strong>2025-0001<\/strong>DATUM:...0,00\u20acF\u00c4LLIGER BETRAG<strong>1004,66<\/strong>\u20acZahlung...<\/code><\/code><\/pre>\n\n\n\n<p>Es gibt auch eine &#8222;<a href=\"http:\/\/www.lvbprint.de\/files\/girocode\/PrintMulti_Girocode.ini\" target=\"_blank\" data-type=\"link\" data-id=\"http:\/\/www.lvbprint.de\/files\/girocode\/PrintMulti_Girocode.ini\" rel=\"noreferrer noopener\">PrintMulti_Girocode.ini<\/a>&#8222;, die entsprechend vorbereitet ist. Sie verlangt einen PrintMulti Drucker <em>&#8222;Girocode&#8220;<\/em>.<\/p>\n\n\n\n<p>Der wichtige Abschnitt ist hier (&#8222;purpose&#8220;, &#8222;amount&#8220; aus dem Rechnungstext; der Rest ist fix)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>purpose=$(;rawpage;RECHNUNG:(&#91;^DATUM])DATUM;1;regex) \namount=$(;rawpage;F\u00c4LLIGER BETRAG\"(&#91;^\u20ac])\u20ac;1;regex)\nowner=\"Gustav Gans\u00f6\u00e4\u00fc\"\niban=\"DE75 5121 0800 1245 1261 99\"\nbic=\"GENOKDKSJFG\"\nnf=\"DE-de\"\ncurrency=\"EUR\"<\/code><\/code><\/pre>\n\n\n\n<p>Der Kontoinhaber kann auch Umlaute enthalten. Die Girocode Definition erlaubt aber nicht die Verwendung aller Unicode Zeichen aus dem Zeichensatz. Die PDF Rechnung enth\u00e4lt einen anderen Kontoinhaber.<br><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung So ein Girocode auf einer Rechnung ist eigentlich sehr praktisch. Eine geeignete Banking-App \u00fcbernimmt automatisch alle Daten und man spart sich die m\u00fchsame Eingabe<\/p>\n<div class=\"btn btn-light btn-arrow\"><a href=\"https:\/\/www.lvbprint.de\/en\/2026\/01\/15\/auto-girocode\/\" rel=\"nofollow\" title=\"Read More\">Read More<\/a><\/div>","protected":false},"author":1,"featured_media":1938,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[93,82,48],"tags":[110,112,109,111,98],"class_list":["post-1887","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-zugferd-composer","category-printmulti","category-printmulti-examples","tag-einbetten","tag-epc-qr-code","tag-girocode","tag-qr-code","tag-zugferd"],"_links":{"self":[{"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/posts\/1887","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/comments?post=1887"}],"version-history":[{"count":44,"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/posts\/1887\/revisions"}],"predecessor-version":[{"id":1940,"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/posts\/1887\/revisions\/1940"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/media\/1938"}],"wp:attachment":[{"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/media?parent=1887"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/categories?post=1887"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lvbprint.de\/en\/wp-json\/wp\/v2\/tags?post=1887"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}