Byte mais e menos significativo - QRCode

8 respostas
java
R

Preciso fazer a impressão do QRCode em uma Daruma DR700 utilizando comunicação direta

achei este tutorial em Delphi:

http://www.desenvolvedoresdaruma.com.br/sddn/ebits/ddc_ebits_13.html

Precisa-se achar os bytes menos e mais significativo, em Delphi é assim:

iQtdBytes      := Length(qrCode);
bMenos         := iQtdBytes shr 8;
bMais            := iQtdBytes AND 255 + 2;

Em java estou fazendo assim, não sei se está certo:

int iQtdBytes = qrCodeString.length();
int bMenos = iQtdBytes >> 8;
int bMais = iQtdBytes & 255 + 2;

Meu método completo:

public String gerarQrCode(String qrCodeString, int larguraModulo) {
        int iQtdBytes = qrCodeString.length();
        int bMenos = iQtdBytes >> 8;
        int bMais = iQtdBytes & 255 + 2;

        int largura = larguraModulo == 0 ? 5 : max(min(larguraModulo, 7), 3);

        byte[] qrCode = {(byte) 27,
            (byte) 129,
            (byte) bMais,
            (byte) bMenos,
            (byte) largura,
            (byte) 77}; // M

        return new String(qrCode) + qrCodeString;
    }

private int min(int num1, int num2) {
    if (num1 < num2) {
        return num1;
    } else {
        return num2;
    }
}

private int max(int num1, int num2) {
    if (num1 > num2) {
        return num1;
    } else {
        return num2;
    }
}

Este método ao invés de imprimir o desenho do QRCode, está imprimindo a String do QRCode…

Não é problema com a impressora, pois usando a DLL da Daruma o QRCode é impresso.

Também não é problema na comunicação direta, pois consigo imprimir negrito, expandido, código de barras.Só o QRCode que não está dando certo.

Alguém já fez isso em java para dar uma ajuda?

8 Respostas

D

Tente assim:

int bMais = (iQtdBytes & 255) + 2;
R

Tentei deste modo, mas continua imprimindo a String do QRCode…

Também tentei assim:

char[] qrCode = {27,
            (char) 129,
            (char) bMais,
            (char) bMenos,
            (char) largura,
            (char) 77}; // M

Mas não deu certo.

D

Pelo que entendi do link acima, o DR700 recebe um texto contendo informações sobre o código e imprime o QR.

O código que vc postou em Java não faz a mesma coisa que no link, acho q está incompleto.

Acho que a String que vc precisa sBuffer é assim:

String sBuffer = "" + ((char) 27)
                    + ((char) 129)
                    + ((char) bMais)
                    + ((char) bMenos)
                    + ((char) iLargMod)
                    + ((char) iNivelCorrecao)
                    + sURL;

Depois é necessário enviar esse texto para o aparelho para ser impresso

R

Na minha última resposta nao postei o código completo, o código completo está no post principal, eu envio a String completa para a impressora.

Já entrei em contato com a Daruma, eles não souberam resolver o problema. Disseram que só tem exemplo em Delphi e C#.

Segue o meu código novamente:

public String gerarQrCode(String qrCodeString) {
        int iQtdBytes = qrCodeString.length();
        int bMenos = iQtdBytes >> 8;
        int bMais = (iQtdBytes & 255) + 2;

        int largura = 5

        byte[] qrCode = {(byte) 27,  //já tentei 0x1B
            (byte) 129, //  tentei 0x81 e 81
            (byte) bMais,
            (byte) bMenos,
            (byte) largura,
            (byte) 0};

       /* Tentei assim:
          char[] qrCode = {27,
        (char) 129,
        (char) bMais,
        (char) bMenos,
        (char) largura,
        (char) 0};
                 */

        return new String(qrCode) + qrCodeString;
    }

Exemplo em C# da Daruma:

