Aus Linux-Magazin 11/2017

Thermodrucker für Labels, Kassenbons & Co.

© belchonock, 123RF

Es muss nicht immer ein moderner und teurer Thermodrucker sein – auch betagtere Modelle bringen Adressen und Quittungen auf ausreichend breites Papier. Mit etwas handwerklichem Geschick, ein paar Bash-Befehlen und einem Python-Skript gelingt die Zusammenarbeit mit Linux.

Laser- und Tintenstrahldrucker haben in vielen Firmen und Privathaushalten die älteren Nadel- und Thermodrucker längst verdrängt. Letztere kommen immer noch in medizinischen Messgeräten, beim Erstellen von Kassenbons, Parkscheinen, Fahrkarten und Versandetiketten zum Einsatz. Thermodrucker dominieren also vor allem die Bereiche, wo kein Farbdruck erforderlich ist.

Thermodrucker haben wenige bewegliche Teile, oft nur eine Transportrolle aus Gummi. Daher ist die Lebensdauer dieser Geräte deutlich höher als die von anderen Druckern. Auch beim Materialverbrauch sind Thermodrucker sparsam. Sie benötigen keine Tinte, kein Farbband und keinen Toner. Ihre “Tinte” ist praktischerweise gleich ins Papier integriert – die Geräte heizen mit ihrem Druckkopf das hitzeempfindliche Thermopapier an den zu bedruckenden Stellen punktuell auf und machen so den schwarzen Farbstoff sichtbar.

Zwei Seiten

Nicht nur kleinere Unternehmen, sondern auch Heimanwender, die häufig Pakete verschicken, profitieren von Thermodruckern. Zwar gibt es Etiketten auch auf A4-Trägerpapier für Laser- und Tintenstrahldrucker, das Arbeiten damit kann aber mühsam sein und die Tinte ist im Normalfall nicht wasserfest. Drucken Anwender auf einem Blatt mit zwei Etiketten nur eines davon, dann gilt es, dieses vom Papier abzuziehen, das Trägerpapier mit dem noch nicht beschrifteten Label andersherum in den Drucker einzulegen und beim nächsten Druckvorgang zu hoffen, dass es keine Probleme beim Einzug gibt.

Thermodrucker setzen auf fortlaufende Rollen, was den Etikettendruck maßgeblich vereinfacht, da kein Umschichten des Papiers von Hand erforderlich ist. Thermopapier auf Rollen ist außerdem vergleichsweise preiswert. Bleibt die Frage nach den Kosten für das Gerät – Adressetiketten und einigermaßen leserliche Quittungen benötigen eine entsprechende Druckbreite, das heißt mindestens 4 Zoll (zirka 10 Zentimeter). Derzeit erhältliche günstige Thermodrucker sind jedoch deutlich kleiner und können nicht mithalten.

Wer ein Gerät mit einer ausreichenden Trägerbreite erwerben möchte, muss tiefer in die Tasche greifen und wenigstens rund 150 Euro investieren. Eine günstige Alternative stellen ältere Modelle dar, die gebraucht oder neu für kleines Geld zu haben sind. Eventuell steht ein ausgemustertes Gerät sogar noch im Keller herum – da Thermodrucker mechanisch kaum verschleißen, spricht überhaupt nichts dagegen, ein solches Relikt zu reaktivieren.

Dinosaurier im Druckerpark

Der Autor hat zwei originalverpackte ältere Thermodrucker mit 4 Zoll Breite bei Ebay für den Preis von zirka 7 US-Dollar pro Stück erworben (Kasten “Thermodrucker für Etiketten”). Eines kümmert sich um die Versandetiketten, das andere um Quittungen. Erstere kommen so aus dem Drucker, dass der Autor sie nur noch aufkleben muss. Die Krux an der Sache: Die online erworbenen Thermodrucker kamen ohne nötiges Zubehör, also ohne Netzteil, Rollenhalter und Staubschutz. Dedizierte Linux-Druckertreiber gibt es nicht und auch keinen USB-Port – die Geräte haben eine serielle und eine Infrarotschnittstelle.

