此專案為熱敏收據印表機實現了 Epson ESC/POS 協定的子集。它允許您在相容印表機上產生和列印具有基本格式、剪切和條碼的收據。
該程式庫的開發目的是為任何 PHP 應用程式(包括基於 Web 的銷售點 (POS) 應用程式)添加對收據列印的直接支援。
此驅動程式已知可與下列作業系統/介面組合搭配使用:
Linux | 蘋果 | 視窗 | |
---|---|---|---|
乙太網路 | 是的 | 是的 | 是的 |
USB | 是的 | 未測試 | 是的 |
USB串口 | 是的 | 是的 | 是的 |
序列 | 是的 | 是的 | 是的 |
平行線 | 是的 | 未測試 | 是的 |
中小企業共享 | 是的 | 不 | 是的 |
CUPS 主機代管 | 是的 | 是的 | 不 |
許多熱敏收據印表機在一定程度上支援 ESC/POS。眾所周知,該驅動程式可用於:
feedForm()
來釋放紙張)。release()
來釋放滑動)。如果您使用帶有此代碼的任何其他印表機,請告知我們,以便將其新增至清單。
此程式庫設計用於與composer
PHP 依賴管理器一起使用。只需添加mike42/escpos-php
包即可開始:
composer require mike42/escpos-php
如果您以前沒有使用過composer
,您可以在 getcomposer.org 上閱讀有關它的資訊。
該項目幾乎沒有硬依賴項:
json
副檔名,用於載入捆綁的印表機定義(請參閱文件)intl
擴展名,用於字元編碼(請參閱文件)zlib
擴展,用於解壓縮捆綁資源(請參閱文件)。也建議您安裝imagick
或gd
,因為它們可用於加快影像處理速度。
可以添加許多可選擴充功能以啟用更多特定功能。這些在composer.json 的“建議”部分中進行了描述。
要使用此驅動程序,您的伺服器(安裝了 PHP)必須能夠與您的印表機通訊。首先產生一個簡單的收據並使用命令列將其發送到您的印表機。
<?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 ();
下面是一些常見介面的範例。
使用netcat
與具有乙太網路介面的印表機進行通訊:
php hello-world.php | nc 10.x.x.x. 9100
Linux 上透過usblp
連接的 USB 本機印表機有一個裝置檔案(包括 USB 平行介面):
php hello-world.php > /dev/usb/lp0
透過lp
或lpr
存取安裝到本機cups
伺服器的電腦:
php hello-world.php > foo.txt
lpr -o raw -H localhost -P printer foo.txt
Windows 電腦上的本機或網路印表機會對應到檔案中,通常需要您先共用印表機:
php hello-world.php > foo.txt
net use LPT1 \serverprinter
copy foo.txt LPT1
del foo.txt
如果您此時遇到問題,那麼您應該查閱作業系統和印表機系統文檔,嘗試找到有效的列印命令。
若要從 PHP 列印收據,請使用最適合您的設定的 PrintConnector。連接器只是提供將資料傳輸到印表機的管道。
例如, NetworkPrintConnector
接受 IP 位址和連接埠:
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 ();
}
雖然序列印表機可能使用:
use Mike42 Escpos PrintConnectors FilePrintConnector ;
use Mike42 Escpos Printer ;
$ connector = new FilePrintConnector ( " /dev/ttyS0 " );
$ printer = new Printer ( $ connector );
對於每個受支援的作業系統/介面組合,相容性部分都有有關如何建構PrintConnector
的範例。如果您無法使PrintConnector
運作,請務必在您的問題中包含工作列印指令。
對命令和代碼頁的支援因印表機供應商和型號而異。預設情況下,驅動程式將接受 UTF-8,並輸出適合 Epson TM 系列印表機的命令。
嘗試新品牌的印表機時,最好使用「簡單」的CapabilityProfile
,它指示驅動程式避免使用高級功能(通常更簡單的圖像處理、純 ASCII 文字)。
use Mike42 Escpos PrintConnectors WindowsPrintConnector ;
use Mike42 Escpos CapabilityProfile ;
$ profile = CapabilityProfile:: load ( " simple " );
$ connector = new WindowsPrintConnector ( " smb://computer/printer " );
$ printer = new Printer ( $ connector , $ profile );
另一個例子,明星品牌印表機使用不同的指令:
use Mike42 Escpos PrintConnectors WindowsPrintConnector ;
use Mike42 Escpos CapabilityProfile ;
$ profile = CapabilityProfile:: load ( " SP2000 " )
$ connector = new WindowsPrintConnector ( " smb://computer/printer " );
$ printer = new Printer ( $ connector , $ profile );
有關可用設定檔的列表,或要改善對印表機的支持,請參閱上游receipt-print-hq/escpos-printer-db專案。
在 Linux 上,您的印表機裝置檔案將位於/dev/lp0
(平行)、 /dev/usb/lp1
(USB)、 /dev/ttyUSB0
(USB 串列)、 /dev/ttyS0
(串列)等位置。
在 Windows 上,裝置檔案將遵循LPT1
(並行)或COM1
(串列)的行。使用WindowsPrintConnector
進入 Windows 上的系統列印(例如 Windows USB、SMB 或 Windows LPT) - 這透過佇列提交列印作業,而不是直接與印表機通訊。
完整的真實收據可以在 ReceiptPrinter.php 的 Auth 程式碼中找到。它包括理由、大膽和條碼。
其他範例位於 example/ 目錄中。
構造新的列印物件。
參數:
PrintConnector $connector
:要傳送資料的 PrintConnector。CapabilityProfile $profile
此印表機支援的功能。如果未設置,將使用「預設」CapabilityProfile,該檔案適用於 Epson 印表機。有關為不同平台和介面開啟連接的方法,請參閱範例/介面/。
列印條碼。
參數:
string $content
:要編碼的資訊。int $type
:要輸出的條碼標準。如果未指定,將使用Printer::BARCODE_CODE39
。目前支援的條碼標準有(取決於您的印表機):
BARCODE_UPCA
BARCODE_UPCE
BARCODE_JAN13
BARCODE_JAN8
BARCODE_CODE39
BARCODE_ITF
BARCODE_CODABAR
請注意,某些條碼標準只能對數字進行編碼,因此嘗試使用它們列印非數字代碼可能會導致奇怪的行為。
請參閱下面的graphics()。
剪紙。
參數:
int $mode
:剪切模式, Printer::CUT_FULL
或Printer::CUT_PARTIAL
。如果未指定,將使用Printer::CUT_FULL
。int $lines
:切割前要輸入的行數。如果未指定,將使用 3。列印並進紙行 / 列印並進紙 n 行。
參數:
int $lines
: 要輸入的行數有些印表機需要換頁才能釋放紙張。在大多數印表機上,此命令僅在頁面模式下有用,該驅動程式中未實現該模式。
列印並反向進紙 n 行。
參數:
int $lines
:要輸入的行數。如果未指定,則將饋送 1 行。將影像列印到印表機。
參數:
EscposImage $img
:要列印的影像。int $size
:圖像的輸出大小修飾符。尺寸修飾符是:
IMG_DEFAULT
(保留影像原始大小)IMG_DOUBLE_WIDTH
IMG_DOUBLE_HEIGHT
一個最小的例子:
<?php
$ img = EscposImage:: load ( " logo.png " );
$ printer -> graphics ( $ img );
有關詳細範例,請參閱 example/ 資料夾。
函數 bitImage() 採用相同的參數,如果您的印表機不支援較新的圖形命令,則可以使用該函數。作為額外的後備方案,也提供了bitImageColumnFormat()
函數。
初始化印表機。這會將格式重設回預設值。
使用 PDF417 標準列印二維資料代碼。
參數:
string $content
:要儲存在程式碼中的文字或數字number $width
:列印程式碼中模組(像素)的寬度。預設值為 3 點。number $heightMultiplier
:模組高度的乘數。預設為寬度的 3 倍。number $dataColumnCount
:要使用的資料列數。 0(預設)是自動計算。較小的數字將導致更窄的程式碼,從而使更大的像素尺寸成為可能。較大的數字需要較小的像素尺寸。real $ec
:糾錯率,從 0.01 到 4.00。預設值為 0.10 (10%)。number $options
:帶有開始/結束欄的標準代碼Printer::PDF417_STANDARD
,或僅帶開始欄的截斷代碼Printer::PDF417_TRUNCATED
。產生一個脈衝,用於打開現金抽屜(如果已連接)。預設(0、120、240)應打開 Epson 抽屜。
參數:
int $pin
:0 或 1,分別用於引腳 2 或引腳 5 踢出連接器。int $on_ms
:脈衝開啟時間,以毫秒為單位。int $off_ms
:脈衝關閉時間,以毫秒為單位。在印表機上將給定資料列印為二維碼。
string $content
:程式碼的內容。數字資料將被更有效地壓縮。int $ec
要使用的糾錯等級。 Printer::QR_ECLEVEL_L
(預設)、 Printer::QR_ECLEVEL_M
、 Printer::QR_ECLEVEL_Q
或Printer::QR_ECLEVEL_H
之一。糾錯率越高,程式碼就越不緊湊。int $size
:要使用的像素大小。必須是 1-16(預設 3)int $model
:要使用的二維碼模型。必須是Printer::QR_MODEL_1
、 Printer::QR_MODEL_2
(預設)或Printer::QR_MICRO
(並非所有印表機都支援)之一。選擇列印模式。
參數:
int $mode
:要使用的模式。預設為Printer::MODE_FONT_A
,沒有特殊格式。這與運行initialize()
具有類似的效果。多個 MODE_* 常數可以透過 OR 運算一起傳遞給該函數的$mode
參數。有效模式有:
MODE_FONT_A
MODE_FONT_B
MODE_EMPHASIZED
MODE_DOUBLE_HEIGHT
MODE_DOUBLE_WIDTH
MODE_UNDERLINE
設定條碼高度。
參數:
int $height
:以點為單位的高度。如果未指定,將使用 8。設定條碼寬度。
參數:
int $width
:條形寬度(以點為單位)。如果未指定,將使用 3。高於 6 的值似乎沒有效果。選擇列印顏色 - 在支援多種顏色的印表機上。
參數:
int $color
:要使用的顏色。必須是Printer::COLOR_1
(預設)或Printer::COLOR_2
開啟/關閉雙擊模式。
參數:
boolean $on
: true 表示雙重打擊, false 表示無雙重打擊。開啟/關閉強調模式。
參數:
boolean $on
: true 表示強調, false 表示不強調。選擇字體。大多數印表機有兩種字體(字體 A 和 B),有些印表機有第三種字體(字體 C)。
參數:
int $font
:要使用的字體。必須是Printer::FONT_A
、 Printer::FONT_B
或Printer::FONT_C
。選擇理由。
參數:
int $justification
: Printer::JUSTIFY_LEFT
、 Printer::JUSTIFY_CENTER
或Printer::JUSTIFY_RIGHT
之一。設定線的高度。
有些印表機允許您使用較小的換行符號來重疊行。
參數:
int $height
:每行的高度,以點為單位。如果未設置,印表機將重設為其預設行距。設定列印區域左邊距。使用Printer::initialize()
重置為預設值。
參數:
int $margin
:設定列印區域的左邊距,以點為單位。設定列印區域寬度。這可用於在列印區域新增右邊距。使用Printer::initialize()
重置為預設值。
參數:
int $width
:頁面列印區域的寬度,以點為單位。開啟或關閉黑白反轉模式。在此模式下,文字在黑色背景上列印為白色。
參數:
boolean $on
:True 表示啟用,False 表示停用。將文字大小設定為正常大小的倍數。
參數:
int $widthMultiplier
:要使用的常規高度的倍數(範圍 1 - 8)。int $heightMultiplier
:要使用的常規高度的倍數(範圍 1 - 8)。設定列印文字的底線。
參數:
int $underline
: true
/ false
,或Printer::UNDERLINE_NONE
、 Printer::UNDERLINE_SINGLE
或Printer::UNDERLINE_DOUBLE
之一。預設為Printer::UNDERLINE_SINGLE
。將文字新增至緩衝區。文字後面應該有一個換行符,或者應該在此之後呼叫feed()
。
參數:
string $str
:要列印的字串。我為正在學習如何使用收據印表機的人寫的帖子:
example/demo.php
ESC/POS,如何使用它?該程式碼已獲得 MIT 許可,我們鼓勵您將任何修改貢獻回該專案。
對於開發,建議您加載imagick
、 gd
和Xdebug
PHP 擴充功能。
測試在 PHP 7.3、7.4 和 8.0 上的 Travis CI 上執行。目前版本不支援舊版的 PHP,也不支援 HHVM。
取得此程式碼的副本並使用 Composer 載入相依性:
git clone https://github.com/mike42/escpos-php
cd escpos-php/
composer install
透過phpunit
執行單元測試:
php vendor/bin/phpunit --coverage-text
此項目使用PSR-2標準,可以透過PHP_CodeSniffer檢查:
php vendor/bin/phpcs --standard=psr2 src/ -n
開發人員文件是使用 doxygen 建構的。重新建置它們以檢查文件警告:
make -C doc clean && make -C doc
歡迎請求請求和錯誤報告。