Dieses Projekt implementiert eine Teilmenge des ESC/POS-Protokolls von Epson für Thermo-Belegdrucker. Damit können Sie Belege mit grundlegender Formatierung, Schnitt und Barcodes auf einem kompatiblen Drucker erstellen und drucken.
Die Bibliothek wurde entwickelt, um jeder PHP-App, einschließlich webbasierten Point-of-Sale-Anwendungen (POS), Drop-in-Unterstützung für den Belegdruck hinzuzufügen.
Es ist bekannt, dass dieser Treiber mit den folgenden Betriebssystem-/Schnittstellenkombinationen funktioniert:
Linux | Mac | Windows | |
---|---|---|---|
Ethernet | Ja | Ja | Ja |
USB | Ja | Nicht getestet | Ja |
USB-seriell | Ja | Ja | Ja |
Seriell | Ja | Ja | Ja |
Parallel | Ja | Nicht getestet | Ja |
SMB geteilt | Ja | NEIN | Ja |
CUPS veranstaltet | Ja | Ja | NEIN |
Viele Thermobondrucker unterstützen ESC/POS bis zu einem gewissen Grad. Es ist bekannt, dass dieser Treiber funktioniert mit:
feedForm()
zum Freigeben von Papier).release()
um den Slip freizugeben).Wenn Sie einen anderen Drucker mit diesem Code verwenden, teilen Sie uns dies bitte mit, damit dieser zur Liste hinzugefügt werden kann.
Diese Bibliothek ist für die Verwendung mit dem composer
PHP-Abhängigkeitsmanager konzipiert. Fügen Sie einfach das Paket mike42/escpos-php
hinzu, um loszulegen:
composer require mike42/escpos-php
Wenn Sie composer
noch nie verwendet haben, können Sie es auf getcomposer.org nachlesen.
Dieses Projekt weist einige harte Abhängigkeiten auf:
json
Erweiterung, die zum Laden gebündelter Druckerdefinitionen verwendet wird (siehe Dokumentation)intl
Erweiterung, wird für die Zeichenkodierung verwendet (siehe Dokumentation)zlib
Erweiterung, die zum Dekomprimieren gebündelter Ressourcen verwendet wird (siehe Dokumentation). Es wird außerdem empfohlen, entweder imagick
oder gd
zu installieren, da diese zur Beschleunigung der Bildverarbeitung verwendet werden können.
Eine Reihe optionaler Erweiterungen können hinzugefügt werden, um spezifischere Funktionen zu ermöglichen. Diese werden im Abschnitt „suggest“ von Composer.json beschrieben.
Um diesen Treiber nutzen zu können, muss Ihr Server (auf dem PHP installiert ist) mit Ihrem Drucker kommunizieren können. Erstellen Sie zunächst einen einfachen Beleg und senden Sie ihn über die Befehlszeile an Ihren Drucker.
<?php
/* Call this file 'hello-world.php' */
require __DIR__ . ' /vendor/autoload.php ' ;
use Mike42 Escpos PrintConnectors FilePrintConnector ;
use Mike42 Escpos Printer ;
$ connector = new FilePrintConnector ( " php://stdout " );
$ printer = new Printer ( $ connector );
$ printer -> text ( " Hello World! n" );
$ printer -> cut ();
$ printer -> close ();
Nachfolgend finden Sie einige Beispiele für gängige Schnittstellen.
Kommunizieren Sie mit netcat
mit einem Drucker mit Ethernet-Schnittstelle:
php hello-world.php | nc 10.x.x.x. 9100
Ein mit usblp
unter Linux verbundener lokaler USB-Drucker verfügt über eine Gerätedatei (einschließlich USB-paralleler Schnittstellen):
php hello-world.php > /dev/usb/lp0
Auf einen Computer, der auf dem lokalen cups
Server installiert ist, wird über lp
oder lpr
zugegriffen:
php hello-world.php > foo.txt
lpr -o raw -H localhost -P printer foo.txt
Ein lokaler oder Netzwerkdrucker auf einem Windows-Computer wird einer Datei zugeordnet und erfordert im Allgemeinen, dass Sie den Drucker zuerst freigeben:
php hello-world.php > foo.txt
net use LPT1 \serverprinter
copy foo.txt LPT1
del foo.txt
Wenn an dieser Stelle Probleme auftreten, sollten Sie in der Dokumentation Ihres Betriebssystems und Druckersystems nach einem funktionierenden Druckbefehl suchen.
Um Belege aus PHP zu drucken, verwenden Sie den für Ihr Setup am besten geeigneten PrintConnector. Der Anschluss dient lediglich als Leitung für die Übertragung der Daten an den Drucker.
Ein NetworkPrintConnector
akzeptiert beispielsweise eine IP-Adresse und einen Port:
use Mike42 Escpos PrintConnectors NetworkPrintConnector ;
use Mike42 Escpos Printer ;
$ connector = new NetworkPrintConnector ( " 10.x.x.x " , 9100 );
$ printer = new Printer ( $ connector );
try {
// ... Print stuff
} finally {
$ printer -> close ();
}
Während ein serieller Drucker Folgendes verwenden könnte:
use Mike42 Escpos PrintConnectors FilePrintConnector ;
use Mike42 Escpos Printer ;
$ connector = new FilePrintConnector ( " /dev/ttyS0 " );
$ printer = new Printer ( $ connector );
Für jede unterstützte Betriebssystem-/Schnittstellenkombination gibt es im Kompatibilitätsabschnitt Beispiele dafür, wie ein PrintConnector
aufgebaut wäre. Wenn Sie einen PrintConnector
nicht zum Laufen bringen können, stellen Sie sicher, dass Sie den funktionierenden Druckbefehl in Ihr Problem aufnehmen.
Die Unterstützung für Befehle und Codepages variiert je nach Druckerhersteller und -modell. Standardmäßig akzeptiert der Treiber UTF-8 und gibt Befehle aus, die für Drucker der Epson TM-Serie geeignet sind.
Wenn Sie eine neue Druckermarke ausprobieren, ist es eine gute Idee, das „einfache“ CapabilityProfile
zu verwenden, das den Treiber anweist, die Verwendung erweiterter Funktionen zu vermeiden (im Allgemeinen einfachere Bildverarbeitung, nur ASCII-Text).
use Mike42 Escpos PrintConnectors WindowsPrintConnector ;
use Mike42 Escpos CapabilityProfile ;
$ profile = CapabilityProfile:: load ( " simple " );
$ connector = new WindowsPrintConnector ( " smb://computer/printer " );
$ printer = new Printer ( $ connector , $ profile );
Als weiteres Beispiel verwenden Drucker der Marke Star unterschiedliche Befehle:
use Mike42 Escpos PrintConnectors WindowsPrintConnector ;
use Mike42 Escpos CapabilityProfile ;
$ profile = CapabilityProfile:: load ( " SP2000 " )
$ connector = new WindowsPrintConnector ( " smb://computer/printer " );
$ printer = new Printer ( $ connector , $ profile );
Eine Liste der verfügbaren Profile oder eine verbesserte Unterstützung für Ihren Drucker finden Sie im Upstream-Projekt „receive-print-hq/escpos-printer-db“.
Unter Linux befindet sich Ihre Druckergerätedatei an einem Ort wie /dev/lp0
(parallel), /dev/usb/lp1
(USB), /dev/ttyUSB0
(USB-Seriell), /dev/ttyS0
(seriell).
Unter Windows liegen die Gerätedateien in der Form LPT1
(parallel) oder COM1
(seriell) vor. Verwenden Sie den WindowsPrintConnector
, um auf das Systemdrucken unter Windows zuzugreifen (z. B. Windows USB, SMB oder Windows LPT). Dadurch werden Druckaufträge über eine Warteschlange übermittelt, anstatt direkt mit dem Drucker zu kommunizieren.
Eine vollständige, reale Quittung finden Sie im Code von Auth in ReceiptPrinter.php. Es umfasst Ausrichtung, Fettschrift und einen Barcode.
Weitere Beispiele befinden sich im Verzeichnis example/.
Neues Druckobjekt erstellen.
Parameter:
PrintConnector $connector
: Der PrintConnector, an den Daten gesendet werden sollen.CapabilityProfile $profile
Unterstützte Funktionen dieses Druckers. Wenn nicht festgelegt, wird das „Standard“-CapabilityProfile verwendet, das für Epson-Drucker geeignet ist.Unter example/interface/ finden Sie Möglichkeiten zum Öffnen von Verbindungen für verschiedene Plattformen und Schnittstellen.
Drucken Sie einen Barcode.
Parameter:
string $content
: Die zu kodierenden Informationen.int $type
: Der auszugebende Barcode-Standard. Wenn nicht angegeben, wird Printer::BARCODE_CODE39
verwendet.Derzeit unterstützte Barcode-Standards sind (abhängig von Ihrem Drucker):
BARCODE_UPCA
BARCODE_UPCE
BARCODE_JAN13
BARCODE_JAN8
BARCODE_CODE39
BARCODE_ITF
BARCODE_CODABAR
Beachten Sie, dass einige Barcode-Standards nur Zahlen kodieren können. Der Versuch, damit nicht-numerische Codes zu drucken, kann daher zu seltsamem Verhalten führen.
Siehe Grafiken() unten.
Schneiden Sie das Papier.
Parameter:
int $mode
: Schnittmodus, entweder Printer::CUT_FULL
oder Printer::CUT_PARTIAL
. Wenn nicht angegeben, wird Printer::CUT_FULL
verwendet.int $lines
: Anzahl der Zeilen, die vor dem Schneiden vorgeschoben werden sollen. Wenn nicht angegeben, wird 3 verwendet.Zeile drucken und vorschieben / n Zeilen drucken und vorschieben.
Parameter:
int $lines
: Anzahl der zu fütternden ZeilenEinige Drucker benötigen einen Seitenvorschub, um das Papier freizugeben. Bei den meisten Druckern ist dieser Befehl nur im Seitenmodus sinnvoll, der in diesem Treiber nicht implementiert ist.
n Zeilen drucken und rückwärts vorschieben.
Parameter:
int $lines
: Anzahl der zu fütternden Zeilen. Wenn nicht angegeben, wird 1 Zeile gespeist.Drucken Sie ein Bild auf dem Drucker.
Parameter:
EscposImage $img
: Das zu druckende Bild.int $size
: Ausgabegrößenmodifikator für das Bild.Größenmodifikatoren sind:
IMG_DEFAULT
(Bild in Originalgröße belassen)IMG_DOUBLE_WIDTH
IMG_DOUBLE_HEIGHT
Ein Minimalbeispiel:
<?php
$ img = EscposImage:: load ( " logo.png " );
$ printer -> graphics ( $ img );
Ausführliche Beispiele finden Sie im Ordner example/.
Die Funktion bitImage() verwendet dieselben Parameter und kann verwendet werden, wenn Ihr Drucker die neueren Grafikbefehle nicht unterstützt. Als zusätzlicher Fallback steht auch die Funktion bitImageColumnFormat()
zur Verfügung.
Drucker initialisieren. Dadurch wird die Formatierung auf die Standardeinstellungen zurückgesetzt.
Drucken Sie einen zweidimensionalen Datencode mithilfe des PDF417-Standards.
Parameter:
string $content
: Text oder Zahlen, die im Code gespeichert werden sollennumber $width
: Breite eines Moduls (Pixel) im gedruckten Code. Der Standardwert ist 3 Punkte.number $heightMultiplier
: Multiplikator für die Höhe eines Moduls. Der Standardwert ist das Dreifache der Breite.number $dataColumnCount
: Anzahl der zu verwendenden Datenspalten. 0 (Standard) dient zur automatischen Berechnung. Kleinere Zahlen führen zu einem schmaleren Code, wodurch größere Pixelgrößen möglich werden. Größere Zahlen erfordern kleinere Pixelgrößen.real $ec
: Fehlerkorrekturverhältnis, von 0,01 bis 4,00. Der Standardwert ist 0,10 (10 %).number $options
: Standardcode Printer::PDF417_STANDARD
mit Start-/Endbalken oder abgeschnittener Code Printer::PDF417_TRUNCATED
nur mit Startbalken.Erzeugen Sie einen Impuls, um eine Kassenschublade zu öffnen, sofern eine solche angeschlossen ist. Die Standardeinstellungen (0, 120, 240) sollten eine Epson-Schublade öffnen.
Parameter:
int $pin
: 0 oder 1, für Pin 2 bzw. Pin 5 Kick-out-Anschluss.int $on_ms
: Impuls-EIN-Zeit in Millisekunden.int $off_ms
: Impuls-AUS-Zeit in Millisekunden.Drucken Sie die angegebenen Daten als QR-Code auf dem Drucker aus.
string $content
: Der Inhalt des Codes. Numerische Daten werden effizienter komprimiert.int $ec
Zu verwendende Fehlerkorrekturstufe. Einer von Printer::QR_ECLEVEL_L
(Standard), Printer::QR_ECLEVEL_M
, Printer::QR_ECLEVEL_Q
oder Printer::QR_ECLEVEL_H
. Eine höhere Fehlerkorrektur führt zu einem weniger kompakten Code.int $size
: Zu verwendende Pixelgröße. Muss 1-16 sein (Standard 3)int $model
: Zu verwendendes QR-Code-Modell. Muss einer von Printer::QR_MODEL_1
, Printer::QR_MODEL_2
(Standard) oder Printer::QR_MICRO
(nicht von allen Druckern unterstützt) sein.Druckmodus(e) auswählen.
Parameter:
int $mode
: Der zu verwendende Modus. Der Standardwert ist Printer::MODE_FONT_A
ohne spezielle Formatierung. Dies hat einen ähnlichen Effekt wie das Ausführen von initialize()
. Mehrere MODE_*-Konstanten können durch ODER-Verknüpfung an das $mode
Argument dieser Funktion übergeben werden. Die gültigen Modi sind:
MODE_FONT_A
MODE_FONT_B
MODE_EMPHASIZED
MODE_DOUBLE_HEIGHT
MODE_DOUBLE_WIDTH
MODE_UNDERLINE
Stellen Sie die Barcode-Höhe ein.
Parameter:
int $height
: Höhe in Punkten. Wenn nicht angegeben, wird 8 verwendet.Legen Sie die Breite des Barcode-Strichs fest.
Parameter:
int $width
: Balkenbreite in Punkten. Wenn nicht angegeben, wird 3 verwendet. Werte über 6 scheinen keine Wirkung zu haben.Wählen Sie die Druckfarbe – auf Druckern, die mehrere Farben unterstützen.
Parameter:
int $color
: Zu verwendende Farbe. Muss entweder Printer::COLOR_1
(Standard) oder Printer::COLOR_2
seinSchalten Sie den Double-Strike-Modus ein/aus.
Parameter:
boolean $on
: wahr für Doppelschlag, falsch für keinen Doppelschlag.Schalten Sie den hervorgehobenen Modus ein/aus.
Parameter:
boolean $on
: true für Hervorhebung, false für keine Hervorhebung.Schriftart auswählen. Die meisten Drucker verfügen über zwei Schriftarten (Schriftarten A und B) und einige über eine dritte (Schriftart C).
Parameter:
int $font
: Die zu verwendende Schriftart. Muss entweder Printer::FONT_A
, Printer::FONT_B
oder Printer::FONT_C
sein.Begründung auswählen.
Parameter:
int $justification
: Einer von Printer::JUSTIFY_LEFT
, Printer::JUSTIFY_CENTER
oder Printer::JUSTIFY_RIGHT
.Legen Sie die Höhe der Linie fest.
Bei einigen Druckern können Sie Zeilen mit einem kleineren Zeilenvorschub überlappen.
Parameter:
int $height
: Die Höhe jeder Zeile in Punkten. Wenn diese Option nicht festgelegt ist, wird der Drucker auf den Standardzeilenabstand zurückgesetzt. Legen Sie den linken Rand des Druckbereichs fest. Mit Printer::initialize()
auf die Standardeinstellungen zurücksetzen.
Parameter:
int $margin
: Der linke Rand, der im Druckbereich festgelegt werden soll, in Punkten. Legen Sie die Breite des Druckbereichs fest. Damit kann dem Druckbereich ein rechter Rand hinzugefügt werden. Mit Printer::initialize()
auf die Standardeinstellungen zurücksetzen.
Parameter:
int $width
: Die Breite des Seitendruckbereichs in Punkten.Aktivieren oder deaktivieren Sie den Schwarz/Weiß-Umkehrmodus. In diesem Modus wird Text weiß auf schwarzem Hintergrund gedruckt.
Parameter:
boolean $on
: True zum Aktivieren, false zum Deaktivieren.Legen Sie die Textgröße als Vielfaches der normalen Größe fest.
Parameter:
int $widthMultiplier
: Vielfaches der zu verwendenden regulären Höhe (Bereich 1–8).int $heightMultiplier
: Vielfaches der zu verwendenden regulären Höhe (Bereich 1–8).Unterstreichung für gedruckten Text festlegen.
Parameter:
int $underline
: Entweder true
/ false
oder einer von Printer::UNDERLINE_NONE
, Printer::UNDERLINE_SINGLE
oder Printer::UNDERLINE_DOUBLE
. Der Standardwert ist Printer::UNDERLINE_SINGLE
. Fügen Sie dem Puffer Text hinzu. Auf den Text sollte entweder ein Zeilenumbruch folgen oder danach feed()
aufgerufen werden.
Parameter:
string $str
: Die zu druckende Zeichenfolge.Beiträge, die ich für Leute geschrieben habe, die den Umgang mit Belegdruckern erlernen:
example/demo.php
dokumentiert.Dieser Code ist MIT-lizenziert und Sie werden aufgefordert, etwaige Änderungen zum Projekt beizutragen.
Für die Entwicklung wird empfohlen, die PHP-Erweiterungen imagick
, gd
und Xdebug
zu laden.
Die Tests werden auf Travis CI über PHP 7.3, 7.4 und 8.0 ausgeführt. Ältere Versionen von PHP werden in der aktuellen Version nicht unterstützt, ebenso wenig wie HHVM.
Rufen Sie eine Kopie dieses Codes ab und laden Sie Abhängigkeiten mit Composer:
git clone https://github.com/mike42/escpos-php
cd escpos-php/
composer install
Unit-Tests über phpunit
ausführen:
php vendor/bin/phpunit --coverage-text
Dieses Projekt verwendet den PSR-2-Standard, der über PHP_CodeSniffer überprüft werden kann:
php vendor/bin/phpcs --standard=psr2 src/ -n
Die Entwicklerdokumente werden mit Doxygen erstellt. Erstellen Sie sie neu, um nach Dokumentationswarnungen zu suchen:
make -C doc clean && make -C doc
Pull-Requests und Fehlerberichte sind willkommen.