Mit einem 3-D-Drucker und etwas handwerklichem Geschick, einem passenden Netzteil und einem USB-Seriell-Adapter, einem selbst geschriebenen Python-Skript sowie ein paar Bash-Zeilen ist es aber problemlos möglich, solche Auslaufmodelle nachzurüsten und über einen Linux-Rechner anzusprechen. Die Gesamtkosten für ein solches Bastelprojekt belaufen sich je nach Aufwand und Angebot auf rund 20 bis 25  Euro pro Thermodrucker – eine Ersparnis von etwa 85  Prozent im Vergleich mit dem günstigsten aktuellen Modell.

Damit eignet sich ein solches Projekt nicht nur für den Eigenbedarf, sondern auch für kleine Stückzahlen im professionellen Betrieb, etwa für eine Lagerhaltung, ein selbst konstruiertes Kassensystem oder die Versandabteilung eines mittelständischen Unternehmens.

Thermodrucker für Etiketten

Linux-Magazin-Autor Gottfried Grosshans war schon länger auf der Suche nach einem Thermodrucker – ob gebraucht oder neu, spielte für ihn keine Rolle. Auch ein bestimmter Hersteller stand nicht auf der Wunschliste. Das Gerät sollte lediglich eine ausreichende Trägerbreite für das Drucken von Versandetiketten haben. Eine Druckdichte von 200 dpi reicht aus, um einfache Adressaufkleber und Barcodes zu drucken.

Der Autor entschied sich schließlich für den SII DPU-3445 der Firma Seiko Instruments [1]. Dieser Thermodrucker hat einen 104 Millimeter breiten Druckkopf (832 Punkte) und außer der Gummirolle für den Papiertransport keine beweglichen Teile. Bis auf die einfache Reinigung mit einem Wattestäbchen ist das Gerät praktisch wartungsfrei.

Außerdem besitzt der Thermodrucker die folgenden Eigenschaften:

  • 160 x 89 x 29,2 Millimeter groß, 250 Gramm schwer
  • Ausreichend hohe Druckgeschwindigkeit (50 Millimeter pro Sekunde)
  • Serielle Schnittstelle mit maximal 115200 Baud
  • Drahtlos über Infrarotschnittstelle
  • Ansteuerung über ESC/P (Epson Standard Code for Printers)
  • Maximale Auflösung von 200 dpi (8 dpmm)
  • Optionaler Batteriebetrieb und damit als mobiles POS-System geeignet
  • Labeldruck und zweiseitiger Druck mit Durchschlag
  • Thermopapier von der Rolle oder als Einzelblatt (Breite: 4 Zoll/112 Millimeter)

Zubehör im Eigenbau

Wie erwähnt, ist dieser ältere Thermodrucker oft ohne jegliches Zubehör erhältlich. Passende Akkus gibt es bei Ebay, und wer das Gerät per Kabel mit Strom versorgen möchte, benötigt ein 9-Volt-Netzteil (3 bis 4 Ampere sowie DC-Stecker 5,5/2,1 Millimeter, Plus am Innenleiter). Wer Stapel-Etiketten verwendet, braucht keinen Rollenhalter, denn diese Label sind wie eine Ziehharmonika zusammengefaltet.

Soll das Gerät hingegen auf Papierrollen drucken, dann muss ein Halter her. Ein Ständer mit einem Stab, beispielsweise aus Holz (Durchmesser 1 bis 2 Zentimeter), ist recht schnell gebastelt. Der Autor hat seinen Rollenhalter mit einem 3-D-Drucker hergestellt (Abbildung 1). Die Vorlagen im OBJ-Format sowie eine Bauanleitung liegen der Heft-DVD bei und finden sich darüber hinaus unter [2]. Abbildung 2 zeigt ein Foto vom Thermodrucker mit der Halterung.

