Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Micilini Roll

[Tutorial] Gerar/Ler/Escanear QRcodes com PHP e Javascript

Recommended Posts

Olá pessoal estou aqui hoje para adicionar um supertutorial aqui no forum,que sera sobre:

 

Como gerar,ler e escanear QRcodes com PHP e javascript

Pois bem o motivo deste tutorial é pela dificuldade encontrada na internet, de encontrar um comando seja php ou javascript que consiga gerar QRcodes,ate que tem aos montes sobre como gerar,mas a verdadeira busca começaa quando queremos fazer com que o projeto leia ou escaneie QRcodes...Não há nada para que se preocupar, hoje estarei ensinando a fazer isso tudo em um só projeto, vamos lá?

 

1- Sumario

 

  1. O que são QRcodes
  2. Como funciona os QRcodes
  3. Gerando sua propria classe de QRcode com php e jquery
  4. Criando QRcodes com o API da Google
  5. Lendo QRcodes atraves de sistema de upload com php e jquery
  6. Lendo QRcodes atraves da Webcam com jquery e flash

Ao final deste topico voce estará apto a:

 

  • Entender como funciona os QRcodes
  • Criar e ler QRcodes usufruindo das linguagens PHP, JQUERY & ACTION SCRIPT
  • Criar QRcodes ultilizando API da Google

1- O que são QRcodes?

 

Do ingles Quick Response codes, que em portugues significa Códigos de resposta rápida é um código de barras bidimensional (formado por duas dimensões (altura e largura), sendo plano em sua essência.), que pode ser escaneado por telefones,celulares entre outros equipamentos eletronicos que possuam Camera Digital(cameras digitais nao são necessarios em todos os leitores).

 

1.2-Por qual motivo os QRcodes foram criados e por quem foram criados?

 

Inicialmente usado para catalogar diferentes partes na construção de veículos, hoje o QR Code é usado no gerenciamento de inventário em uma grande variedade de indústrias. Desde 2003, foram desenvolvidas aplicações que ajudam usuários a adicionar dados a seus telefones celulares (telefones móveis) usando a câmera do aparelho. Os códigos QR são muito comuns também em revistas e propagandas, para registrar endereços e URLs, bem como informações pessoais detalhadas. No caso de cartões-de-visita, por exemplo, o código QR facilita muito a inserção desses dados em agendas de telefones celulares.Foi criado no Japão por uma empresa subsidiária da Toyota a Denso Wave. em 1994. entao... nos nao temos o nome da pessoa ou grupo de pessoas que tiveram a ideia de cria-lo.

 

1.3-Estive pensando! Como um quadradinho pequeno consegue armazenar tanta informação?

 

www.techtudo_qr_droid.png

 

Um QR Code deste tamanho pode armazenar mais de 300 caracteres alfanuméricos.

Veja a imagem abaixo, a mesma quantidade de dados que o código de barras de uma dimensão, podemos guardar no QR Code símbolo, graça a sua possibilidade de armazenar verticalmente e horizontalmente os dados.

 

barvsqr.gif

1.4-Existe Alguma regra para leitura de QRcodes?

 

Não!, Podemos ler o símbolo de praticamente qualquer ângulo mesmo com ele distorcido, graças aos seus marcadores de posição localizados em três cantos do código.

 

1.5-O que sao aqueles 3 quadrados principais existentes no QRcode?

 

Eles são chamados de módulos (módulos são os pontos pretos e brancos que formam o QR Code).

 

1.6-Como funciona os QRcodes? como é o processo de captura de imagem, e descriptografia?

 

O bloco de quadradinhos pretos e brancos é lido pelo sensor de imagens(como cameras) então é captado pelo codigo fonte que faz a leitura do QRcode é descodificado e enviado para o hardware sendo interpretado pelo processador do sistema em binario (001000111100). Os três quadrados maiores são alvos de alinhamento, ou seja assim que o sensor de imagens e posto a frente da imagem do QRcode é buscado antes de mais nada uma figura parecida com esta:

 

 

ymm.png

 

 

enquanto o quadrado menor que sobra no canto age para normalizar o tamanho e o ângulo da leitura.
e em seguida o sensor de imagem le dessa forma que voces viram acima!:
1- acha os quadrados maiores
2-depois pega os menores
3-e assim vai fazendo ate achar todos e decodificar
qr3-2.png

 

 

