Como utilizar a biblioteca QuaggaJS para leitura de códigos de barras

Olá,

Semana passada recebi a missão de realizar a leitura de códigos de barras pelo LATROMI, então logo pensei a biblioteca instascan que geralmente é utilizada para realizar esse trabalho na plataforma.

Criei um formulário com ajuda de um tutorial da comunidade, porém, não consegui ler o código de barras com a biblioteca instascan
Capturar

Fiz o teste com o mesmo código de barras, porém, com a biblioteca QuaggaJS e consegui realizar a leitura do código de barras online, no site da biblioteca.

  1. Para utilizar a biblioteca QuaggaJS no LATROMI exportei a biblioteca para o servidor

    Capturar1

  2. Criei um arquivo chamado initQuaggaJS que basicamente serviria para iniciar a utilização da biblioteca.

    Quagga.init({
        inputStream: {
            name: "Live",
            type: "LiveStream",
            target: document.querySelector('#preview')
        },
        decoder: {
            readers: ["code_128_reader"]
        }
    }, function (err) {
        if (err) {
            console.log(err);
            return
        }
        console.log("Initialization finished. Ready to start");
        Quagga.start();
    });
    Quagga.onDetected(function (data) {
        console.log(data);
    });
    
  3. E para mostrar as imagem da câmera criei um objeto HTMLElement com o código HTML dentro para ser identificado pelo initQuaggaJS.

    <!--<video id="preview" style="width:100%;height:100%"></video> -->
    <div id="preview" style="width:100%;height:100%"></div>
    

As leituras deveriam sair no console, mas isso não esta acontecendo.

Alguém tem alguma ideia de como eu poderia utilizar a biblioteca?

Olá @Framos!

Acho que o problema é que você está iniciando a biblioteca Quagga antes do Formulário Dinâmico estar completamente carregado.

Modifique o JavaScript e coloque o código de inicialização do Quagga como callback do “evento” FormCreated, dessa forma:

latromi.formManager.setOnFormCreatedCallback( function(args) {
	// Coloque o código "Quagga.init" aqui
});

Se ainda assim não funcionar, tente fazer a leitura usando um computador, com a aba console do navegador aberta para ver se ocorre algum erro.

1 curtida

Olá @daniel.giacomelli , muito obrigado por ajudar, funcionou perfeitamente.

2 curtidas

@Framos, tentamos implementar este exemplo do Quagga, mas encontramos um probleminha.

O elemento target não pode ser um video, mas sim um container para o elemento video.

Trocamos para um elemento div e funcionou. Alterei o código no tua postagem original.

OK, obrigado @daniel.giacomelli.

Estou compartilhando uma implementação de teste que realizamos do QuaggaJS.

O exemplo em funcionamento pode ser conferido neste link.


Formulário

Adicione os elementos abaixo em um Formulário Dinâmico.

Arquivos JavaScript

  • quagga.min.js - Referencie o arquivo da biblioteca

  • QuaggaInit.js - Crie um novo arquivo, e adicione o código a seguir:

    (function () {
        // Elemento que recebe o video
        var container = document.createElement('div');
        container.id = 'video-container';
        
        // Botão para encerrar
        var closeButton = document.createElement('button');
        closeButton.type = 'button';
        closeButton.innerHTML = 'Fechar';
        closeButton.className = 'close-button';
        closeButton.addEventListener('click', scannerEnd);
        container.appendChild(closeButton);
        
        document.body.appendChild(container);
    })();
    
    function scannerInit (initializedCallback) {
        
        Quagga.init({
            inputStream: {
                name: "Live",
                type: "LiveStream",
                target: document.querySelector('#video-container')
            },
            locate: true,
            halfSample: true,
            decoder: {
                readers: ["code_128_reader"]
            }
        }, function (err) {
            if (err) {
                alert('Error: ' + err);
                return
            }
            Quagga.start();
            if (initializedCallback)
                initializedCallback();
        });
    };
    
    function scannerStart() {
        scannerInit(function() {
            document.getElementById('video-container').style.display = 'block';
        });
    }
    
    function scannerEnd() {
        Quagga.stop();
        document.getElementById('video-container').style.display = 'none';
    }
    
    Quagga.onDetected(function (data) {
       scannerEnd();
       var code = data.codeResult.code;
        if (code !== null && code !== undefined) 
            latromi.formManager.getFormInstance().setFieldValue('barCode', code);
    });
    

Arquivos CSS

  • QuaggaStyle.css - Crie um novo arquivo, e adicione o estilo a seguir:
    #video-container {
        position: absolute;
        top:0;
        left:0;
        width:100%;
        height:100%;
        z-index: 9999998;
        background: #000;
        display: none;
    }
    #video-container .close-button {
        position: absolute;
        top:20px;
        right: 20px;
        z-index: 9999999;
    }
    
    #video-container video{
        width: 100%;
        height: 100%;
    }
    

Campos

  • barCode - Campo do tipo TextBox, que vai receber o código de barras após a leitura.

  • scanButton - Campo do tipo Button, que vai iniciar o processo de leitura do código de barras.

Procedimentos

  • scanButton_Click - Procedimento vinculado ao evento Click do botão “scanButton”. Adicione uma ação do tipo Executar Código JavaScript, e informe o código a seguir para iniciar a leitura do código de barras:
    scannerStart();
    
Você pode enfrentar problemas ao implementar esta biblioteca caso não esteja utilizando o protocolo HTTPS

Bom dia á todos.

Existe uma maneira de ligarmos a luz do flash quando rodarmos o procedimento que liga a câmera, para leitura em locais escuros?

Olá @Framos

O código abaixo liga ou desliga a lanterna do celular. Basta passar true ou false no parâmetro on:

// Liga/desliga a luz da camera
function torchSwitch(on) {
    navigator.mediaDevices.getUserMedia({
        video: {
            facingMode: 'environment',
        }
    })
    .then((stream) => {
        const video = document.querySelector('video');
        video.srcObject = stream;

        // get the active track of the stream
        const track = stream.getVideoTracks()[0];

        video.addEventListener('loadedmetadata', (e) => {
            window.setTimeout(() => (
                onCapabilitiesReady(track.getCapabilities())
            ), 500);
        });

        function onCapabilitiesReady(capabilities) {
            if (capabilities.torch) {
                track.applyConstraints({
                    advanced: [{ torch: on }]
                })
                    .catch(e => console.log(e));
            }
        }
    })
    .catch(err => alert('getUserMedia() failed: ' + err));
}

Fonte: Let’s light a torch and explore MediaStreamTrack’s capabilities

1 curtida