Abbildung 1: So sehen die per 3-D-Drucker erstellten Einzelteile des Rollenhalters aus.

Abbildung 1: So sehen die per 3-D-Drucker erstellten Einzelteile des Rollenhalters aus.

Abbildung 2: Der Rollenhalter für den Thermodrucker ist mit einem 3-D-Drucker entstanden (hier die Seitenansicht).

Abbildung 2: Der Rollenhalter für den Thermodrucker ist mit einem 3-D-Drucker entstanden (hier die Seitenansicht).

Ein Staubschutz für das Papier ist nicht zwingend erforderlich, sorgt aber dafür, dass Anwender den Drucker nicht so oft reinigen müssen. Auch hier hat sich der Autor eine Lösung ausgedacht: Auf dem 3-D-Drucker erzeugt er zwei Seitenteile, ein Vorder- und ein Rückenteil sowie einen Deckel und steckt sie zusammen. Anschließend stülpt er den Kasten über den Rollenhalter. Die Vorlagen und eine Anleitung zum Zusammenstecken befinden sich ebenfalls auf der DELUG-DVD und unter [2].

Als Kunststoff hat der Autor PLA verwendet; ABS oder ein anderes Filament eignen sich aber ebenfalls. Für die Stangen empfiehlt es sich, im Slicer einen Rand (Brim) einzustellen (Abbildung 3), damit sie sich nicht von der Basisplatte des Druckers ablösen. Der Autor nutzt zum Slicen das Programm Repetier-Host [3]. Das überflüssige Material können Nutzer später abschneiden. Für die Stangen ist ein Z-Raster von 0,3 Millimeter eingestellt, für die anderen Teile 0,1 Millimeter. Als 3-D-Drucker eignen sich handelsübliche FDM-Geräte.

Wer einen Irda-Infrarotport am Linux-Rechner hat, kann den Drucker direkt ansteuern. Alternativ überträgt dieses ältere Modell Daten per Kabel und benötigt dazu eine serielle Schnittstelle (RS-232). Das geschieht dann über eine RJ-12-Buchse (6P6C). Hat der Rechner nur einen USB-Anschluss (was für die meisten aktuellen Computer zutreffen dürfte), ist ein entsprechender Adapter erforderlich (USB auf RS-232).

Hier lohnt es sich, auf Billigware für 1 bis 2 Euro zu verzichten, da diese Adapter häufig nicht auf die erforderliche Baudrate (115200) kommen. Das Interface dieser günstigen Geräte entspricht meist nicht der Spezifikation, die positive und negative Signale erfordert. Daher ist bei solchen Adaptern schon bei 19200  Baud oder weniger Schluss und das Drucken erfolgt langsamer oder fehlerhaft.

Um die 115200 Baud zu erreichen, sollten Anwender zu einem FT232RL/FTDI- oder Prolific-Adapter mit PL-2303-Chip greifen, die um 10 Euro kosten. Auf einer Seite ist ein USB-, auf der anderen ein neunpoliger RS-232-Stecker (DB-9) angebracht. Von diesem aus gilt es, den RJ-12-Stecker zu verbinden (Tabelle 1) – mit einer Crimpzange oder durch Löten.

Benutzer sollten lange Kabel auf der RS-232-Seite vermeiden. Wer ein längeres Kabel benötigt, sollte es auf der USB-Seite verwenden, denn USB ist weniger störanfällig und der Signalpegel kann gegebenenfalls mit Hubs oder Repeatern verstärkt werden.

Abbildung 3: Für die Stangen hat der Autor in der Slicer-Software einen Rand (Brim) eingestellt. Den schneidet er später ab.

Abbildung 3: Für die Stangen hat der Autor in der Slicer-Software einen Rand (Brim) eingestellt. Den schneidet er später ab.

Tabelle 1

Kabelverbindung zwischen RJ-12- und DB-9-Stecker

Drucker (RJ-12) Signal Computer (DB-9) Signal
1 RxD 3 TxD
2 TxD 2 RxD
3 SBUSY 8 CTS
4 CHK 5 Masse
5, 6 Masse 5 Masse