int iTam = tbxLink.TextLength;  //TAMANHO DA STRING DO QRCODE
            string strLink = tbxLink.Text;

            int bMais = (iTam & 0xff) + 2;    //AND COM 255
            int bMenos = iTam >> 8;           //DESLOCAMENTO DE 8 bits

            porta.WriteTimeout = 1000;

            //ABERTURA DE PORTA SERIAL
            try
            {
                porta.Open();
            }
            catch (Exception)
            {
                MessageBox.Show("Erro ao abrir porta serial.");
            }


            //MONTAGEM DO COMANDO DE IMPRESSÃO DO QR CODE
            try
            {
                StringBuilder sBuffer = new StringBuilder();

                // COMANDO QRCODE DARUMA 
                sBuffer.Append('\x1B');
                sBuffer.Append('\x81');

                //<+Size> <-Size>
                sBuffer.Append(Convert.ToChar(bMais));
                sBuffer.Append(Convert.ToChar(bMenos));

                //LARGURA DO MÓDULO
                sBuffer.Append(Convert.ToChar(cbxModulo.Text));
                //NÍVEL DE CORREÇÃO
                sBuffer.Append(NivelCorrecao(cbxCorrecao.Text));
                //LINK DO QRCODE
                sBuffer.Append(strLink);


                porta.Write(StringToByteArray(sBuffer.ToString()), 0, sBuffer.Length);
                porta.Close();
            }
            catch (Exception erro)
            {
                porta.Close();
                MessageBox.Show("Erro: " + erro);
            }

Acontece que em Java, é impresso a String do QRCode e não a imagem do QRCode.

R

Bom dia!
Não utilizei impressora Daruma para emitir NFC-e, sendo assim não sei como funciona.
Mas eu estou gerando a impressão do cupom da mesma forma que fiz na NF-e, gerando um relatório no iReport e mandando este para impressora. Isto gera uma impressão direta para impressora, sem depender de dll ou outra coisa. Seria como você mandar um documento do word.
Com isto, o sistema fica pronto para qualquer impressora. Claro, como disse nunca utilizei a Daruma, então teria que ver se ela aceita este tipo de impressão.

D

De acordo com que eu entendi, a String é passada para o equipamento converter em imagem e depois imprimir. Então para imprimir em imagem sem o equipamento é necessário converter aquela String, mas provavelmente precisará de alguma biblioteca para fazer isso. Recomendo que busque uma biblioteca na web ou entre em contato com o suporte do equipamento para ver se eles tem disponível em Java.

L

Alguma evolução? Estou na mesma situação, tentando imprimir o QrCode mas só imprime a string.

R

Cara, consegui resolver, o código que vou te mostrar funcionou em uma Daruma DR700. Acredito que em outras marcas não funcione, porém só testei na Daruma DR700.

public ByteArrayOutputStream gerarQrCode(String qrCodeString) {
        int tamanho = qrCodeString.length() + 3;
        int tamI = 0;
        int tamF = 0;
        if (tamanho > 255) {
            tamI = tamanho % 255;
            tamF = tamanho / 255;
        } else {
            tamI = tamanho;
            tamF = 0;
        }

        byte[] qrCode = {27,
            (byte) 129,
            (byte) (tamI - 1),
            (byte) tamF,
            (byte) 4,
            (byte) 0};

        byte[] fimQRCode = {00};

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        try {
            stream.write(qrCode);
            stream.write(qrCodeString.getBytes());
            stream.write(fimQRCode);
        } catch (IOException ex) {
            Mensagens.msgErro("Erro ao gerar QRCode", null);
            throw new RuntimeException("Erro ao gerar QRCode");
        }

        return stream;
    }

public void imprimir(ByteArrayOutputStream out) {
        PrintService[] printService = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.AUTOSENSE, null);
        PrintService impressoraPadrao = PrintServiceLookup.lookupDefaultPrintService();
        DocFlavor docFlavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
        HashDocAttributeSet hashDocAttributeSet = new HashDocAttributeSet();

        InputStream stream = new ByteArrayInputStream(out.toByteArray());
        //System.out.println("" + getStringFromInputStream(stream));

        Doc doc = new SimpleDoc(stream, docFlavor, hashDocAttributeSet);

        PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
        PrintService printServico = ServiceUI.printDialog(null, 300, 200, printService, impressoraPadrao, docFlavor, printRequestAttributeSet);
        if (printServico != null) {
            DocPrintJob docPrintJob = printServico.createPrintJob();

            try {
                docPrintJob.print(doc, printRequestAttributeSet);

                System.out.println("Passou Impressão");
            } catch (PrintException e) {
                JOptionPane.showMessageDialog(null, "Erro: " + e.getMessage());
                throw new RuntimeException("Erro: " + e.getMessage());
            }
        }
    }

Utilizando os métodos:
imprimir(gerarQrCode("stringQRCode"));

Criado 19 de julho de 2016
Ultima resposta 13 de set. de 2016
Respostas 8
Participantes 4