Off Topic

Bondrucker TM 88 mit PHP die zweite

19 Feb , 2009  

Vor einer Weile hatte ich meine Erfahrungen mit der Ansteuerung eines Bondruckers EPSON TM 88 mit PHP aus einer Webanwendung beschrieben.  Rund um den Artikel ist doch eine ordentliche Diskussion entstanden und ich konnte noch einige Details klären, die ich hier gern weiter geben möchte.

Der EPSON TM 88 hat diverse Zeichensätze. Alle werden über den jeweils am Drucker eingestellten Zeichensatz angesprochen. Der ASCII Zeichensatz kann dabei bis zu 255 Zeichen enthalten. Leider entsprechen diese Zeichen nicht automatisch dem Unicode Zeichensatz des PCs.

Mit folgendem Beispielprogramm kann man sich einfach einen kompletten Zeichensatz drucken lassen und dann seine Sonderzeichen im PHP Programm „einfach“ kodieren:

<?php
// FSc Bondrucker Test
 
header("Content-type: application/vnd.print");  // http://www.iana.org/assignments/media-types/text/
header("Content-disposition: inline; filename=bon_to_printer.prser");
header("Pragma: no-cache");
header("Expires: 0");
 
echo chr(27) . "@"; 			   //Initializes the printer (ESC @)
echo chr(27) . "a" . chr(1);	//Specifies a centered printing position (ESC a)
echo "TM 88 Printer Test" . chr(10) ;
echo chr(27) . "a" . chr(0); 	//Selects the left print position (ESC a)
 
// ******************************************
 
echo chr(27) . "!" . chr(0); 	//Specifies font A (ESC !)
echo chr(27) . "t" . chr(0); //Specifies character code table 0 = Standart Europa
echo "Font A " . chr(10) ;
echo "Character code table = 0 " . chr(10) ;
echo "ASCII 30: " ;
$i = 0;
for ($n=30; $n<255; $n++ )
	{
	echo chr($n);
	$i++;
	if ($i==11)
		{
		echo chr(10) ;
		echo "ASCII " . $n . ":";
		$i = 0;
		}
	}	
 
echo chr(27) . "d" . chr(2);  //Prints and 2 line feeding (ESC d)
echo chr(29) . "V" . chr(66) . chr(0); 	//Feeds paper & cut ’Drawer Kick (ESC p)
echo chr(27) .  chr(112) . chr(0) . chr(60) . chr(120);  
 
?>

Wie so eine Umkonvertierung von Sonderzeichen aussehen kann zeigt das nächste Beispiel. Über eine Funktion werden dabei die deutschen Umlaute im Fließtext duch die entsprechenden ASCII Codes für den richtigen Druck ersetzt. Leider habe ich bei dem TM 88 kein € Zeichen gefunden. Da bleibt es wohl nur den üblichen ANSI Code „EUR“ für Bondrucke zu nehmen…

<?php
// FSc Bondrucker Test
 
// Umlaute passend Für den ASCII Zeichensatz
// Konvertieren
function uml($text) 
{
	$rw=$text;
	$rw=str_replace("Ä",chr(142),$rw);
	$rw=str_replace("Ö",chr(153),$rw);
	$rw=str_replace("Ü",chr(154),$rw);
	$rw=str_replace("ä",chr(132),$rw);
	$rw=str_replace("ö",chr(148),$rw);
	$rw=str_replace("ü",chr(129),$rw);
	$rw=str_replace("ß",chr(225),$rw);
	return $rw;
}
 
header("Content-type: application/vnd.print");  // http://www.iana.org/assignments/media-types/text/
header("Content-disposition: inline; filename=bon_to_printer.prser");
header("Pragma: no-cache");
header("Expires: 0");
 
echo chr(27) . "@"; 			   //Initializes the printer (ESC @)
echo chr(27) . "a" . chr(1);	//Specifies a centered printing position (ESC a)
echo "TM 88 Printer Test" . chr(10) ;
echo chr(27) . "a" . chr(0); 	//Selects the left print position (ESC a)
echo chr(27) . "!" . chr(0); 	//Specifies font A (ESC !)
echo chr(27) . "t" . chr(0); //Specifies character code table 0 = Standart Europa
echo "Font A " . chr(10) ;
 
echo "Umlaut Test " . chr(10) ;
 
$teststring = " Umlaute Ä Ö Ü ä ö ü ß";
echo uml($teststring) . chr(10) ;
 
