Impressora Fiscal Bematech com PHP

PHP
Enviado por Eclesiastes em Seg, 05/02/2007 - 17:35.PHP

Recentemente encontrei um rapaz que estava procurando um artigo sobre impressora fiscal Bematech com PHP, e no Google só se achava artigo com o link do blog do Deivison, que por sinal, não existe mais. Então procurei no web.archive.org e encontrei, assim sendo, postarei aqui para ficar registrado para quem procurar encontrar facilmente.

Um dos maiores problemas com o desenvolvimento de sistemas para web é a comunicação com periféricos. Não conheço uma maneira de acessar uma porta de comunicação direto com o browser. Mesmo assim eu precisava desenvolver um aplicativo comercial e a partir dele enviar e recuperar dados de uma impressora fiscal Bematech em uma intranet com 5 computadores Windows.
Entrei no site da Bematech (http://www.bematech.com.br) e encontrei um aplicativo de comunicação com a impressora fiscal que roda no shell do Linux. Tive, então, a idéia de fazer com o computador onde fica a impressora o servidor Linux, onde rodaria meu aplicativo PHP, e com o PHP fazer o aplicativo ser executado sempre que necessário.

O aplicativo da Bematech funciona da seguinte forma:
No arquivo "BEMAFILX.CMD" você grava os comandos para impressora fiscal, depois executa o "BEMAFILX.OUT", que pega as informações do primeiro arquivo e envia para a porta de comunicação da impressora. Logo depois, grava nos arquivos "RETORNO.TXT" e "STATUS.TXT" respectivamente as informações de retorno e o status da impressora fiscal.
Com o arquivo "BEMAFILX.INI" você define as configurações necessárias para o aplicativo funcionar corretamente, como por exemplo a porta serial onde a impressora está ligada.

Criei depois uma função para gravar os comandos no "BEMAFILX.CMD", executar o "BEMAFILX.OUT" e ler os arquivos de status e retorno:

  1. function envia_dado($dado) {
  2.     // A variável $dado contém as informações que serão enviadas para impressora fiscal
  3.     $fp = fopen("bemafilx.cmd","w"); // abre o arquivo de comandos
  4.     fwrite($fp,$dado);
  5.     fclose($fp);
  6.     $executa = "./bemafilx.out";
  7.     $comando = `$executa`; // executa o aplicativo "bemafilx.out"
  8.  
  9.     if (file_exists("status.txt")) { // pega as informações do arquivo 'status.txt'
  10.         $filename = "status.txt";
  11.         $fd       = fopen ($filename, "r");
  12.         $status   = fread ($fd, filesize ($filename));
  13.         fclose ($fd);
  14.         $fp = fopen("status.txt","w");
  15.         // logo depois de ler o arquivo ele deixa em branco o conteúdo do arquivo
  16.         fwrite($fp,"");
  17.         fclose($fp);
  18.     } else {
  19.         $status = "";
  20.     }
  21.  
  22.     if (file_exists("retorno.txt")) { // lê o conteudo do arquivo de retorno
  23.         $filename = "retorno.txt";
  24.         $fd       = fopen ($filename, "r");
  25.         $retorno  = fread ($fd, filesize ($filename));
  26.         fclose ($fd);
  27.         chmod ("retorno.txt", 0666);   
  28.         $fp = fopen("retorno.txt","w");
  29.         // deixa em branco o conteúdo do arquivo de retorno
  30.         fwrite($fp,"");
  31.         fclose($fp);
  32.     } else {
  33.         $retorno = "";
  34.     }
  35.     return $retorno;
  36. }
  37.  

Note que a variável de $status nunca é usada, na verdade eu ainda não precisei testar o status da impressora em meus aplicativos.
Uma impressora fiscal é diferente de uma impressora comum e não aceita qualquer dado, na verdade existe uma formatação especial e que você pode entender lendo o manual da impressora que vem junto com o equipamento e que também está disponível no site da Bematech.
Exemplo de uso da função envia_dado():
$retorno = envia_dado(chr(27).chr(251).'00|'.chr(27)); // Esse comando abre o cupom fiscal
$retorno = envia_dado(chr(27).chr(251).'05|'.chr(27)); // Esse comando imprime uma Redução Z

Eu criei minhas próprias funções de formatação e só não disponibilizo pelo motivo de achar que elas ainda não estão 100% e aconselho você mesmo a criar as suas.
Não encontrei absolutamente nada sobre impressora fiscal + php e tive que me virar, então achei interessante compartilhar o que descobri com outros programadores PHP. Com certeza essa não é a única forma de fazer isso e gostaria de conhecer outras maneiras.
Será que é só comigo? A cada novo sistema algum cliente inventa algo mais difícil e com certeza no futuro vou ter que fazer comunicação com leitores de código de barra, teclados para senha, impressoras matriciais que precisam imprimir caracteres não gráficos para uma impressão mais rápida, balanças e outros dispositivos. E tudo isso não em uma Intranet mas na Internet o que torna meu trabalho atualmente impossível. Por isso tenho muito interesse em comunicação de periféricos usando o PHP no browser. Já pensei na possibilidade do desenvolvimento de plugins, mas ainda não tenho conhecimento de como fazer e nem sei se um plugin pode enviar dados a uma porta serial (acho que não).

Autor: Deivison Alves Elias



Enviado por Bruno Maia (não verificado(a)) em Qua, 07/02/2007 - 10:10.

Ótimo artigo, o mesmo é de uma utilidade enorme, já que o conteúdo que trata de PHP + comunicação com portas são escassos.
Também tenho interesse em desenvolver algo para portas paralelas e seriais com PHP, caso você tenha mais informações ou algum projeto em andamento, favor me enviar um e-mail.

Obrigado.

Enviado por Bruno Maia (não verificado(a)) em Qua, 07/02/2007 - 10:13.

brunopmaia-arroba-gmail-ponto-com

Enviado por guest (não verificado(a)) em Ter, 27/10/2009 - 16:56.

cara, preciso muito desta solucao. tem como me passar?
aguardo seu retorno.

Enviado por Wesley (não verificado(a)) em Seg, 12/02/2007 - 17:47.

Ótimo artigo sobre impressão fiscal usando PHP. Tenho clientes para vc se tiver algo já funcionando e homologado. Caso tenha interesse me mande um e-mail. Grato.

Enviado por Robson Tenório (não verificado(a)) em Qui, 15/03/2007 - 16:33.

Existe um guia interessante em http://robsontenorio.net passo a passo de instalação/configuração/utilização de impressoras Bematech com PHP, através de utilização de componentes.

Enviado por Adriana (não verificado(a)) em Qua, 23/05/2007 - 17:50.

Consegui um arquivo parecido com esse e achei ótimo pra alinhar a impressão em formulários. O problema é que o meu provedor não dá permissão pra usar o fopen. Tentei usar a diretiva allow_url_fopen mas também não deu certo.
Usei assim $fp = fopen("$ip/LPT1","w");
Vc teria alguma sugestão? Funciona local mas online me nega a permissão pra usar a LPT1. Obrigada.

Enviado por Rafagd (não verificado(a)) em Seg, 22/10/2007 - 08:53.

Ótimo artigo, infelizmente o servidor php tem que estar instalado na máquina da impressora, ou ao menos estar na rede, o que nem sempre é a realidade...

Enviado por Jackson (não verificado(a)) em Sex, 02/11/2007 - 13:44.

Bom Pessoal depois de um ano de pesquisa e testes consegui desenvolver um sistema que utiliza tanto a impressora fiscal bematech fiscal via porta serial como as não fiscais via porta paralela...
Se ainda for de interesse de alguem podemos conversar... e quanto a clientes sempre são bem vindos ...
Funciona tanto em php como asp, pois na verda as implementações são feitas em javascript e vbscript

Enviado por Alexandre (não verificado(a)) em Seg, 07/04/2008 - 19:31.

Ola Jackson
Acredito que voce tenha a solução para o meu problema.
Estou disposto a negociar. voce pode fazer contato ?
Alexandre Guerrelhas

Enviado por celio (não verificado(a)) em Qui, 04/06/2009 - 05:15.

Sou desenvolvedor e tenho interesse, gostaria de um contato,

Obrigado

Enviado por Diogo Fernandes (não verificado(a)) em Sáb, 02/01/2010 - 18:06.

Ola, tenho muito interesse sobre o assunto porem nao consigo nada na net!!!

Seria possivel voce me disponibilizar algo??

Sou estudante de TI e gostaria de infrentar esse ramo de PHP + impressora fiscal no meu tcc... grato antes de mais nada...

diogofernandes2007-arroba-hotmail-ponto-com

Enviado por Jackson (não verificado(a)) em Sex, 02/11/2007 - 13:59.
Enviado por Robson Tenório (não verificado(a)) em Qua, 30/01/2008 - 12:02.

Como devem saber a solução usando JavaScript só funciona no IE, pois usa Activex para utilizar os recursos do SO para comunicação com a impressora.

Alguem tem a solução para FireFox , por exemplo?

Enviado por guest (não verificado(a)) em Qui, 10/04/2008 - 11:57.

existe um plugins para o firefox que utiliza o ie por dentro dele não sei se te serve?

Enviado por gustavo (não verificado(a)) em Seg, 31/12/2007 - 07:17.

ola,

com isso dá para criar aplicativos tipo ponto de venda?

abraços,
gpr.

Enviado por guest (não verificado(a)) em Qui, 10/04/2008 - 11:55.

Sim da agora tenho solução para impressora fiscal bematech e epson

Enviado por Beto (não verificado(a)) em Seg, 21/04/2008 - 10:59.

parabéns pelo seu artigo Eclesiastes, tbm tive problemas em achar soluções em php. Meu cliente adquiriu um 2100 th térmica que possui uma guilhotina, mas não consegui enviar o comando para cortar no final. Vc sabe algo a esse respeito?

Obrigado

Enviado por Jackson (não verificado(a)) em Seg, 12/05/2008 - 11:23.

Sim tenho dominio completo para solução via web para impressoras bematech e epson fiscais e não fiscais...

Enviado por Valter (não verificado(a)) em Sex, 22/08/2008 - 16:20.

Tem como o sistema ta no servidor e na maquina do usuario a impressora fiscal imprimir nela, sendo que o php vai estar em outro local?

Enviado por Rodrigo Otávio Mores (não verificado(a)) em Ter, 14/10/2008 - 18:22.

Meu caro, tbm encontro varios clientes que querem e querem e querem,... O que esta certo, querer eh gratuito.
Acontece, que quando nos deparamos no uso de perifericos com PHP a questão muda. Li em seu post, sobre impressora fiscal, vc pensando sobre um plugin para browser. E soh como comentario, meio que alerta. Acredito que nao seja por ai o caminho. Haja visto que o browser eh do cliente... e plugin eh falseavel.
Temos o hábito de nos enganar com php, acreditando que nosso php eh o que se vê na tela, mas de fato sabemos que nao eh assim. Esse mundo 'web' trouxe essa arquitetura nova(?), mas a realidade eh que quando enviamos os dados do php para o cliente, esse ja nao nos pertence. Nao podemos acreditar em seu retorno.
Agora, sobre essa questao de comunicação, que era o ponto do post. Acredito no uso de pequenos 'comunicadores' programas feitos em C, ate mesmo VB, mas que se comuniquem com nossos servers. E procedam a uma acao efetiva.

[]'s.