Olá JMCN bom dia.
Cara existe duas formas de trabalhar com relatórios, usamos o jasper e ele simplifica muito nossa vida, existe uma outra que é mais trabalhosa deixa te explicar esta ultima.
Eu precisei fazer um trabalho certa vez em que eu precisava de agilidade na impressão de uma ficha, era uma ficha de atendimento em uma clinica de imagem/laboratorial ou seja existia uma fila o atendente chamava o paciente, preenchia os dados, exames… e mandava a impressão da ficha e não deveria ser uma impressão pelo driver do windows tinha que enviar direto para a porta para ser mais rápido, então eu não construi o relatório pelas formas digamos tradicionais… eu simplesmente criei uma variável e fui incrementando ela com as informações ou seja no final se eu pegasse a variável e gerasse um arquivo txt vc poderia ler a ficha só que eu não gerava um arquivo mandava direto para a porta LPT1, gerar um relatório desta forma é bem ruim, complicado mais na época precisava de agilidade na impressão coisa que nem o driver genérico iria resolver precisava enviar direto na porta, assim a impressão sai que é uma bala.
se for o seu caso e se com o jasper não resolver vc pode fazer o mesmo, hoje eu ainda faço isto para impressão de cheques, a coisa funciona mais ou menos como criar um arquivo (com um formato definico como se fosse um relatório feito sem o jasper )
a primeira coisa que tens que fazer é conhecer os comandos da impressora, vou fazer um exemplo e colocar aqui pra vc ver se isto te ajuda.
public class Etiquetas{
String codigo;
String nome;
String estante;
String prateleira;
public static void main(String args[]){
String texto = "";
Etiquetas etiqueta = new Etiquetas();
etiqueta.codigo = "1010";
etiqueta.nome = "ROLAMENTO GRANDE DO PINHAO";
etiqueta.estante = "A";
etiqueta.prateleira = "10";
// Draft
texto = new StringBuilder()
.append(texto)
.append(paraLetra(27)).append(paraLetra(120)).append(paraLetra(48)).toString();
// Negrito
texto = new StringBuilder()
.append(texto)
.append(paraLetra(27)).append(paraLetra(69)).toString();
texto = new StringBuilder()
.append(texto)
.append("Codigo: ").toString();
// Codigo do produto expandido e depois
texto = new StringBuilder()
.append(texto)
.append(paraLetra(14)).append(etiqueta.codigo).append(paraLetra(18)).toString();
// Quebra de linha
texto = new StringBuilder()
.append(texto)
.append(paraLetra(13))append(paraLetra(10)).toString();
// Nome do produto e quebra a linha
texto = new StringBuilder()
.append(texto)
.append(etiqueta.nome)
.append(paraLetra(13))append(paraLetra(10)).toString();
// Local Estante e Prateleira
texto = new StringBuilder()
.append(texto)
.append("Local: ")
.append(etiqueta.estante).append(" - ").append(etiqueta.prateleira)
.append(paraLetra(13))append(paraLetra(10)).toString();
// Remove negrito
texto = new StringBuilder()
.append(texto)
.append(paraLetra(27))append(paraLetra(70)).toString();
//
texto = new StringBuilder()
.append(texto)
.append(paraLetra(27))append(paraLetra(64)).toString();
// Enviar para Impressora ou gerar um arquivo
}
// Retorna o simbolo ASCII do número passado
public static String paraLetra(int codigoAscii ) {
char retorno = (char) codigoAscii;
return retorno;
}
}
Meu Java ta longe de ser bom, mais espero que com o código acima vc possa entender os pros e contras, o exemplo foi para a impressão de uma etiqueta com os dados de um produto, geralmente estas etiquetas simples autocolantes com uma coluna e dimensão 89 x 23,4 mm, neste tipo de programação vc tem que ao terminar de imprimir uma etiqueta pular linhas ( 13 + 10 ) até chegar no ponto(topo) da próxima etiqueta.