Heft-DVD

Die DELUG-DVD enthält neun Objektspezifikationen für den 3-D-Druck des Rollenhalters und des Staubschutzes. Außerdem liegen dem Datenträger zwei beschriftete Bauanleitungen im PDF-Format sowie das Python-Skript zum Konvertieren der PNG-Datei(en) ins ESC/P-Format bei.

Treibende Kraft

Um den Thermodrucker mit der Befehlssprache ESC/P (Epson Standard Code for Printers) anzusteuern, probierte der Autor zunächst alternative Cups-Treiber von anderen Geräten aus. Der Webbrowser machte ihm jedoch einen Strich durch die Rechnung, denn bei den Ausdrucken stimmte entweder die Auflösung nicht, oder es gab zu große Ränder auf den Quittungen und Etiketten.

Abhilfe schafft ein Python-Skript, das die online gekauften Etiketten im PNG- oder PDF-Format in ESC/P-Daten konvertiert. Ein paar Bash-Kommandos steuern die USB-Schnittstelle des Geräts an, stellen die Auflösung ein, schneiden die Ränder ab und rufen dann das Skript auf.

Der Vorteil an dieser Methode: Anwender haben volle Kontrolle über den Ausdruck und können optional Hinweise wie »Vorsicht — ZERBRECHLICH!« an geeigneter Stelle ins Etikett einfügen. Die im Folgenden gezeigten Skripte sind ans Format des amerikanischen Postservice angepasst, es ist aber nicht weiter schwierig, die Größen deutscher Anbieter wie beispielsweise DHL, DPD oder UPS einzusetzen. Listing 1 zeigt das zentrale Python-Skript.

Listing 1

png2escp.py

01 #!/usr/bin/python
02 # png2escp.py
03 # benutzt die PIL-Library
04
05 import sys
06 import time
07 from PIL import Image
08 import PIL.ImageOps
09 import struct
10
11 # Pruefen der Parameter
12 if len(sys.argv) == 1:
13     print 'Usage:', sys.argv[0], \
14            'image1 image2 ... [ > printer_device ]'
15     exit(1)
16
17 # Druckerinitialisierung
18 sys.stdout.write("\x1b@")
19
20 # Setzt Papiertyp Label (Thermorolle)
21 sys.stdout.write("\x12\x21\x05")
22
23 # Setzt Druckdichte
24 sys.stdout.write("\x12\x7e\x87")
25
26 # Setzt Zeilenhoehe
27 sys.stdout.write("\x1b\x33\x0a")
28
29 # Konvertierung aller PNG-Dateien
30 for i in sys.argv[1:]:
31     im = Image.open(i)
32
33     # konvertiert zu 1 Bit
34     if im.mode != '1':
35         im = im.convert('1')
36
37     # Zeilenhoehe auf 24 Bit einstellen
38     if im.size[1] % 24:
39         im2 = Image.new('1', (im.size[0], im.size[1] + 24 - im.size[1] % 24), 'white')
40         im2.paste(im, (0, 0))
41         im = im2
42
43     # Invertieren der Pixel
44     im = PIL.ImageOps.invert(im.convert('L'))
45     # erneute Fixierung auf 1 Bit
46     im = im.convert('1')
47
48
49     # rotiert Image um 90 Grad
50     p_im=im.transpose(Image.ROTATE_90).transpose(Image.FLIP_TOP_BOTTOM)
51
52     # Konvertierungsschleife
53     for row in range(p_im.size[0]/24):
54         strip=p_im.crop((row * 24, 0, (row + 1) * 24, p_im.size[1]))
55         sys.stdout.write(''.join(('\x1b*\x21', struct.pack('2B',p_im.size[1] % 256, p_im.size[1] / 256), strip.tobytes())))
56
57         # gebe Buffer aus mit 0d
58         sys.stdout.write("\x0D")
59
60         # speichere Ausgabe zur Verifizierung und Test
61         p_im.save("result.png", "png")
62
63 # Line feed
64 sys.stdout.write("\x0A\x0D")
65
66 sys.stdout.flush()

