igorocampos / ESCPOS

A ESC/POS Printer Commands Helper
56 stars 22 forks source link

Não imprime código de barras CODE128 #26

Closed ctenov closed 1 year ago

ctenov commented 1 year ago

Olá Igor,

primeiramente parabéns pela sua biblioteca ! Show de bola !

Baixei sua biblioteca para uso no Windows C# .Net Framework 4.7.2 e já fiz alguns testes com sucesso, porém, não consigo imprimir o código de barras CODE128 (para usar no CFe)...

Já testei na Epson TM-T88, na Bematech MP 2800TH, na SWEDA SI-300 e na Gertec G250.

O código ITF vai normal, o QRCODE também mas o CODE128 simplesmente não imprime. (Fica em branco)

Curioso é que eu também tentei a biblioteca ESP-POS-NET do colega Luke e o resultado foi exatamente o mesmo.

Tenho certeza que essas impressoras conseguem imprimir esse código porque usando a biblioteca (DLL) específica de cada uma delas funciona.

Vc consegue dar alguma luz ?

Abaixo o programa de "teste" que estou utilizando:

        byte[] barCodeCommand = PrintBarCode(BarCodeType.ITF, "1234567890");
        barCodeCommand.Print("192.168.34.250:9100");
        byte[] barCodeCommand2 = PrintBarCode(BarCodeType.CODE128, "1234567890");
        barCodeCommand2.Print("192.168.34.250:9100");

Muito agradecido

Daniel Constantinov

igorocampos commented 1 year ago

Tudo bem Daniel? Cara, na Epson TM-T88 pelo menos eu tenho certeza que era pra estar funcionando, pois foi numa dessa que eu implementei e testei os comandos anos atras...

Na biblioteca do Luke tambem estaria funcionando, pois ele mesmo testou e tem uma galera que ja usa faz tempo. Agora falando especificamente da impressora Bematech, as vezes a impressora está configurada para BemaPOS e não ESC/POS

Mas muito estranho que nenhuma das suas impressoras está imprimindo... Tenta ver se a Sweda e Gertec não tem seu proprio manual de comandos ESC/POS pra impressão do CODE128. Às vezes é um byte só que muda e que inclusive pode ser até aceito pela Epson. Além disso é bom ver se elas suportam esse tipo de codigo de barras, o que eu assumiria que sim, mas nunca se sabe...

Por fim, se nada der certo, parte pra outro tipo de codigo de barras como o ITF que vc mencionou ou o Code11 ou Code93...

ctenov commented 1 year ago

Então, eu testei imprimir o CODE128 via driver da SWEDA (por exemplo) e imprime normal. Quando eu 'mudo' para imprimir via ESCPOS daí não funciona. Sobre usar CODE11 ou CODE93 não sei se é possível (nunca pensei nisso) porque preciso imprimir o Código de Barras do CFe e até onde sei deveria ser via CODE128... Com relação ao BemaPos / ESCPOS eu creio que está tudo certo porque TUDO funciona em todas essas impressoras MENOS o CODE128 :( Sobre ter o próprio comando me parece estranho porque era esperado justamente o contrário e é somente isso que não funciona... Bom, vou tentar fuçar mais coisas aqui mas se vc tiver alguma notícia por gentileza me envie...

Abs Daniel

igorocampos commented 1 year ago

No manual de orientações do SAT não há nenhuma determinação de qual tipo de codigo de barras você deve utilizar para representação da chave de acesso, inclusive verdade seja dita, ninguém nem usa ele, pois o QRCode já contém a chave de acesso e muito mais informações, e o usuario comum não ver scanear nada...

Os Layouts permitem inclusive você utilizar o código de barras de 2 maneiras:

Se não me engano nesse exemplo do README deste repositorio eu estou dividindo em 2 codigos de barra. Mas você pode utilizar qualquer uma das opções, tanto pra tipo de Codigo de Barras quanto para qual Layout usar.

ctenov commented 1 year ago

Na verdade, voltei para consultar o manual (que eu queria ter certeza se ele especificava um tipo) e encontrei esse trecho

image

Mas, vc tem razão que ninguém scaneia esse código :)

