该项目为热敏收据打印机实现了 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
的输出。该代码已获得 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
欢迎请求请求和错误报告。