echo chr(27) . "d" . chr(3);  //Prints and 3 line feeding (ESC d)
echo chr(29) . "V" . chr(66) . chr(0); 	//Feeds paper & cut ’Drawer Kick (ESC p)
echo chr(27) .  chr(112) . chr(0) . chr(60) . chr(120);  
 
?>

Natürlich braucht man für einen ordentlichen Bondrucker auch Barcodes. Sei es, um dem Kassenbon einen Bon-Code für eine schnelle Abwicklung von Rückgaben zu geben, oder um z.B. Gutscheine oder Rabattcodes als Kundenbindung mit dem Kassenbon auszudrucken.

Im Beispiel 3 drucke ich einen 13 Stelligen EAN Code für die geniale CD 3 Doors Down – The Better Life , so wie er üblicherweise auf den meisten Produkten vor kommt. Wichtig ist dabei, alle EAN Codes aus der Datenbank auf Ihre Länge zu prüfen. Sollten die z.B. nur 12 Zeichen lang sein, muss man unbedingt den EAN13 Code mit einer führenden 0 (NULL) auffüllen, damit der Druck und das spätere Scannen funktioniert.

<?php
// FSc Bondrucker Test
 
header("Content-type: application/vnd.print");  // http://www.iana.org/assignments/media-types/text/
header("Content-disposition: inline; filename=bon_to_printer.prser");
header("Pragma: no-cache");
header("Expires: 0");
 
echo chr(27) . "@"; 			   //Initializes the printer (ESC @)
echo chr(27) . "a" . chr(1);	//Specifies a centered printing position (ESC a)
echo "TM 88 Printer Test" . chr(10) ;
echo chr(27) . "a" . chr(0); 	//Selects the left print position (ESC a)
 
// ******************************************
 
echo chr(27) . "!" . chr(0); 	//Specifies font A (ESC !)
echo chr(27) . "t" . chr(0); //Specifies character code table 0 = Standart Europa
 
echo "Barcode Test" . chr(10) ;
echo chr(29) . "h" . chr(50); //Select bar code height - with 50 dots height
echo chr(29) . "k" . chr(2) . "0601215392029" . chr(0); 	//print bar code height
						//	chr(2) = EAN13
						//	"601215392029" EAN Code 3 Doors Down - the better life
						// chr(0) = Befehl Ende
 
echo chr(27) . "d" . chr(2);  //Prints and 2 line feeding (ESC d)
echo chr(29) . "V" . chr(66) . chr(0); 	//Feeds paper & cut ’Drawer Kick (ESC p)
echo chr(27) .  chr(112) . chr(0) . chr(60) . chr(120);  
 
?>

 

Eine Diskussion gab es auch, ob der  „Content-type“ application/vnd.ms-excel richtig ist. Bei einem Rechner funktionierte es gut, beim nächsten nicht. Ebenfalls wurde hier ohne nachfragen gedruckt, bei einem anderen PC bekam ich immer den Öffnen / Speichern Dialog. Wirklich geholfen hat letztendlich den „Content-type“ auf den selbst ausgedachten Typ application/vnd.print zu stellen und als „Content-disposition“: inline zu wählen.

Ich hoffe das hilft weiter..  und bei Fragen einfach fragen…

Und damit das Copy und Paste nicht so umständlich wird habe ich die PHP Beispiele und das ESC/POS Manual für die Druckerbefehle hier noch mal als ZIP zum Download verknüpft.

, , , , , ,