Mas tentei o CODE93 e não imprimiu tb :( e o CODE 11 que vc citou talvez tenha outro nome na sua biblioteca (?) porque não encontrei ele rsrsrs

igorocampos commented 1 year ago

Há... Que estranho, não me lembrava desse texto aí não. Bom, eu particularmente já vi gente imprimindo em outros formatos que não o Code 128 (é notavel a diferença na impressão). Sobre o Code 11 é só um tipo de codigo de barras, qdo citei nem sabia dizer se é algo suportado por comandos ESC/POS

Mas nossa, tá muito estranho nem o Code128 e nem o Code93 imprimir... Duro que não tenho nenhuma impressora aqui pra debugar e ver se houve um bug introduzido sem querer desde a implementação.

Você conseguiria mandar aqui os bytes em hexa que a impressora está recebendo pra esse comando especifico do Code128?

igorocampos commented 1 year ago

@ctenov olha só uma coisa que vi no codigo fonte dessa lib: image Aparentemente o Code128 tipo B está hardcoded. Pelo que vc postou deveria ser utilizado o tipo C, tenta mudar esse byte pra ver se imprime nas suas impressoras?

igorocampos commented 1 year ago

Segue a pagina do manual que fala sobre o Code 128 image 9

ctenov commented 1 year ago

Olá Igor, muito obrigado pelo seu retorno ! Eu gostaria muito de usar sua biblioteca. Gostei muito dela. Bem 'clean' e direto ao ponto. Por isso passei a manhã toda fuçando... Hoje estou de volta ao meu escritório e consegui fazer imprimir o CODE 128 na impressora GERTEC e na Bematech mas não consegui na SWEDA... Como eu tinha certeza que a SWEDA era capaz de fazer esse código (porque pelo driver dela eu consigo) fui fuçando e lendo o Manual (que está no seu repositório) encontrei um detalhe interessante na documentação do código de barras:

image

Isso me deu a ideia de tentar um número com menos dígitos e de fato deu certo ! Daí percebi que o problema é que usando um número grande ele "estoura" a largura horizontal e por isso não imprime. Então peguei sua função PrintBarCode, copiei no meu código, dei outro nome e alterei a primeira linha para enviar não somente a 'altura' do código mas também a 'largura'. Veja

        var height = new byte[] { 0x1D, 0x68, (byte)heightInDots, 0x1D,  0x77, 0x2 };

Com isso consegui imprimir um CODE128 com 13 dígitos ! (Mas é preciso chegar a 22 para imprimir a chave do CFe)

Se vc olhar a imagem a seguir vai perceber que o driver da SWEDA consegue "comprimir" as barras num nível bem maior do que parece ser possível com ESCPOS ...

Code128

Você sabe alguma maneira de "espremer" mais as linhas para conseguir fazer caber ?

(Obs: tentei mudar o byte para CODE128 C como está a seguir mas daí ele imprimiu só um pedacinho do código de barras...)

            bar = new byte[] { 0x7B, 0x49 }.Add(bar); // Troquei o 0x42 pelo 0x49

Não sei se fiz certo...

ctenov commented 1 year ago

Ops, desculpa no lugar de 0x49 o correto é 0x43 ... mas o resultado é que ele imprimiu exatamente o mesmo que havia impresso com o 0x42 original !

ctenov commented 1 year ago

Igor, obrigado mais uma vez. Deu certo agora ! (Depois de muita pesquisa) A primeira documentação que consultei dizia que a largura (width) do código de barras podia ser um número entre '2' e '6' mas mesmo usando o número menor ('2') só era possível imprimir 20 dígitos. Daí encontrei uma outra documentação que dizia ser possível usar o número '1' também ! Fiz o teste e deu certo: o código de barras ficou mais "fininho" e couberam os 22 dígitos em uma linha de impressão CODE128 Abs

igorocampos commented 1 year ago

Opa perfeito! Quer fazer uma PR com esse parametro extra na funcao de imprimir o codigo de barras? Eu posso mergear a PR e lançar uma versão nova da DLL pra vc não ter que ficar adicionando manualmente codigo em cima dela.

ctenov commented 1 year ago

Seria excelente !

Acho que vc poderia inserir um último parâmetro na função

    public static byte[] PrintBarCode(BarCodeType barCodeType, string barCode, int heightInDots = 162, int widthXXX = 1.)

Mas embora eu esteja colocando como 'int' creio que o melhor é usar um ENUM indo de 1 a 6 para "forçar" o usuário a um número válido...

Também não precisa usar a denominação que usei... foi apenas um exemplo Abs

ctenov commented 1 year ago

Só um detalhe, eu prefiro que vc mesmo altere aí, assim vc mantém a padronização. Eu só fucei um pouco e não quero me aventurar a mexer no código rsrsrs

igorocampos commented 1 year ago

@ctenov fiz o merge da PR, vc poderia baixar o novo codigo e testar se funcionou o novo parametro? Se tudo der certo já lanço versão do Nuget com novo codigo.

Obrigado

ctenov commented 1 year ago

Eu estou usando via Nuget :(

igorocampos commented 1 year ago

Ok, publiquei a versão 1.2.3 (https://www.nuget.org/packages/ESCPOS/1.2.3)

Por favor, poderia atualizar pra essa versão e testar se a impressão está funcionando com o novo parametro?

@ctenov

ctenov commented 1 year ago

Ficou EXCELENTE !!!! Testado em GERTEC G250 / Bematech MP 2800 / SWEDA SI300 Muito obrigado !

igorocampos commented 1 year ago

De nada