Impressora Bematech MP-4200 TH

Alguem conhece alguma forma de enviar um texto para impressão na Bematech MP-4200 TH e logo após a impressão acionar a guilhotina automatica, executando o corte do papel ?

Via linha de comando java.

1 curtida

Olá amigo, estou hoje me matando pra encontrar os comandos de formatação de Texto para esse modelo, mas confesso que está bem complicado.

Mas para a guilhotina, eu já encontrei.

Segue aí o método que eu disparo.

public void acionarGuilhotina(){
        imprime(""+(char)27+(char)109);
    }

E esse método que eu chamo imprime dispara uma String para a impressora.
Se quiser minha Classe Java inteira, eu posso compartilhar. Só avisar.

Se nesse meio tempo você descobriu algum comando a mais, por favor amigo, compartilhe comigo.

Abraço!

Cara, quero sim, poderia enviar ?

Envio sim, lógico.
Vamos lá:

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.swing.JOptionPane;

public class ImpressaoNaoFiscal {
    
    private static PrintService impressora;
    
    public static List<String> retornaImressoras(){
        try {
            List<String> listaImpressoras = new ArrayList<>();
            DocFlavor df = DocFlavor.SERVICE_FORMATTED.PRINTABLE;  
            PrintService[] ps = PrintServiceLookup.lookupPrintServices(df, null);  
            for (PrintService p : ps) {  
                listaImpressoras.add(p.getName());     
            }  
            return listaImpressoras;
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;
    }
    
    public void detectaImpressoras(String impressoraSelecionada) {  
        try {  
            DocFlavor df = DocFlavor.SERVICE_FORMATTED.PRINTABLE;  
            PrintService[] ps = PrintServiceLookup.lookupPrintServices(df, null);  
            for (PrintService p : ps) {  
                if(p.getName()!=null && p.getName().contains(impressoraSelecionada)){  
                    impressora = p;  
                }     
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }
    
    public  boolean imprime(String texto) {  
  
        if (impressora == null) {  
            JOptionPane.showMessageDialog(null, "Nennhuma impressora foi encontrada. Instale uma impressora padrão \r\n(Generic Text Only) e reinicie o programa."); 
        } else {  
            try {  
                DocPrintJob dpj = impressora.createPrintJob();  
                InputStream stream = new ByteArrayInputStream((texto).getBytes());  
                DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;  
                Doc doc = new SimpleDoc(stream, flavor, null);  
                dpj.print(doc, null);  
                return true;  
            } catch (PrintException e) {  
                e.printStackTrace();  
            }  
        }  
        return false;  
    } 

    public void acionarGuilhotina(){
        imprime(""+(char)27+(char)109);
    }
}

Só uma observação: aquele primeiro método: retornaImressoras monta uma Lista de String com todas as impressoras que você tem instalada no Computador.
No caso a minha, Bematech MP-4200 TH eu instalei pelo driver dela, mas poderia estar instalada por um Genérico/Somente texto. Eu tenho esse método só pra usá-lo numa tela de configuração da Impressora.

A propósito, deixa eu te perguntar: conseguiu fazer algum tipo de formatação no texto impresso??
Ou conseguiu pelo menos trabalhar com a DLL que a Bematech passa? Eu uso Windows 7 64 Bits e não estou conseguindo fazer funcionar com a DLL.
Seria muito bacana porque pela DLL além de toda formação de texto, você pode enviar imagens para serem impressas em BMP. Ficaria muito melhor os cupons.

Tenta me ajudar, por favor.

Abraço!

2 curtidas

Eu tinha dado um tempo nas minhas pesquisa, mas vou voltar agora a tentar novamente, caso eu consiga enviar pela dll e posto aqui no forum.

Obrigado.

Boa tarde Caros,

Estou com um problema parecido com minha impressora MP-20.
E com seu código Marcos Roberto, consegui imprimir! Brigado!

ImpressaoNaoFiscal.detectaImpressoras("Generic / Text Only");
ImpressaoNaoFiscal.retornaImressoras();
ImpressaoNaoFiscal.imprime("TESTE ");

Mas está acontecendo algo indesejado :frowning: . Quando coloquei para imprimir o “Teste”. Imprimiu uma linha inteira com “TESTETESTETESTE”.
Além de algumas vezes quando rodo o código, não imprimi nada. Observei que o documento vai para a fila da impressora, mas sai muito rápido e acaba por não imprimir.

Pode me ajudar?


Consegui resolver todos os problemas. :slight_smile:
Marcos Roberto, agora estou a procura também, dos caracteres acentuados, negritos e itálicos. Qualquer coisa compartilho.
Mas uma vez, valeu pelo exemplo!

Boa tarde senhores.
Eu liguei no Suporte ao Desenvolvedor da Bematech agora de tarde.
Fui muito bem atendido, por sinal.
Porém não solucionaram o meu problema, pelo contrário, me deram o caminho pra solucioná-lo.

De início, estou usando para impressões uma Bematech Não Fiscal modelo MP-4200 th. Ela está instalada pelo driver que cria uma porta virtual. (Virtual Serial Driver - MP-4200 TH - 64 bits)
http://partners.bematech.com.br/suporte-recursos/downloads/?category=2&sortby=title&dlpage=1 - Essa URL leva até a página. Basta procurar o modelo da sua impressora e instalar com permissões de administrador (Botão direito sob o instalador/Executar como administrador) o driver. Instale com a Impressora já conectada (no meu caso, na porta USB), porém deixe-a desligada! Depois o Programa de Instalação irá pedir para que você a ligue.

Depois de instalação eu reiniciei meu computador. Não sei se havia de fato necessidade, na dúvida… depois que voltou de reiniciar, olhei no Gerenciador de Dispositivos. Lá ele criou uma Porta COM3 virtual, no meu caso. Pode ser que no seu computador, ele crie com outro nome.

Bom, depois eu abri meu Netbeans e criei uma classe para imprimir as coisas na impressora.
Vamos lá, vou mostrar como escrevi a classe, só que por partes.

  1. Os imports.
package automacao.util;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
  1. Os atributos
private String porta = "";
private FileOutputStream impressora = null;
  1. Um método que inicializa a comunicação com a impressora.
private boolean open(){
        try {
           impressora = new FileOutputStream(this.porta);
           return true;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ImpressoraTexto.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }
  1. Um método que aciona a Guilhotina, caso a usa possua.
public void acionarGuilhotina(){  
        imprimirTexto(""+(char)27+(char)109);  
    }
  1. Um Construtor para a Classe. Note que o próprio construtor já chama o método de abertura.
public ImpressoraTexto(String Porta){
        this.porta = Porta;
        this.open();
    }
  1. Um Método para imprimir o conteúdo desejado
public void imprimirTexto(String Texto){
        try {
            byte[] bytes = Texto.getBytes();
            impressora.write(bytes);
        } catch (IOException ex) {
            Logger.getLogger(ImpressoraTexto.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
  1. Um Método para encerrar a comunicação com a impressora
public void fechar(){
        try {
            impressora.close();
        } catch (IOException ex) {
            Logger.getLogger(ImpressoraTexto.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Eu creio que com essa Classe vocês já consigam fazer bastante coisa, inclusive - era também minha dúvida - funciona com perfeição as opções de formatação de texto.

Qualquer dúvida, qualquer problema, só postar aqui.
Abraço galera.

1 curtida