Veröffentlicht am
Ein Etikettendrucker bekommt weder PDF noch Bild. Er bekommt Text, den man auch von Hand tippen könnte. Deshalb ist ein Etikett ein paar hundert Byte groß und keine paar hundert Kilobyte.
Die Sprache heißt TPCL, Toshiba/TEC Printer Command Language. Die meisten Geräte können daneben noch ZPL2, EPL, DPL und IPL emulieren. Steht der Drucker auf einer dieser Emulationen, verschluckt er die Befehle unten ohne Meldung.
Weiter unten stehen zwei vollständige Druckaufträge. Über jedem ist ein Knopf, der die Datei mit den echten Bytes lädt. Alles stammt aus einem Aufbau, der bei mir läuft: ein B-FV4T mit 300 dpi. Was ich nur aus dem Handbuch habe, ist extra gekennzeichnet.
Mit „Handbuch“ meine ich die
External Equipment Interface Specification der B-FV4-Serie Öffnet ein neues Fenster
von Toshiba, ein gut 10 MB großes PDF, 2. Auflage vom 17. April 2015. Darin steht jeder
Befehl von hier, allerdings in einer anderen Schreibweise. Wo hier
{XS;I,0001,0002D4000|} steht, steht dort [ESC] XS; I, 0001, 0002D4000 [LF] [NUL]. Es
ist derselbe Befehl. Welche Notation gilt, erkennt der Drucker bei jedem Befehl am ersten
Byte: 1B für [ESC], 7B für { (Kapitel 7).
Der Rahmen, und warum er nicht zu sehen ist
Ein Druckauftrag ist Text zwischen zwei Steuerzeichen: STX (0x02) am Anfang, ETX
(0x03) am Ende. Dazwischen steht ein Befehl pro Zeile, jeder in { … |}, also mit
senkrechtem Strich vor der schließenden Klammer. Mehr Syntax gibt es nicht.
Die beiden Steuerzeichen sieht man nicht. Wer ein Beispiel aus einem Artikel kopiert,
kopiert sie deshalb meistens nicht mit. So sieht qr-label.tpcl von weiter unten als
Bytes aus:
00000000: 027b 4430 3239 352c 3032 3935 2c30 3239 .{D0295,0295,029
...
00000060: 2c30 3030 3244 3430 3030 7c7d 0a03 0a ,0002D4000|}...
Zuerst kommt 02, dann die Befehle mit je einem 0a dahinter (auch nach dem letzten),
dann 03 und noch ein 0a. Es gibt kein Nullbyte, keine Prüfsumme und keinen
Abschlussbefehl. In den Beispielen unten stehen <STX> und <ETX> für die beiden Bytes.
In den Dateien zum Herunterladen sind sie echt drin.
Koordinaten sind Millimeter, nicht Punkte
Alle Maße sind Zehntelmillimeter. 0060 heißt 6,0 mm, egal ob das Gerät 203 oder
300 dpi hat. Ein Etikett, das einmal beschrieben ist, sitzt also auf jedem Drucker der
Familie an derselben Stelle. Von der Auflösung hängt nur ab, was in Punkten angegeben
wird, zum Beispiel die Modulgröße eines QR-Codes.
Der Nullpunkt liegt links unten, die y-Achse zeigt nach oben.
Beispiel 1: ein Etikett mit drei Zeilen Text
<STX>{D0295,0295,0295|}
{C|}
{PC000;0040,0060,15,15,G,00,B=A-1024|}
{PC001;0040,0120,10,10,G,00,B=Regal 3 / Fach 12|}
{PC002;0040,0170,10,10,G,00,B=Beispielartikel|}
{XS;I,0001,0002D4000|}
<ETX>

Das sind vier Arten von Befehl. Drei davon braucht jeder Auftrag:
| Befehl | Bedeutung |
|---|---|
{D0295,0295,0295|} |
Etikettengröße: Teilung, Drucklänge, Druckbreite in 0,1 mm |
{C|} |
Bildspeicher leeren. Ohne das druckt der zweite Auftrag den ersten mit |
{PC000;0040,0060,15,15,G,00,B=…|} |
Textfeld: Feldnummer, x, y, Vergrößerung waagerecht und senkrecht, Schriftart, Drehung, Daten |
{XS;I,0001,0002D4000|} |
Drucken: I = ausgeben, 0001 = Stückzahl |
Die Schrift steckt im Drucker, der Auftrag enthält weder Glyphen noch eine Schriftdatei. Dafür wird ein Zeichen, das die eingebaute Schrift nicht kennt, auch nicht gedruckt. Mehrere Zeilen sind mehrere Felder, mit steigender Nummer und kleiner werdendem y.
Der Block 0002D4000 hinter der Stückzahl packt Schnitt, Sensor, Druckverfahren und
Geschwindigkeit in neun Zeichen. Welche Stelle wofür steht, habe ich nie
auseinandergenommen. Ich habe ihn aus einem Beispiel übernommen und er lief auf Anhieb.
Wer mit Thermotransfer druckt oder ein Schneidwerk hat, muss die Handbuchseite dazu lesen:
6.3.13, [ESC] XS.
25 mm auf der Rolle, 29,5 mm im Befehl
Das ist kein Tippfehler. An dieser Stelle geht ein Etikett als Erstes schief. Auf der Rolle sind Etiketten mit 25 × 25 mm:

Die Zahl in {D…} ist aber die Teilung, also der Abstand von einem Etikettenanfang
zum nächsten: Etikett plus Lücke. Trägst du dort 25 ein, verschiebt sich der Druck mit
jedem Etikett ein Stück weiter, bis er neben dem Aufkleber landet.
Bei mir stehen alle drei Maße auf demselben Wert. Aus dem Betrieb kann ich deshalb nicht sagen, welche Stelle welche ist. Laut Handbuch sind es Teilung, Drucklänge und Druckbreite (6.3.1).
Beispiel 2: ein Etikett mit QR-Code
<STX>{D0295,0295,0295|}
{C|}
{XB01;0051,0051,T,M,06,A,0,M2=https://www.prefabcortex.com|}
{XS;I,0001,0002D4000|}
<ETX>

XB zeichnet einen Strich- oder Flächencode:
| Stelle | Bedeutung |
|---|---|
01 |
Feldnummer des Codes |
0051,0051 |
x = 5,1 mm, y = 5,1 mm |
T |
Codeart, T ist der QR-Code |
M |
Fehlerkorrekturstufe |
06 |
Modulgröße in Punkten, nicht in Millimetern |
A,0 |
Modellauswahl und Drehung |
M2=… |
Modell 2 und die Daten |
Auf die Modulgröße musst du aufpassen. Sie bleibt fest, die Zahl der Module ändert sich
mit dem Inhalt. https://www.prefabcortex.com hat 28 Zeichen und ergibt 29 × 29 Module.
Bei 6 Punkten pro Modul sind das 174 Punkte. 300 dpi sind 11,8 Punkte pro Millimeter, der
Code wird also 14,7 mm groß und auf 25 mm bleibt Rand. Ab 43 Zeichen springt die
QR-Norm auf 33 × 33 Module, das sind 16,7 mm. Ein paar Zeichen mehr, und der Code passt
nicht mehr aufs Etikett, obwohl sich am Befehl nichts geändert hat.
In die andere Richtung gilt: Unter etwa 4 Punkten Modulgröße bei 300 dpi liest kein Handy den Code mehr zuverlässig.
Wie kommt der Auftrag in den Drucker?
Auf jedem Weg, der Bytes zum Gerät bringt. TPCL ist reiner Text, es gibt keinen Handschlag. Eine der Dateien von oben reicht:
cat qr-label.tpcl > /dev/usb/lp0 # seriell oder USB unter Linux
nc drucker.lan 9100 < qr-label.tpcl # über das Netz
Es geht auch ohne Treiber und Druckserver direkt aus dem Browser. Wie, steht in Einen Etikettendrucker per WebUSB ansteuern.
Ob der Druck geklappt hat, meldet der Drucker dabei nicht. Der Auftrag geht nur in eine Richtung. Den Status fragst du bei Bedarf mit einem eigenen Befehl ab.
Was sonst noch geht
Das Handbuch beschreibt noch Linien und Rahmen (6.3.6), Vektorschriften in beliebiger Größe (6.3.8), gespeicherte Formulare, in die man später nur noch Daten schickt (6.3.23 bis 6.3.25), und weitere Codearten (6.3.9). Für einen Aufkleber mit Nummer und QR-Code brauchst du nichts davon.