Boa tarde pessoal.
Estou utilizando para testes o modelo MP-4200TH da Bematech devidamente instalada em uma porta USB do meu computador.
A instalação, pra quem precisar, encontrei numa página da própria Bematech:clique aqui!
Bom, depois de instalada, mesmo ela sendo USB, o trabalho é como se ela fosse uma impressora serial normal.
Para uso no Java, ou melhor, para imprimir no java uso a estrutura abaixo.
Pra quem quiser usar… fica a vontade.
Primeiro eu listo todas as impressoras instaladas no computador. Monto esse List em um JComboBox numa tela de configuração.
E salvo o nome da impressora nas configurações no sistema (pode ser numa tabela de banco de dados ou até mesmo num arquivo .txt)
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;
}
Depois, antes de imprimir, é feita uma detecção da impressora. Essa parte, é salvo uma referência a ela num atributo de nome impressora.
private static PrintService impressora; // O Atributo citado anteriormente
public void detectaImpressoras(String impressoraSelecionada) { //Passa por parâmetro o nome salvo da impressora
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();
}
}
Próximo passo, é a impressão. Super simples o método. Você passa por parâmetro o que quer imprimir.
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 + "\n").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;
}
Aí chega a minha dúvida. Espero que alguém já tenha passado por isso.
Fiz um método que concatena alguns caracteres para que a impressora execute algumas ações. Como cortar o papel, imprimir em negrito, itálico e etc.
Para a guilhotina eu consegui fazer.
public void acionarGuilhotina(){
imprime(""+(char)27+(char)109);
}
Alguém sabe a combinação para se fazer o negrito e as outras opções de formatação de texto?
Vou continuar a pesquisa, quando eu encontrar, volto aqui e fecho o tópico e adiciono como eu fiz.
Do mais, fica a dica de como imprimir.
Abraço!