60 Responses

  1. Mario sagt:

    Hallo,
    ich mal wieder.
    Nachdem bisher alles super gelaufen ist, muss ich nun einen neuen PC mit Win7 und IE9 auf das Kassensystem einrichten und finde hier gar nichts mehr wie die Anpassungen vorzunehmen sind.

    Im Windows Explorer die .prser Datei einbinden und im IE die automatische Eingabeaufforderung aktivieren

    Nicht ist mehr wie es war 🙁

    Zu allem Überfluss ist hier ein paralleler Drucker vorhanden und der PC hat keinen parallelen Anschluss mehr. Ich kann zwar ein USB -> parallel Kabel anschliessen aber dann habe ich einen USB002 Anschluss, und keinen LPT oder COM. Geht das auch?

    Kann mir hier jemand weiter helfen?

    Vielen lieben Dank
    Mario

  2. Folker sagt:

    Hallo,

    unter WIN7 und IE9 geht es auch. Ich habe das schon mal konfiguriert. Unter den Internetoptionen im Browser muss man im Tab Sicherheit/Internet auf Erweitert klicken und dann die passenden Einstellungen aktivieren und zulassen.

    Das mach das browsen mit dem Kassen PC nicht sicherer, aber damit soll man ja auch Geld verdienen und nicht auch schrägen Seiten rumsurfen.

    Schwieriger ist da schon die parallele Druckerschnittstelle. Im Prinzip könnte man auch eine parallel schnittstelle per PCI Karte hinzu fügen und dann im Skript den LPT ansprechen.
    Ich bin mir nur nicht Sicher, ob dann auch das Druckdatenformat das selbe ist, da es da teilweise andere Druckersprachen gibt mit anderen Steuerzeichen.

    Bei den USB auf COM Adaptern muss man meist einen Treiber installieren, der einen virtuellen COM Port erzeugt das kann dann mal auch COM51 sein, und man muss sich dann die genaue COM Adresse im Gerätemanager auslesen. Ob es auch virtuelle LPT ports gibt weiss ich nicht…

    viel Erfolg 😉

  3. Mario sagt:

    Hallo Folker,
    vielen Dank für die rasche Antwort.
    Lassen wir das mit dem Drucker vorerst – ev. verkaufe ich ihnen einen neuen.

    Im IE9 habe ich in den Internetoptionen unter Sicherheit zwar auch schon gesucht, aber unter Download nur 2 Optionen vorgefunden -> Dateidownload aktivieren und deaktivieren bzw. Schriftartdownload aktivieren und deaktivieren. Die Option „Automatische Eingabeaufforderung für Downloads aktivieren“ fehlt hier. Ist die versteckt??

    Im Windows Explorer fehlt unter Ansicht -> Ordneroptionen auch der Punkt Dateitypen – die Funktion wurde hoffentlich in WIN7 nicht komplett entfernt

    lg Mario

  4. Folker sagt:

    ..ich denke es war unter Verschiednes, „Anwendungen und …. starten“.

  5. Mario sagt:

    So, für alle, die es brauchen können:
    Das Problem mit dem USB->parallel Drucker habe ich folgendermaßen über einen Umweg gelöst:

    1. Drucker freigeben als z.B. bondrucker
    2. habe eine kleine druckersetup.bat Datei geschrieben und in Autostart geschoben:
    net use lpt1 \\meinpc\bondrucker
    3. print.bat entsprechend anpassen:
    MODE LPT1
    copy %1 LPT1

    Sollte wahrscheinlich auch mit direktem USB Anschluss des Druckers funktionieren.

    Zusatznutzen:
    Damit lässt sich auch im Netzwerk von jedem PC aus auf diesem Bondrucker ausdrucken

    Hoffe, ich konnte manchem damit helfen
    lg Mario

  6. Sebastian sagt:

    Hallo,
    ich habe mich nun die letzten Tage sehr intensiv mit meinem Epson TM-T88IV (Seriell, angeschlossen mit USB auf Seriell-Adapter) auseinander gesetzt. Alles was hier beschrieben wurde funktioniert einwandfrei! Dafür mal ein großes Lob!!!
    Nun habe ich aber dennoch einige kleinere Probleme.

    1) Ich habe noch einen Epson TM-T88IV (Parallel, angeschlossen mit USB auf Parallel-Adapter) hier. Ich bekomme es einfach nicht hin, diesen über den Adapter anzusprechen. Leider steht in der Gerätebeschreibung des Adapters („Drucker und Geräte“ -> „IEEE[..]-Adapter“) kein LPT Anschluss o.ä. Bei der Seriellen Schnittstelle wird „Com3“ angezeigt. Hat da jemand eine Idee was man machen kann?

    2) Ich habe in den Drucker ein Logo von mir geladen. Mit dem Programm von Epson kann ich das Logo auch ausdrucken lassen. Das funktioniert ebenfalls wenn ich den Drucker richtig als „Drucker“ über die Epson-Treiber installiere und unter Einstellungen das Logo in der Kopfzeile jedes Bons einstelle. Dann jedoch kann ich den Drucker nicht mehr über den COM3-Port ansprechen, da dieser anscheinend durch den Druckertreiber belegt wird. Was ich suche ist ein Befehl mit dem ich das Logo über das PHP-Skript ausdrucken lassen kann. Meine bisherigen Suchen im Internet und den ganzen Manuals waren leider nicht erfolgreich. Die ganzen Befehle brachten kein Logo zum vorschein.

    3) Ein Freund von mir hat einige Bondrucker unterschiedlichster Marken. Ihm ist es möglich mit einer Schrift zu drucken die nicht im Drucker installiert wird. Das funktioniert bei ihm über selbstgeschriebenes Visual Basic Skript. Der Ausdruck erfolgt zwar extrem langsam, aber zumindest funktioniert das. Hat jemand damit schonmal etwas gemacht und kennt ESC/POS Befehle dazu?

    4) Links/Mitte/Rechtsbündig funktioniert so wie ich das sehe nur für ganze Zeilen. Ich würde gerne eine „Box“ über die komplette Breite des Bons erstellen in der dann Schrift mittig platziert ist. Ich könnte das ganze lösen indem ich die anzahl der Zeichen pro Zeile ausrechne davon die Länge des Textes abziehe und noch einmal zwei Zeichen subtrahiere die die Ränder links und rechts darstellen. Das Ergebnis durch 2 dividiert wären dann die Leerzeichen die links und rechts vom Text stehen müssen, damit ganz am Rand links sowie rechts der Strich der Box zu sehen ist und der Text mittig darin platziert wird. Gibt es denn noch eine schönere/saubere Lösung?

    Liebe Grüße
    Sebastian

  7. Sebastian sagt:

    Ich habe Problem 1) gelöst.
    Dank Mario habe ich es noch einmal ausprobiert.

    Die Lösung: Ich habe einen Adapter USB auf Parallel am PC angeschlossen. Danach muss die Treiber Software von Epson heruntergeladen und installiert werden. Es muss dort ein Drucker eingerichtet werden, unter „Create Port“ kann man sich eine Option aussuchen, das sollte egal sein. Wenn der Drucker dann installiert ist geht man (Win 8) auf „Geräte und Drucker“ und macht einen Rechtsklick auf den installierten Drucker (In meinem Fall Epson TM-T88IV). Dort auf Druckereigenschaften -> Anschlüsse. An dieser Stelle muss der Anschluss „USB001“ „Virtueller Drucker-Port für USB“ ausgewählt werden!
    Damit kann man nun theoretisch über die ganz normale „Drucken“-Masken von Windows den Bondrucker benutzen.
    Um jetzt aber den Drucker mit einer Batch-Datei anzusprechen muss der Drucker ja über einen LPT, also Parallel-Port angesprochen werden. Aktuell wäre der Drucker aber als USB-Drucker angeschlossen (wenn ich das alles richtig verstanden habe). Daher muss nun noch der Anleitung von Mario gefolgt werden und siehe da, es funktioniert 🙂

  8. Sebastian sagt:

    Das scheint ein wirklich guter Tag zu werden. Auch Problem 2 ist gelöst!

    http://www.delfi.com/SupportDL/Epson/Manuals/TM-T88IV/Programming%20manual%20APG_1005_receipt.pdf

    Dort ist eine komplette Liste aller Befehle zu finden. Geholfen hat mir nun der Befehl:
    GS ( L p L p H m fn kc1 kc2 x y

    In PHP mit Keys 48/48 (zu finden im Epson Flash Logo Programm):
    echo chr(29).chr(40).chr(76).chr(6).chr(0).chr(48).chr(69).chr(48).chr(48).chr(1).chr(1);

    Liebe Grüße
    Sebastian

  9. Mario sagt:

    Hallo liebe PHP Programmierer,
    was bisher gut lief, macht mit neuen Versionen von Windows und IE nur Probleme.

    1. WINDOWS 7 Professional: Hier fehlt plötzlich die bekannte Möglichkeit, neue Dateitypen, wie hier schon beschrieben, anzulegen (.prser)

    Lösung: ExtMan.exe – hier fehlen zwar ein paar Einstellungsoptionen – funktioniert aber trotzdem

    Falls man mal einen Fehler bei der Zuordnung gemacht hat: mit dem kleinen Programm unassoc.exe kriegt man die wieder gelöscht

    2. IE10: Ich finde die richtigen Einstellungen bei Sicherheit nicht, damit die .prser Datei nicht jedes Mal nachgefragt wird, ob ich sie öffnen will

    Lösung: habe ich noch keine

    Vielleicht weiss schon jemand, wie man das wieder hinbekommt!

    Vielen Dank für jede Hilfe
    LG Mario

  10. konsolenfreddy sagt:

    Die Diskussion ist zwar nicht mehr ganz aktuell, vielleicht hilft aber jemandem noch diese wunderbare PHP Klasse um esc/pos Drucker anzusteuern: https://github.com/mike42/escpos-php

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.