Este projeto implementa um subconjunto do protocolo ESC/POS da Epson para impressoras térmicas de recibos. Ele permite gerar e imprimir recibos com formatação básica, corte e códigos de barras em uma impressora compatível.
A biblioteca foi desenvolvida para adicionar suporte imediato para impressão de recibos a qualquer aplicativo PHP, incluindo aplicativos de ponto de venda (POS) baseados na web.
Este driver é conhecido por funcionar com as seguintes combinações de sistema operacional/interface:
Linux | Mac | Windows | |
---|---|---|---|
Ethernet | Sim | Sim | Sim |
USB | Sim | Não testado | Sim |
Serial USB | Sim | Sim | Sim |
Serial | Sim | Sim | Sim |
Paralelo | Sim | Não testado | Sim |
PME compartilhado | Sim | Não | Sim |
CUPS hospedado | Sim | Sim | Não |
Muitas impressoras térmicas de recibos suportam ESC/POS até certo ponto. Este driver é conhecido por funcionar com:
feedForm()
para liberar papel).release()
para liberar o deslizamento).Se você utiliza alguma outra impressora com este código, avise-nos para que ela possa ser adicionada à lista.
Esta biblioteca foi projetada para uso com o gerenciador de dependências PHP composer
. Basta adicionar o pacote mike42/escpos-php
para começar:
composer require mike42/escpos-php
Se você nunca usou composer
antes, você pode ler sobre ele em getcomposer.org.
Este projeto tem poucas dependências rígidas:
json
, usada para carregar definições de impressora agrupadas (consulte a documentação)intl
, usada para codificação de caracteres (ver documentação)zlib
, usada para descompactar recursos agrupados (consulte a documentação). Também é sugerido que você instale imagick
ou gd
, pois eles podem ser usados para acelerar o processamento de imagens.
Várias extensões opcionais podem ser adicionadas para habilitar recursos mais específicos. Eles estão descritos na seção "sugerir" do compositor.json.
Para utilizar este driver, seu servidor (onde o PHP está instalado) deve ser capaz de se comunicar com sua impressora. Comece gerando um recibo simples e enviando-o para sua impressora usando a linha de comando.
<?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 ();
Alguns exemplos estão abaixo para interfaces comuns.
Comunique-se com uma impressora com interface Ethernet usando netcat
:
php hello-world.php | nc 10.x.x.x. 9100
Uma impressora local USB conectada com usblp
no Linux possui um arquivo de dispositivo (inclui interfaces paralelas USB):
php hello-world.php > /dev/usb/lp0
Um computador instalado no servidor cups
local é acessado através de lp
ou lpr
:
php hello-world.php > foo.txt
lpr -o raw -H localhost -P printer foo.txt
Uma impressora local ou em rede em um computador Windows é mapeada em um arquivo e geralmente exige que você compartilhe a impressora primeiro:
php hello-world.php > foo.txt
net use LPT1 \serverprinter
copy foo.txt LPT1
del foo.txt
Se você tiver problemas neste ponto, consulte a documentação do sistema operacional e do sistema da impressora para tentar encontrar um comando de impressão funcional.
Para imprimir recibos de PHP, use o PrintConnector mais aplicável para sua configuração. O conector simplesmente fornece o encanamento para levar os dados à impressora.
Por exemplo, um NetworkPrintConnector
aceita um endereço IP e uma porta:
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 ();
}
Embora uma impressora serial possa usar:
use Mike42 Escpos PrintConnectors FilePrintConnector ;
use Mike42 Escpos Printer ;
$ connector = new FilePrintConnector ( " /dev/ttyS0 " );
$ printer = new Printer ( $ connector );
Para cada combinação de sistema operacional/interface compatível, há exemplos na seção de compatibilidade de como um PrintConnector
seria construído. Se você não conseguir fazer um PrintConnector
funcionar, certifique-se de incluir o comando de impressão funcional em seu problema.
O suporte para comandos e páginas de código varia entre fornecedores e modelos de impressora. Por padrão, o driver aceitará UTF-8 e emitirá comandos adequados para impressoras da série Epson TM.
Ao experimentar uma nova marca de impressora, é uma boa ideia usar o "simples" CapabilityProfile
, que instrui o driver a evitar o uso de recursos avançados (geralmente manipulação de imagens mais simples, texto somente 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 );
Como outro exemplo, as impressoras da marca Star usam comandos diferentes:
use Mike42 Escpos PrintConnectors WindowsPrintConnector ;
use Mike42 Escpos CapabilityProfile ;
$ profile = CapabilityProfile:: load ( " SP2000 " )
$ connector = new WindowsPrintConnector ( " smb://computer/printer " );
$ printer = new Printer ( $ connector , $ profile );
Para obter uma lista de perfis disponíveis ou para melhorar o suporte para sua impressora, consulte o projeto upstream recibo-print-hq/escpos-printer-db.
No Linux, o arquivo do dispositivo da sua impressora estará em algum lugar como /dev/lp0
(paralelo), /dev/usb/lp1
(USB), /dev/ttyUSB0
(USB-Serial), /dev/ttyS0
(serial).
No Windows, os arquivos do dispositivo serão semelhantes a LPT1
(paralelo) ou COM1
(serial). Use o WindowsPrintConnector
para acessar a impressão do sistema no Windows (por exemplo, Windows USB, SMB ou Windows LPT) - isso envia trabalhos de impressão por meio de uma fila em vez de se comunicar diretamente com a impressora.
Um recibo completo do mundo real pode ser encontrado no código Auth em ReceiptPrinter.php. Inclui justificação, ousadia e código de barras.
Outros exemplos estão localizados no diretório example/.
Construa um novo objeto de impressão.
Parâmetros:
PrintConnector $connector
: O PrintConnector para o qual enviar dados.CapabilityProfile $profile
Recursos suportados por esta impressora. Se não for definido, será usado o CapabilityProfile "padrão", que é adequado para impressoras Epson.Veja exemplo/interface/ para maneiras de abrir conexões para diferentes plataformas e interfaces.
Imprima um código de barras.
Parâmetros:
string $content
: as informações a serem codificadas.int $type
: O padrão de código de barras para saída. Se não for especificado, Printer::BARCODE_CODE39
será usado.Os padrões de código de barras atualmente suportados são (dependendo da sua impressora):
BARCODE_UPCA
BARCODE_UPCE
BARCODE_JAN13
BARCODE_JAN8
BARCODE_CODE39
BARCODE_ITF
BARCODE_CODABAR
Observe que alguns padrões de código de barras só podem codificar números, portanto, tentar imprimir códigos não numéricos com eles pode resultar em um comportamento estranho.
Veja gráficos() abaixo.
Corte o papel.
Parâmetros:
int $mode
: Modo de corte, Printer::CUT_FULL
ou Printer::CUT_PARTIAL
. Se não for especificado, Printer::CUT_FULL
será usado.int $lines
: Número de linhas a serem alimentadas antes do corte. Se não for especificado, 3 será usado.Imprimir e alimentar linha / Imprimir e alimentar n linhas.
Parâmetros:
int $lines
: Número de linhas para alimentarAlgumas impressoras exigem alimentação de formulário para liberar o papel. Na maioria das impressoras, esse comando só é útil no modo de página, que não está implementado neste driver.
Imprima e inverta a alimentação de n linhas.
Parâmetros:
int $lines
: número de linhas para alimentar. Se não for especificado, 1 linha será alimentada.Imprima uma imagem na impressora.
Parâmetros:
EscposImage $img
: A imagem a ser impressa.int $size
: modificador de tamanho de saída para a imagem.Os modificadores de tamanho são:
IMG_DEFAULT
(deixar a imagem no tamanho original)IMG_DOUBLE_WIDTH
IMG_DOUBLE_HEIGHT
Um exemplo mínimo:
<?php
$ img = EscposImage:: load ( " logo.png " );
$ printer -> graphics ( $ img );
Veja o exemplo/pasta para exemplos detalhados.
A função bitImage() usa os mesmos parâmetros e pode ser usada se sua impressora não suportar os comandos gráficos mais recentes. Como alternativa adicional, a função bitImageColumnFormat()
também é fornecida.
Inicialize a impressora. Isso redefine a formatação de volta aos padrões.
Imprima um código de dados bidimensional usando o padrão PDF417.
Parâmetros:
string $content
: Texto ou números para armazenar no códigonumber $width
: Largura de um módulo (pixel) no código impresso. O padrão é 3 pontos.number $heightMultiplier
: Multiplicador da altura de um módulo. O padrão é 3 vezes a largura.number $dataColumnCount
: número de colunas de dados a serem usadas. 0 (padrão) é para calcular automaticamente. Números menores resultarão em um código mais estreito, possibilitando tamanhos de pixels maiores. Números maiores requerem tamanhos de pixel menores.real $ec
: Taxa de correção de erros, de 0,01 a 4,00. O padrão é 0,10 (10%).number $options
: Código padrão Printer::PDF417_STANDARD
com barras de início/fim ou código truncado Printer::PDF417_TRUNCATED
apenas com barras de início.Gera um pulso para abrir uma gaveta de dinheiro, se houver alguma conectada. As configurações padrão (0, 120, 240) devem abrir uma gaveta Epson.
Parâmetros:
int $pin
: 0 ou 1, para conector de saída do pino 2 ou pino 5, respectivamente.int $on_ms
: tempo de ativação do pulso, em milissegundos.int $off_ms
: tempo de desligamento do pulso, em milissegundos.Imprima os dados fornecidos como um código QR na impressora.
string $content
: o conteúdo do código. Os dados numéricos serão compactados com mais eficiência.int $ec
Nível de correção de erros a ser usado. Um de Printer::QR_ECLEVEL_L
(padrão), Printer::QR_ECLEVEL_M
, Printer::QR_ECLEVEL_Q
ou Printer::QR_ECLEVEL_H
. Uma maior correção de erros resulta em um código menos compacto.int $size
: tamanho do pixel a ser usado. Deve ser de 1 a 16 (padrão 3)int $model
: modelo de código QR a ser usado. Deve ser um dos Printer::QR_MODEL_1
, Printer::QR_MODEL_2
(padrão) ou Printer::QR_MICRO
(não suportado por todas as impressoras).Selecione o(s) modo(s) de impressão.
Parâmetros:
int $mode
: O modo a ser usado. O padrão é Printer::MODE_FONT_A
, sem formatação especial. Isso tem um efeito semelhante à execução initialize()
. Várias constantes MODE_* podem ser combinadas com OR e passadas para o argumento $mode
desta função. Os modos válidos são:
MODE_FONT_A
MODE_FONT_B
MODE_EMPHASIZED
MODE_DOUBLE_HEIGHT
MODE_DOUBLE_WIDTH
MODE_UNDERLINE
Defina a altura do código de barras.
Parâmetros:
int $height
: Altura em pontos. Se não for especificado, 8 será usado.Defina a largura da barra do código de barras.
Parâmetros:
int $width
: largura da barra em pontos. Se não for especificado, 3 será usado. Valores acima de 6 parecem não ter efeito.Selecione a cor de impressão - em impressoras que suportam múltiplas cores.
Parâmetros:
int $color
: Cor a ser usada. Deve ser Printer::COLOR_1
(padrão) ou Printer::COLOR_2
Ativar/desativar o modo de ataque duplo.
Parâmetros:
boolean $on
: verdadeiro para ataque duplo, falso para nenhum ataque duplo.Ativar/desativar o modo enfatizado.
Parâmetros:
boolean $on
: verdadeiro para ênfase, falso para sem ênfase.Selecione a fonte. A maioria das impressoras possui duas fontes (Fontes A e B) e algumas possuem uma terceira (Fonte C).
Parâmetros:
int $font
: A fonte a ser usada. Deve ser Printer::FONT_A
, Printer::FONT_B
ou Printer::FONT_C
.Selecione a justificativa.
Parâmetros:
int $justification
: Um de Printer::JUSTIFY_LEFT
, Printer::JUSTIFY_CENTER
ou Printer::JUSTIFY_RIGHT
.Defina a altura da linha.
Algumas impressoras permitem sobrepor linhas com um avanço de linha menor.
Parâmetros:
int $height
: A altura de cada linha, em pontos. Se não for definido, a impressora será redefinida para o espaçamento entre linhas padrão. Defina a margem esquerda da área de impressão. Redefina para o padrão com Printer::initialize()
.
Parâmetros:
int $margin
: A margem esquerda a ser definida na área de impressão, em pontos. Defina a largura da área de impressão. Isso pode ser usado para adicionar uma margem direita à área de impressão. Redefina para o padrão com Printer::initialize()
.
Parâmetros:
int $width
: A largura da área de impressão da página, em pontos.Ative ou desative o modo reverso preto/branco. Neste modo, o texto é impresso em branco sobre fundo preto.
Parâmetros:
boolean $on
: True para ativar, false para desativar.Defina o tamanho do texto como um múltiplo do tamanho normal.
Parâmetros:
int $widthMultiplier
: Múltiplo da altura normal a ser usada (intervalo de 1 a 8).int $heightMultiplier
: Múltiplo da altura normal a ser usada (intervalo de 1 a 8).Defina sublinhado para texto impresso.
Parâmetros:
int $underline
: true
/ false
, ou um de Printer::UNDERLINE_NONE
, Printer::UNDERLINE_SINGLE
ou Printer::UNDERLINE_DOUBLE
. O padrão é Printer::UNDERLINE_SINGLE
. Adicione texto ao buffer. O texto deve ser seguido por uma quebra de linha ou feed()
deve ser chamado depois disso.
Parâmetros:
string $str
: a string a ser impressa.Postagens que escrevi para pessoas que estão aprendendo a usar impressoras de recibos:
example/demo.php
.Este código é licenciado pelo MIT e você é incentivado a contribuir com quaisquer modificações no projeto.
Para desenvolvimento, é sugerido que você carregue as extensões PHP imagick
, gd
e Xdebug
.
Os testes são executados no Travis CI em PHP 7.3, 7.4 e 8.0. Versões mais antigas do PHP não são suportadas na versão atual, nem HHVM.
Obtenha uma cópia deste código e carregue as dependências com o compositor:
git clone https://github.com/mike42/escpos-php
cd escpos-php/
composer install
Execute testes unitários via phpunit
:
php vendor/bin/phpunit --coverage-text
Este projeto utiliza o padrão PSR-2, que pode ser verificado via PHP_CodeSniffer:
php vendor/bin/phpcs --standard=psr2 src/ -n
Os documentos do desenvolvedor são construídos com doxygen. Recrie-os para verificar avisos de documentação:
make -C doc clean && make -C doc
Solicitações pull e relatórios de bugs são bem-vindos.