此專案為熱敏收據印表機實現了 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.txtWindows 電腦上的本機或網路印表機會對應到檔案中,通常需要您先共用印表機:
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_UPCABARCODE_UPCEBARCODE_JAN13BARCODE_JAN8BARCODE_CODE39BARCODE_ITFBARCODE_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_WIDTHIMG_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_AMODE_FONT_BMODE_EMPHASIZEDMODE_DOUBLE_HEIGHTMODE_DOUBLE_WIDTHMODE_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
歡迎請求請求和錯誤報告。