Como você pode ver na imagem acima, as faixas azuis próximas dos quadrados de alinhamento contêm as informações de formatação, e o resto da área, em amarelo, é convertido em código binário e checado antes de mostrar o resultado da leitura. Os dados codificados podem ser interpretados de quatro modos: numérico, alfanumérico, byte/binário ou Kanji. Outras formas de dados podem ser mostradas com as extensões apropriadas.

 

1.7-E qual é a diferença entre QRcode e QRbar?

 

 

Ambos sao da mesma origem fazem a mesma coisa, So que o QRcode apresenta suas principais vantagens que sao:

  • guardar no QR Code símbolo, graça a sua possibilidade de armazenar verticalmente e horizontalmente os dados.
  • Com o QR Code podemos até danificar ou sujar o símbolo que ainda teremos uma leitura dele.

 

1.8-Como? mesmo ele cortado ou sem algumas partes ou ate mesmo rabiscados ainda teremos a sua leitura correta? como isso funciona?

 

 

 

 

Sim observe a tabela abaixo:
Correção de erros:
Nível L 7%
Nível M 15%
Nível Q 25%
Nível H 30%
Ou seja, podemos ter uma perda de 30% do símbolo e ainda conseguimos ter leitura completa dele.

 

 

yogore.gif

qr-code-distorcido.png

 

 

2- Requisitos

 

 

Ufa! vamos parar com a teoria e finalmente vamos para a pratica,antes de iniciarmos a criação e a leitura de QRcodes é necessario ter algumas ferramentas em nossas mãos

que no caso são os puglins (.js), algumas classes (.php) e projetos flash (.swf),abaixo estou disponibilizando os arquivos necessarios!

 

WWW.FAZERbem.com.br/demo/QRCODE_COMPLETO.zip

 

Lembre-se que iremos trabalhar em cima dessa index.php,portanto eu ja dei uma estilizada nela e fiz algumas funções "bobas em javascript" de esconder e apareçer div's
Lembre-se tambem que este projeto é somente uma carcaça,ao longo desse Topico voce irá montando o motor para essa carcaça..
2.3-Requisitos do Sistema
Antes de mais nada é necessario saber que :
  • é necessario que o javascript esteja abilitado no navegador!
  • é necessarfio que o flash da adobe esteja abilitado no navegador!

 

2.4-Mapeando Plugins

 

Ok na pasta de qrcode que voce fez download acima,existem 3 pastas

 

  • extencoes
  • swf
  • php

 

A pasta extencoes compreende todos os puglins feitos em javascript necessarios para a criação e leitura de qr codes
A pasta swf contem os arquivos que iram captar a webcam do usuario e iram transmiti-los aos puglins jquery que de lá eles iram fazer a inspeção do qr e ira ser mostrado o resultado
A pasta php contem a classe que gera por si mesma um qrcode!
3- Gerando sua propria classe de QRcode com php
Chegando a hora que todos estavam esperando vamos partir para a programação!. Pois bem na pasta aonde esta localizada a nossa carcaça iremos selecionar o projeto:
  • index_php.php

 

Dentro dele nos temos:

 

  • um formulario
  • um botão
  • Elementos html e css

 

A primeira coisa que devemos fazer é:

 

 

Construir um projeto que chame a classe php e apartir do envio do formulario existente na index,fazer com que ele pegue o campo e gere um qrcode de acordo com o que foi digitado:

 

Para isso nos iremos criar um novo arquivo .php chamado img.php, iremos salvar este arquivo dentro da pasta PHP! Ja com o arquivo aberto (index_php.php iremos alterar o action do formulario fazendo
com que ele seja enviado para o projeto img.php atraves do method POST) iremod fazer isso da seguinte forma:
<form action="php/img.php" method="POST">

voltando para o projeto img.php a primeira coisa que devemos fazer é:

 

 

 

Pegar o campo que veio atraves do metodo post e armazena-lo em uma variavel

$qrcode = $_POST['campo'];

 

 

 

incluir a classe 'phpqrcode.php'

include('phpqrcode.php');

 

 

 

Chamar a função que ira criar o QRcode no formato .png :

