Usando impressora não fiscal em java

Galera, vê se alguém consegue me ajudar, tenho uma classe responsável por imprimir um cupom não fiscal.

public PrintableVenda(Venda venda) {
List empresa = null;
Frame f = new Frame();
f.pack();
Graphics g[] = new Graphics[50];
// pega o Toolkit do Frame
Toolkit tk = f.getToolkit();
// Pega os serviços de impressão existentes no computador,
// para que seja escolhida uma impressora.
// Também pode ser uma impressora de rede
PrintJob pj = tk.getPrintJob(f, “Venda”, null);
try {
empresa = new ControlerEmpresa().listEmpresa();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (pj != null) {
g[0] = pj.getGraphics();
g[0].setFont(new Font(“Arial”, Font.BOLD, 14));
g[0].drawString(empresa.get(0).getNomeFant(), 60, 10);
g[0].setFont(new Font(“Arial”, Font.PLAIN, 10));
g[0].drawString(“CNPJ: “+empresa.get(0).getCnpj(), 47, 20);
g[0].drawString(empresa.get(0).getRua()+”, Nº “+empresa.get(0).getNumero(), 30, 28);
g[0].setFont(new Font(“Arial”, Font.BOLD, 9));
g[0].drawString(“Cupom não fiscal”, 60, 38);
g[0].drawLine(0, 40, 210, 40);
g[0].setFont(new Font(“Courier New”, Font.BOLD, 8));
g[0].drawString(“Descrição”, 10, 49);
g[0].drawString(“Quant.”, 95, 49);
g[0].drawString(“Valor”, 150, 49);
g[0].drawLine(0, 52, 210, 52);
g[0].setFont(new Font(“Arial”, Font.PLAIN, 7));
g[0].drawString(venda.getMercadorias().get(0).getMercadoria(), 10, 60);
g[0].drawString(String.valueOf(venda.getMercadorias().get(0).getEstoque()), 95, 68);
g[0].drawString(String.valueOf(venda.getMercadorias().get(0).getPrecoVenda()*venda.getMercadorias().get(0).getEstoque()), 150, 68);
int loop = 68;
for (int i = 1; i < venda.getMercadorias().size(); i++) {
g[0].drawString(venda.getMercadorias().get(i).getMercadoria(), 10, loop+15);
g[0].drawString(String.valueOf(venda.getMercadorias().get(i).getEstoque()), 95, loop+26);
g[0].drawString(String.valueOf(venda.getMercadorias().get(i).getPrecoVenda()*venda.getMercadorias().get(i).getEstoque()), 150, loop+26);
loop += 20;
}
g[0].setFont(new Font(“Arial”, Font.PLAIN, 8));
g[0].drawString(“Total: R$ “+String.format(”%.2f”,venda.getValTotal()).replace(”.”, “,”), 140, loop+20);
g[0].drawLine(0, loop+30, 210, loop+30);
g[0].drawString("Vendedor: "+UsuLogado.getNome(), 10, loop+40);
g[0].drawString("Cliente: "+venda.getCliente(), 10, loop+50);
g[0].drawString("Data: "+JDateField.getDateHoraStatic(), 10, loop+60);

		// libera os recursos gráficos
		g[0].dispose();
		// encerra a impressão
		pj.end();
	}
	// desfaz o frame temporário
	f.dispose();
}<\code>

O problema é que quando chega ao limite de uma pagina ele dá a impressão por encerrada e corta a folha, no meu caso quando chega em 41 mercadorias ele corta a pagina, e se tiver mais informações não sai mais nada. Como eu poderia fazer pra imprimir mais de uma Folha no mesmo Job pra que só cortar depois que imprimir tudo ?

Bom dia Matheus! Infelizmente eu não sei te ajudar nesse problema, mas eu acredito que usar o Jasper/iReport seria uma boa opção. É mais fácil e dá menos dor de cabeça.

Olá boa tarde Matheus, então podes fazer desta forma usando jasper

cria um relatório simples e que tenha um parâmetro neste exemplo vamos chama-lo de pDados

agora na teu programa vc terá digamos um botão que chamara um método com o seguinte código

       StringBuilder sb = new StringBuilder();
       sb.append("=================");
       sb.append("Data   Nome");
       sb.append("=================");
       // vai preenchendo com valores e dados 
        Map map = new HashMap();
        map.put("pDados", sb.toString());
        
        String arquivoJasper = DIRETORIO_RELATORIOS + "relatorio.jasper";
        
        JasperPrint jp = JasperFillManager.fillReport(arquivoJasper, map, new JREmptyDataSource());
        JasperPrintManager.printReport(jp, false);

Obs. lembrando que o seu relatório em jasper neste caso não terá muito o que fazer apenas colocar lá o seu parâmetro pDados porque ele é que conterá tudo o que vc quer imprimir ou seja praticamente o conteúdo sera na unha ou melhor no sb

Então cara eu pensei em fazer com o IReport, só que pesquisando o pessoal não aconselhou muito usar dessa forma, porque você tem exatamente que gerar o arquivo, depois escrever nele, chamar ele pra impressão e depois apagar oque tem nele pra não duplicar em outras impressões

Olá Matheus bom dia.

Prezado veja que da forma como eu demonstrei vc esta passando o que vc quer imprimir como parâmetro para o relatório, praticamente vc tem um relatório que serve de container para o que vc quiser que seja impresso.

Não tem esta coisa toda que vc explicou, agora concordo que como demonstrei vc tem que popular/formatar os dados na unha

Legal, tentei aqui deu certo, a unica coisa que não funcionou foi na hora de imprimir as mercadorias que ele só imprime até um tamanho X que é o tamanho do parâmetro que eu defini

Opa Matheus blz,

Então detalhe, sabemos que para uma tarefa, resposta podemos ter vários caminhos, soluções… para atingir os objetivos, eu não faço muita ideia do que vc quer imprimir, com o jasper na maior parte fazemos uso de seu desinger, usamos uma consulta e vamos montando nosso relatório arrastando os campos aqui e ali.
Neste exemplo que dei a ti é como eu disse o relatório ele é montado na “unha” fazemos uso da linguagem e vamos concatenando os dados, se precisamos de uma quebra de linha concatenamos ela e vamos seguindo até que o objeto no caso o StringBuilder tenha todo o conteúdo que desejamos e então passamos ele como parâmetro.

Imagina o seguinte uma impressora desta usamos uma bobina de 80mm certo? então temos que tentar, imprimir , ajustar… testar…

    StringBuilder sb = new StringBuilder();
    // cabeçalho
    sb.append(Funcao.replica("=", 35) + "\n" );
    sb.append(Funcao.replica(" ", 8)  +  "** ORCAMENTO **" + "\n");
    sb.append(Funcao.replica("=", 35) + "\n" );
   sb.append("Data: " + Funcao.formataData(new Date(), "dd/MM/yyyy") + " Hora: " + Funcao.formataData(new Date(), "HH:mm") + "\n");
    sb.append(Funcao.replica("=", 35) + "\n" );
    sb.append("Codigo Descricao" + "\n");
    sb.append("Qtd   Unitario         SubTotal" + "\n");
    sb.append(Funcao.replica("=", 35) + "\n" );

e por ai tu vai montando o teu relatório , entendeu o que eu quis dizer com fazer na unha?
agora com certeza pode ser feito de outra forma , outra menos trabalhosa.