===== Deutsche Post Datamatrix-Barcode =====
==== Anforderung ====
Maschinenlesbare Freimachungsvermerke der Deutsche Post AG helfen, den Briefversand effektiver, kostengünstiger und sicherer zu machen. Maschinenlesbare Freimachungsvermerke sind nichts weiter als eine besondere Form von Barcodes vom Typ DataMatrix, deren Inhalt abhängig vom gewählten Versandverfahren bestimmten Vorgaben der Deutsche Post AG entsprechen muss.
{{print2forms:tips:0013-1.png |Pressepostetikett }}Es existieren diverse Dokumente der Deutsche Post AG, die den Inhalt der DataMatrix-Codes im Detail beschreiben. Dabei werden auch genaue Angaben darüber gemacht, wie einzelne Daten zu formatieren sind. \\ \\ Die Kenntnis oder zumindest die Verfügbarkeit dieser Dokumente wird vorausgesetzt.
\\
\\
==== Realisierung ====
Wenn in (p2f) ein Barcode gedruckt werden soll, muss dessen Inhalt in Form einer sogenannten Schablone innerhalb eines Barcodefeldes (Bestandteil eines Formulars) beschrieben werden. Da der Inhalt des Barcodes in den seltensten Fällen konstant ist, wird sich der Inhalt in der Regel aus irgendwelchen Nutzdaten zusammensetzen, die im Barcodefeld selbst oder in Suchfeldern ermittelt wurden. Die Schablone enthält deshalb eine oder mehrere Referenzen auf Nutzdaten.
Für die einwandfreie Lesbarkeit der Barcodes wird die Einhaltung bytegenauer Vorgaben notwendig.
\\
\\
(p2f) unterstützt **Formatierungsanweisungen** für die Zusammenstellung der Daten innerhalb dieser Schablonen. Diese Anweisungen orientieren sich an denen aus diversen Programmiersprachen bekannten Mustern und folgen unmittelbar auf die Feldreferenz nach dem Index:
\ABO:1:-24s \IDS:4:2b
Jede der Formatierugsanweisungen besteht aus einem Doppelpunkt, gefolgt von einem oder mehrereren der folgenden vier Elemente (in eckigen Klammern bedeutet: Optional):
[ Kennzeichen ] [ Weite ] [ '.' Präzision ] Typ
=== Kennzeichen ===
^ Kennzeichen ^ Bedeutung ^ Standard ^
| – | Ausrichtung nach Links innerhalb der Feldweite | Ausrichtung rechts |
| + | Vorzeichen '+' oder ' - ' vor numerischen Werten | nur '-' bei negativen Werten |
| 0 | Führende Nullen bei numerischen Werten | keine führenden Nullen |
=== Weite ===
Der zweite Wert definiert, so vorhanden, die Weite des auszugebenden Feldes. Die Weite ist eine ganzzahlige Zahl und definiert die Mindestweite des Feldes. Füllt das zu formatierende Argument diese Feldweite nicht aus, wird standardmässig mit Leerzeichen links aufgefüllt. Das kann mit den Kennzeichen (s.o.) dahingend geändert werden, dass rechts aufgefüllt wird, oder das zum Auffüllen Nullen verwendet werden.
Ist das zu formatierende Argument länger als die Feldweite, wird das Feld automatisch solange erweitert, bis das Argument vollständig ist. Es wird niemals abgeschnitten (abgesehen von Präzision).
=== Präzision ===
Die Präzision ist einen ganzzahlige, nichtnegative Zahl. Die Bedeutung des Wertes für die Präzision hängt vom Typ des auszugebenden Feldes ab.
^ Typ ^ Bedeutung ^ Standard ^
| d, x, X | Spezifiert die minimale Anzahl von Ziffern, die ausgegeben werden. | 1 |
| s | Spezifiert die maximale Anzahl von Zeichen, die ausgegeben werden. \\ Überzählige Zeichen werden abgeschnitten. | Komplette Zeichenkette |
=== Typ ===
Eine Typangabe, welche den Typ beschreibt, als den das jeweils übergebene Argument angesehen werden soll. Mögliche Angaben sind:
^ Typ ^ Bedeutung ^
| b | Das Argument wird als ganze Zahl angesehen und als Bytes ausgegeben. Die Anzahl der auszugebenden Bytes bestimmt die Feldweite und der Wert des Arguments. |
| d | Das Argument wird als ganze Zahl angesehen und dezimal ausgegeben. |
| x | Das Argument wird als ganze Zahl angesehen und hexadezimal ausgegeben. Die Ziffern 'A' bis 'F' werden dabei als Kleinbuchstabe ausgegeben. |
| X | Das Argument wird als ganze Zahl angesehen und hexadezimal ausgegeben. Die Ziffern 'A' bis 'F' werden dabei als Grossbuchstabe ausgegeben. |
| s | Das Argument wird als Zeichenkette angesehen. |
=== Beispiele ===
^ Formatierung ^ Bedeutung ^
| :s | normale rechtsbündige Ausgabe |
| :10s | rechtsbündige Ausgabe, mit Leerzeichen aufgefüllt |
| :-10s | linksbündige Ausgabe, mit Leerzeichen aufgefüllt |
| :010d | zehnstellige Ausgabe, mit Nullen aufgefüllt (funktioniert auch bei Zeichenketten) |
| :10.10s | linksbündige Ausgabe mit Abschneiden überzähliger Buchstaben nach der zehnten Stelle |
\\
\\
Mit diesem Rüstzeug kann man jetzt den Barcode für den maschinenlesbaren Freimachungsvermerk angehen. Im Prinzip werden nur die Formatierungstypen 's' für Zeichenketten und 'b' für numerische Werte benötigt. Die Schablone für den Dienst Pressepost Premiumadress sieht dann so aus (aus Gründen der Übersicht umgebrochen):
DEA\x19\x14\IDS:1:3b\IDS:3:2b\x00\x00\IDS:2:2b\x24\x3F\IDS:4:2b\ABO:1:-24s
\PLZ:2:3b\ORT:2:-24s\STR:1:-22s\HNR:1:-10s\NAM1:1:-30s\NAM2:1:-30s\NAM3:1:-30s\INF:1:-11s
\\
\\
Mit Suchfeldern wurden die einzelnen Bestandteile des Barcodes zusammengesucht. Als Referenz auf die Dokumente der Deutsche Post AG seien hier die Namen und Inhalte der Suchfelder erklärt:
| IDS:1 | Zeitungskennziffer |
| IDS:2 | Einlieferungsdatum |
| IDS:3 | Heftnummer |
| IDS:4 | Premiumadress-Id |
| ABO:1 | Abonenntennummer |
| PLZ:1 | Postleitzahl |
| ORT:1 | Ortsname |
| STR:1 | Strassenname |
| HNR:1 | Hausnummer |
| NAM1:1 | Name Zeile 1 |
| NAM2:1 | Name Zeile 2 |
| NAM3:1 | Name Zeile 3 |
| INF:1 | Kundenindividuelle Information |
\\
\\
=== Hinweis ===
* Bei der Zusammenstellung der Daten für den Barcode werden eine Reihe von Binärdaten in Form hexadezimal kodierter Zeichen benötigt (z.B: '\x19\x14'). Es ist nicht (!) möglich, diese Daten vom Anwendungsprogramm her als Zeichenkette auszugeben und dann in die Schablone einzufügen, weil die eingefügten Daten 1:1 übernommen werden und daher keine Übersetzung der hexadezimal kodierten Zeichen mehr erfolgt.\\ \\ Die einzige Möglichkeit, diese Daten doch in das Anwendungsprogramm mit aufzunehmen, wäre, eine Dezimalzahl zu drucken, und diese mit der Formatierung 'b' in die Schablone mit aufzunehmen (z.B: 6420 formatiert mit '2b' ergibt auch zwei Byte mit den Werten hexadezimal 19 und 14, so wie oben bei der Premiumadress-Id).