QRcode::png([VARIAVEL QUE SERA CONVERTIDA OU TEXTO], [CAMINHO AONDE A IMAGEM IRA SER SALVA]);

 

de acordo com o nosso tutorial eu selecionei a variavel que possue o valor do campo e o diretorio que a imagem ira ser salva:

 

QRcode::png($qrcode, '../img_php/'.$qrcode.'_qrcode.png');// ira ser salvo desta forma -> valor_do_input_qrcode.png
e automaticamente voce sera notificado de uma mensagem dizendo "Gerando arquivo", e em 3 segundos voce sera redirecionado para a index.php(lembrando para se voce
desejar apareçer mais algumas coisas mensagens dentre outras coisas,voce devera abrir a o arquivo phpqrcode.php e editar as linhas 304 e 305)
abaixo esta o codigo completa do projeto img.php
$qrcode = $_POST['campo'];
	include('phpqrcode.php');
        QRcode::png($qrcode, '../img_php/'.$qrcode.'_qrcode.png');

Vimos que o qr code foi gerado na pasta img_php,agora necessitaremos de um comando que devera pegar essas imagens e lista-las na index.php,para isso nos devemos ultilizar a função GLOB(do php)

 

1-Cria-se uma variavel aonde esta o diretorio da imagem:

$pasta = 'img_php/';

2-Criar uma variavel que ira conter o diretorio e somente ira puxar arquivos cuja extenção são: [*.jpg,*.png,*.gif,*.bmp] ultilizando a função GLOB

 

$arquivos = glob("$pasta{*.jpg,*.png,*.gif,*.bmp}", GLOB_BRACE); 

3-Devemos criar uma especie de loop aonde dentro desse loop sera listado cada imagem na tela,para isso iremos ultilizar o foreach:

foreach($arquivos as $img){

}

4-Juntando todos estes comando teremos todas as imagens listadas na tela: abaixo esta o comando completo:

 


<?php
 $pasta = 'img_php/';

 $arquivos = glob("$pasta{*.jpg,*.png,*.gif,*.bmp}", GLOB_BRACE);
 foreach($arquivos as $img){?>
<img src="<?php echo $img; ?>" title="<?php echo $img; ?>" width="150"/><br />
 <?php  
 }

?>

 

 

 

2- Gerando sua propria classe de QRcode com javascript e jquery

 

 

Tendo em aberto o projeto index.php! vimos algumas coisas ja prontas! mas somente o basico as funções ainda nao estão funcionando,como eu disse anteriormente tudo que esta necesse codigo na verdade é uma carcaça

 

o motor nos iremos montar ao longo deste topico:
A primeira coisa que iremos fazer é ir chamando os puglins para dentro da index.php,entao iremos inserir os seguintes comando abaixo da tag "<meta charset="utf-8">" localizada logo no inicio do codigo:
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="extencoes/qrcode.js"></script>
<script type="text/javascript" src="extencoes/grid.js"></script>
<script type="text/javascript" src="extencoes/version.js"></script>
<script type="text/javascript" src="extencoes/detector.js"></script>
<script type="text/javascript" src="extencoes/formatinf.js"></script>
<script type="text/javascript" src="extencoes/errorlevel.js"></script>
<script type="text/javascript" src="extencoes/bitmat.js"></script>
<script type="text/javascript" src="extencoes/datablock.js"></script>
<script type="text/javascript" src="extencoes/bmparser.js"></script>
<script type="text/javascript" src="extencoes/datamask.js"></script>
<script type="text/javascript" src="extencoes/rsdecoder.js"></script>
<script type="text/javascript" src="extencoes/gf256poly.js"></script>
<script type="text/javascript" src="extencoes/gf256.js"></script>
<script type="text/javascript" src="extencoes/decoder.js"></script>
<script type="text/javascript" src="extencoes/qrcode.js"></script>
<script type="text/javascript" src="extencoes/findpat.js"></script>
<script type="text/javascript" src="extencoes/alignpat.js"></script>
<script type="text/javascript" src="extencoes/databr.js"></script>
<script type="text/javascript" src="extencoes/camcanvas.js"></script>
<script type="text/javascript" src="extencoes/jquery.qrcode.min.js"></script>
<script type="text/javascript" src="extencoes/jquery.webcamqrcode.min.js"></script>