Die folgenden drei Befehle kümmern sich um eine PDF-Datei (»packingslip.pdf«); der Autor nutzt sie zum Drucken von Quittungen:

stty -F /dev/ttyUSB0 115200 raw cs8 -cstopb -echo crtscts
convert -shave 140 -trim -density 130 -append ~/packingslip.pdf packingslip.png
python png2escp.py packingslip.png > /dev/ttyUSB0

Das erste Kommando konfiguriert die Gerätedatei »/dev/ttyUSB0«. Wer einen günstigen USB-RS-232-Adapter hat, der keine 115200  Baud unterstützt, kann hier eine geringere Rate einstellen. Dabei ist zu beachten, dass der Drucker die gleiche Baudrate verwendet.

Das »convert«-Kommando definiert die Auflösung, schneidet die Ränder ab und wandelt das PDF in eine PNG-Datei um (»packingslip.png«). Der dritte Befehl ruft das Python-Skript auf und schickt die Ausgabe an den Drucker.

Wer möchte, kann eine weitere Zeile anfügen, die ein Kommando zum Löschen der Datei »packingslip.png« enthält. Die eignet sich für Testläufe, um zu kontrollieren, ob alles zufriedenstellend funktioniert. Alles zusammen macht sich gut als eigenes Wrapper-Skript.

Beim Autor ist ein weiteres Shellskript im Einsatz, das gekaufte Adressetiketten im PNG-Format verarbeitet:

stty -F /dev/ttyUSB0 115200 raw cs8 -cstopb -echo crtscts
convert shiplabel.png shiplabel.pdf
convert -density 203.2 -pointsize 20 -annotate +5+720 "_____________________\n           - ZERBRECHLICH -" shiplabel.pdf shiplabelo.png
python png2escp.py shiplabelo.png > /dev/ttyUSB0

Das erste Kommando konfiguriert wiederum zunächst den Druckeranschluss (»/dev/ttyUSB0«). Der erste »convert«-Befehl wandelt die PNG-Datei ins PDF-Format um, der zweite in Zeile 3 konvertiert ins Druckerformat 203,2  dpi und fügt eine waagerechte Linie sowie den Text »- ZERBRECHLICH -« in einer neuen Zeile ein. Das Ergebnis landet in der Datei »shiplabelo.png«, die das Python-Skript verarbeitet, das der Wrapper dann an den Drucker sendet.

Was bleibt

Kommt ein anderer Thermodrucker zum Einsatz, passen Anwender die Skripte gegebenenfalls an. Manchmal verhalten sich Geräte mit ESC/P-Sprache etwas anders, als der Standard es vorsieht. So kann es beispielsweise erforderlich sein, die Zeilenschubbefehle auszukommentieren.

Am zentralen Konvertierungsteil des Python-Skripts selbst ist normalerweise nichts zu ändern. Es enthält auch einen Befehl, der die konvertierte Grafik in der Datei »result.png« speichert (Zeile 61). Die ist zwar spiegelverkehrt und um 90 Grad gedreht, kann aber dennoch zur Kontrolle dienen. Abbildung 4 zeigt ein fertiges DHL-Versandetikett.

Abbildung 4: So sieht das fertige DHL-Versand-etikett aus, wie es aus dem Drucker kommt.

Abbildung 4: So sieht das fertige DHL-Versand-etikett aus, wie es aus dem Drucker kommt.

Der Autor

Gottfried ist mit der Schwebebahn aufgewachsen. Daher schwebt er als Pilot gern mit dem Flugzeug über den USA und Europa. Seine Schwerpunkte sind BWL, Management, Aviation, Banking, IT, SAP, Engineering in Elektronik, 3-D-Druck und Design. Er lebt in Texas, hat aber noch einen Koffer in Berlin.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben