Zum Inhalt springen

TPCL-Befehle: Text, Barcode und QR-Code auf ein Etikett

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

TPCLDownload
<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>

Example-1

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:

Der Etiketten-Dialog des Setting Tools: 25,0 mm breit, 25,0 mm hoch, Stanzetiketten

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

TPCLDownload
<STX>{D0295,0295,0295|}
{C|}
{XB01;0051,0051,T,M,06,A,0,M2=https://www.prefabcortex.com|}
{XS;I,0001,0002D4000|}
<ETX>

Example-2

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:

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

Genannte Produkt-, Firmen- und Markennamen gehören ihren jeweiligen Inhabern und werden hier allein beschreibend verwendet. Eine Verbindung zu ihnen oder eine Empfehlung durch sie besteht nicht.