(obs nao vou explicar para que cada um destes puglins serve!,voce mesmo pode abri-los e estuda-los mais tarde!)

 

Agora vamos nos concentrar em criar primeiro um qrcode via javascript! para isso nos iremos localizar o input e o botao que irao realizar a função:

<input type="text" id="campo" style="border-radius:3px; border:1px #008080 solid; width:600px; height:30px; color:#C0C0C0; text-align:center; "/>
<a href="#" class="classname" onclick="novo_qrcode()">Novo QRcode</a> 

(observe que o input se tem id=campo e que no link chamado "novo QRcode" possue uma função de onclick chamada novo_qrcode() )

 

Agora devemos fazer:

 

  1. criar uma função chamada novo_qrcode()
  2. pegar o valor do input
  3. enviar esse valor para uma das classes em javascript e de la mesmo a classe retorna o qrcode no formato de canvas
function novo_qrcode(){
var campo = $('#campo').val();
jQuery(function(){
    jQuery('#output').qrcode(campo);
})
    
}

 

Temos 1 problema! "A imagem gerada nao dá para salvar,ou seja quando eu clico com o botão direito do mouse e vou em salvar imagem como... nao existe essa opção e agora?"

 

Graças aos nossos engenheiros de softwares foi criada a possibilidade de converter canvas para uma imagem normal! ufaa...para isso nos devemos:

 

1-criar um novo id para a canvas que esta dentro da div output(pois ela nao possue um id)

$('canvas').attr('id', 'canvas');

2-selecionar os elementos dessa canvas

var canvas = document.getElementById("canvas");

3-pegar os elementos dessa canvas e transforma-los para um formato image/png

var img    = canvas.toDataURL("image/png");

4-Inserir esta canvas dentro de uma imagem(ja existe uma imagem,tudo que devemos fazer e mudar o seu display para block e alterar o seu src)

$('#img').css('display', 'block');  
$('#img').attr('src', img);

abaixo esta o comando novo_qrcode()

 

function novo_qrcode(){
var campo = $('#campo').val();
jQuery(function(){
    jQuery('#output').qrcode(campo);
})

$('canvas').attr('id', 'canvas');
    var canvas = document.getElementById("canvas");
    var img    = canvas.toDataURL("image/png");
    $('#img').css('display', 'block');  
    $('#img').attr('src', img);
    

}

 

EEEII espere! temos mais um problema! se gerar novamente sera criado novos qrcodes! eu gostaria que criasse somente 1 de cada vez!

 

Isso aconteçe porque a classe a cada requisição de novos qr codes ela nao substitui a canvas anterior e sim cria-se uma nova! para contornarmos isso nos deveremos:

 

1-antes de criar um qrcode devera existir um comando que verifique se dentro da div output existe alguma coisa

 

var imagem = document.getElementById('output').innerHTML;
if(imagem == ""){
// insere aqui os comando que irao criar um novo qrcode
}

2- se existir alguma coisa dentro da div! nos iremos apagar e mandar executar a função novo_qrcode novamente:

 

else{
document.getElementById('output').innerHTML = "";
novo_qrcode();
}

abaixo esta o comando novo_qrcode()

 

function novo_qrcode(){
var imagem = document.getElementById('output').innerHTML;
var campo = $('#campo').val();
if(imagem == ""){
jQuery(function(){
    jQuery('#output').qrcode(campo);
})
$('canvas').attr('id', 'canvas');
    var canvas = document.getElementById("canvas");
    var img    = canvas.toDataURL("image/png");
    $('#img').css('display', 'block');  
    $('#img').attr('src', img);
    
}else{
document.getElementById('output').innerHTML = "";
novo_qrcode();
}
}

 

Funcionou!! maaas esta apareçendo 2 qrcodes iguais! mas porque isso?

 

Ele retorna 2 pois o primeiro como vimos é gerado pela classe em formato de canvas,ja o segunda é a canvas convertida em uma imagem,se quiser burlar isso e somente gerar a imagem envez da canvas
é necessario colocar um display none dentro da div output!,dessa forma:
<div id="output" style="display:none"></div>

 

 

3- Criando QRcodes ultilizando o API da Google

 

 

