Ajuda com impressão de cupom

12 respostas Resolvido
java
cleitonoliveira

Pessoal, sera que podem me ajudar, tenho um cogigo de impressao de cupom não fiscal, esta tudo certinho imprimindo e tal, mas como que faço para almenta a font da letra e deixar algumas palavras em negrito? Segue o codigo abaixo.

private void imprimirCupom(ArrayList listaModelVendasProdutoses, ModelVendas modelVendas, ModelCliente modelCliente) {

String dataF = "dd/MM/yyyy";
    String horaF = "H:mm - a";
    String data, hora;
    java.util.Date tempoAtual = new java.util.Date();
    SimpleDateFormat formata = new SimpleDateFormat(dataF);
    data = formata.format(tempoAtual);
    formata = new SimpleDateFormat(horaF);
    hora = formata.format(tempoAtual);

    String conteudoImprimir = "";

    for (int i = 0; i < listaModelVendasProdutoses.size(); i++) {
        conteudoImprimir
                += +this.listaModelVendasProdutoses.get(i).getVenProQuantidade() + "    "
                + listaModelVendasProdutoses.get(i).getVenProValor() + "    "
                + listaModelProdutoses.get(i).getProNome() + "\n\r";
    }
    this.imprimir("    BIA HOT DOG             \n\r"
            + "    Av. Tomaz de Aquino, 2154   \n\r"
            + "            Alvorada            \n\r"
            + "    CNPJ: 30.756.687.0001/50    \n\r"
            + "................................\n\r"
            + "          CUPOM FISCAL          \n\r"
            + "................................\n\r"
            + " QT   PRECO   DESCRICAO         \n\r"
            + " " + conteudoImprimir + ""
            + "................................\n\r"
            + "VALOR BRUTO: " + modelVendas.getVenValorBruto() + "\n\r"
            + "  ADICIONAL: " + modelVendas.getVenAdicional() + "\n\r"
            + "   DESCONTO: " + modelVendas.getVenDesconto() + "\n\r"
            + "VALOR TOTAL: " + modelVendas.getVenValorLiquido() + "\n\r"
            + "................................\n\r"
            + "           OBSERVACAO           \n\r"
            + "................................\n\r"
            + " " + modelVendas.getObservacao() + "\n\r"
            + "................................\n\r"
            + "            CLIENTES            \n\r"
            + "................................\n\r"
            + "NOME: " + modelCliente.getCliNome() + "\n\r"
            + "ENDERECO: " + modelCliente.getCliEndereco()+ "\n\r"
            + "BAIRRO: " + modelCliente.getCliBairro()+ "\n\r"
            + "TELEFONE: " + modelCliente.getCliTel()+ "\n\r"
            + "................................\n\r"
            + data + " - " + hora + "\n\r"
            + "\n\r \n\r \n\r"
            + "\f"
    );
}

public void imprimir(String pTexto) {
    try {
        InputStream prin = new ByteArrayInputStream(pTexto.getBytes());
        DocFlavor docFlavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
        SimpleDoc documentoTexto = new SimpleDoc(prin, docFlavor, null);
        PrintService impressora = PrintServiceLookup.lookupDefaultPrintService();
        //pega impressora padrao
        PrintRequestAttributeSet printerAtributes = new HashPrintRequestAttributeSet();
        printerAtributes.add(new JobName("Impressao", null));
        printerAtributes.add(OrientationRequested.PORTRAIT);
        printerAtributes.add(MediaSizeName.ISO_A4);
        //informa tipo de folha
        DocPrintJob printJob = impressora.createPrintJob();
        try {
            printJob.print(documentoTexto, printerAtributes);
        } catch (PrintException e) {
            JOptionPane.showMessageDialog(null, "Nao foi possivel realizar a impressao", "Erro", JOptionPane.WARNING_MESSAGE);
        }
        prin.close();
    } catch (Exception e) {
    }

}`Texto pré-formatado`

12 Respostas

staroski

Ao invés de passar null no 3° parâmetro, tenta configurar um DocAttributeSet, imagino que há DocAttributes para configurar o estilo de fonte a ser usado em determinados intervalos de texto.

cleitonoliveira

Então, agradeço a ajuda mas não sei aplicar este parâmetro, iniciante só se lasca mesmo kkk poderia me ajudar com isso?

cleitonoliveira

Uma ajudinha???

cleitonoliveira

Não? Nada? Ninguem?

staroski

Tenta procurar alguma documentação do javax.print, a última vez que usei essa API foi em 2005.
Também nem tenho certeza se existem Attributes pro DocAttributes pertinentes à formatação de String.

Outra coisa que você poderia ver é se sua impressora suporta alguns caracteres de controle.
Algumas impressoras da EPSON imprimem em negrito caso você coloque o texto desejado entre umas marcações especiais.

Exemplo:

String INI_NEGRITO = "\u001BE\u0001"; // marcação pra iniciar o negrito
String FIM_NEGRITO = "\u001BE\0";     // marcação pra finalizar o negrito

String texto = "bla bla bla " + INI_NEGRITO + "aqui vai estar em negrito" + FIM_NEGRITO + " bla bla bla";
cleitonoliveira

Orra muito obrigado, deu certinho para ficar em negrito.
Não querendo ser chato, para aumentar a fonte, tem alguma ideia? Pesquisei para um caramba mas não acho nada.

staroski

Ah é? Que bom senão outra alternativa seria você implementar na munheca um objeto Pageable pra “desenhar” seu texto com a classe Graphics2d, mas isso dá um trabalho do cão.

Tens que pesquisar por comandos ESC/POS.
Nesta página tem uma tabela de comandos.

Por exemplo o negrito é o comando "ESC E n"
Onde n=1 liga o negrito e n=0 desliga o negrito

Na String Java:

  • O ESC você vai substituir por \u001B, que é o código ASCII da tecla ESC.
  • O E vai ser E mesmo
  • O n você vai usar \u0001 ou \1 para ligar e \u0000 ou \0 para desligar

Se não me engano o comando ESC/POS para aumentar o tamanho da letra é o "GS ! n", aqui tem a documentação dele.

cleitonoliveira

Valeu mesmo vou dar uma estudada nisso aqui que vendo por cima nao entendi muito, mas vou ver certinho. valeu.

staroski
Solucao aceita

Lembra o código que postei:

String INI_NEGRITO = "\u001BE\1"; // marcação pra iniciar o negrito
String FIM_NEGRITO = "\u001BE\0"; // marcação pra finalizar o negrito

O INI_NEGRITO equivale ao comando ESC E 1
O FIM_NEGRITO equivale ao comando ESC E 0

Talvez se desmembrar o comando em Strings independentes, fique mais facil de entender a lógica, veja:

String ESC = "\u001B";
String E   = "E";
String ON  = "\1";
String OFF = "\0";

String INI_NEGRITO = ESC + E + ON;  // marcação pra iniciar o negrito   (comando ESC E 1)
String FIM_NEGRITO = ESC + E + OFF; // marcação pra finalizar o negrito (comando ESC E 0)
cleitonoliveira

Obrigado pela explicação ai, me ajudou muito.

cleitonoliveira

staroski Desculpa só uma duvida, sabe dizer pq nao imprime os --------? para imprimir traços asim tenho que dar espaço, ficando - - - - - -, assim fica horrível, sabe dizer pq?

staroski

Não sei.
Tenta achar algum manual com os comandos da sua impressora.
Talvez o -- seja algum código.

Criado 16 de junho de 2020
Ultima resposta 20 de jun. de 2020
Respostas 12
Participantes 2