Bem pra voce que é aquela pessoa que gosta de tudo mais facil,e menos quantidade de arquivos em seus projetos,a google disponibiliza a criação de qr codes,nao vou entrar em muuuitos detalhes por aqui

pelo fato de ser uma coisa simples!abaixo esta localizado o comando que gera o QRcode apartir do API da google:

<?php
$url = $_POST["campo"]; // pega o valor do input atraves do $_POST
    function qrcode($url, $size){
        if($url && $size = "250"){
        return "http://chart.apis.google.com/chart?cht=qr&chl=".$url."&chs=".$size."x".$size."";
        }
        }// Realiza funcções como tamanho e envia a variavel $url que no caso armazena o input para o site a google e de lá ele gera o qr code
?>    

<html>
<body style="margin: 0px;">
    <img style="-webkit-user-select: none" src="<?php echo qrcode($url,$size); ?>"> // retorna o QRcode gerado pela google em formato de uma imagem
</body>
</html>  

 

Lembre-se que,este API para funcionar perfeitamente deve estar conectado a internet,entao voce que pensa ultilizar este comando offline ou em uma intranet,pode esqueçer!

 

 

4- Lendo QRcodes com php

 

Desculpe mas infelismente nao consegui achar uma classe feita em php que seja capaz de decodificar o qrcode.

 

5- Lendo QRcodes com jquery

 

Voltando no nosso projeto index.php a primeira coisa que nos iremos fazer é lozalizar os seguintes comandos:

<input id="input" type="file" onclick="apaga_campo()">
<a href="#" id="btnDecode" class="classname">Ler QRcode</a>

A segunda coisa é criar uma função em javascript que irá verificar se o link chamado 'Ler QRcode' foi clicado:

$(document).ready( function() {
$("#btnDecode").click(qrCodeDecoder); // #btnDecode pois o id do link acima tambem se chama #btnDecode ;)
});

A terceira coisa e criar uma função chamada qrCodeDecoder,pois como vimos acima o codigo acima chama essa função!

function qrCodeDecoder(){
}

 

Agora que temos a função criada iremos dar uma pausa nessa função e deixa-la em espera! enquanto deixamos ela espera devemos fazer o seguinte -> com que assim que o input abaixo :

 

<input id="input" type="file" onclick="apaga_campo()">

 

selecionar um arquivo,o javascript automaticamente pegue esta imagem e mostre na tela! sem uso de upload nenhum! para isso nos devemos inserir uma função que verifique:

 

  • caso o conteudo do input for alterado automaticamente o jquery pegue esta imagem converta para base64 e gere uma imagem:

 

$('#input').change(function() { // assim que o campo for alterado faça:
    
    var fr = new FileReader; // leia o arquivo e armazene na variavel fr 
    
    fr.onload = function() {// enquanto a variavel fr estiver carregando faça:
        var img = new Image;// cria uma variavel imagem chamada img e diga a ela que uma nova imagem estara por vir
        
        img.src = fr.result; // aqui ele gera a imagem em formato base 64
        

           $('<img style="border-radius:5px; border:1px #FFD42A solid; width:180px; height:180px;" id="imgs" src="'+img.src+'"/>').insertAfter('#cvs');
    };// manda o jquery criar uma imagem cuja src sera a imagem convertida em base64,diga ao jquery que ele deverá inserir este comando antes da div cvs
    
    fr.readAsDataURL(this.files[0]);// gera uma imagem
    
});// finaliza tudo com a imagem ja gerada!

 

aproveitando e fazendo uma arrumação nesse codigo,o comando devera estar escrito da seguinte maneira:

 

$(document).ready( function() {
$('#input').change(function() {
    
    var fr = new FileReader;
    
    fr.onload = function() {
        var img = new Image;
        
        img.src = fr.result;

           $('<img style="border-radius:5px; border:1px #FFD42A solid; width:180px; height:180px;" id="imgs" src="'+img.src+'"/>').insertAfter('#cvs');
    };
    
    fr.readAsDataURL(this.files[0]);
    
});
   
   qrcode.callback = showInfo;
    $("#btnDecode").click(qrCodeDecoder); // a função click do botao tambem foi inserida aqui dentro!
	
  })

 

Eii mais espere ha um problema aqui!! se voce selecionar mais de 1 imagem no input ele vai duplicando as imagens na tela envez de substituir!

 

Vejo que aconteçeu o mesmo problema que teve antes com a criaçao de QRcodes! estao lembrados? ok para contornar isso voce ja deve ter percebido que no input:

 

<input id="input" type="file" onclick="apaga_campo()">

há uma função no onclick chamada apaga_campo().. é isso mesmo que devemos fazer!

 

  • criar uma função javascript que remova todos os elementos cujo id é igual a #imgs,ou seja ele remove todos os elementos que foi gerado pelo jquery como uma image:

 

function apaga_campo(){
$('#imgs').remove();
}

 

so há um problema!! este comando nao funciona no opera,firefox,safari,explorer ele nao gera uma imagem! o unico navegador que funciona perfeitamente é o google chrome mas pq ele nao funciona nos outros?

 

sim pois por alguns motivos alguns navegadores nao conseguem ou simplismente nao suportam esse tipo de geração de imagem!,entao a unica coisa possivel a se fazer é:

 

  1. Inetgrar um sistema de upload de imagens! assim que a imagem for salva localmente ela devera ser pega ! depois colocada na imagem e ai sim ele poderia ler sem algum problema!

 

Agora que funciona perfeitamente ja podemos tirar a nossa função qrCodeDecoder() do estado de espera e coloca-la em andamento..iremos inserir dentro dele

 

1-Pegar a imagem gerada pelo jquery vinda apartir de um input

 

 

var imagem = $('#imgs').attr('src');

2- enviar a imagem para o puglin para fazer a analise do QRcode

 

    qrcode.decode(imagem);

nisso a nossa function ficara da seguinte forma:

 

function qrCodeDecoder(){
  var imagem = $('#imgs').attr('src');
  
    qrcode.decode(imagem);
  }

Agora iremos ultilizar um comando javascript que sera responsavel por nos dizer o resultado da leitura do QRcode iremos inserir a seguinte função:

 

function showInfo(data){
    alert(data);
  }

e por fim! Nosso leitor de QRcodes esta funcionando perfeitamente sem nenhum problema!

 

Final- Lendo QRcodes atraves da Webcam com jquery e flash

 

Ufa! ainda bem que nosso tutorial esta chegando ao fim ja estou super cansado de dar tantas explicações detalhadamente...!

 

Agora iremos inserir o ultimo comando javascript que fará a leitura do qr code apartir de uma webcam,o comando é este abaixo:
<script>
(function($){
	$('document').ready(function(){
		$('#qrcodebox').WebcamQRCode({
			onQRCodeDecode: function( p_data ){
					$('#qrcode_result').html( p_data );
			}
		});
		
		$('#btn_start').click(function(){
			$('#qrcodebox').WebcamQRCode().start();
		});
		
		$('#btn_stop').click(function(){
			$('#qrcodebox').WebcamQRCode().stop();
		});
	});
})(jQuery);
</script>

 

DEMO

 

para ver o codigo funcionando perfeitamente acesse o link abaixo:

 

 

 

DOWNLOAD

 

para fazer download do codigo completo acesse o link abaixo:

 

 

 

 

E é isso ai pessoal esperam que voces tenham gostado,nao deixem de comentar caso estiverem alguma duvida sobre a implementação do codigo! e nao deixem de dar reputação caso tenham gostado! abraços pessoal e ate a proxima! ;)



(Observação: nao garanto que este 2 metodos de QRcodes consigam ler tooooodos os QRcodes!,ou seja nao posso garantir que ele consiga decifrar qualquer QRcodes! Em todos os testes que fiz ele reconheceu todos de boa!...o Qrcode nao consegue ler alguns carecteres especiaistais como acentos dentre outros)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa contribuição

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia pessoal, realmente o código ajudou muitoo mesmo, so estou com um problema,

quando faço a leitura via webcam preciso que o valor resultado da leitura do qr code seja colocando dentro de um input text para postagem, porem isso não estou conseguindo fazer, faz 1 semana que revirei o código todo porem não consegui fazer, alguem ai teria uma luz no fim do tunel?

obrigado a todos desde já!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, parece bem completo, mas infelizmente não consigo testar pois o link com os arquivos está fora. Poderia disponibiliza-lo novamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.