![Como posso gerar QR Codes com legendas?](https://rvso.com/image/192246/Como%20posso%20gerar%20QR%20Codes%20com%20legendas%3F.png)
Preciso gerar vários milhares de códigos QR de IDs simples (1234, 1235, 1236, ...) e quero também torná-los legíveis por humanos. qrencode
é uma ferramenta muito legal para gerar códigos QR, MAS não há como adicionar uma legenda lá.
Alguma ideia?
Responder1
Crie uma imagem com o texto e anexe-a à imagem:
#!/bin/bash
txt="$1"
qrencode -o "$txt".png "$txt"
convert -pointsize 36 "label:$txt" "$txt.gif"
convert -append "$txt".png "$txt.gif" "$txt.total.gif"
Responder2
Imagemmagics convert
para o resgate:
- gerar QR Code com
qrencode
(saída PNG, SVG não funciona com conversão, eu acho) - gerar imagem png a partir de string com
convert
- anexe as imagens com convert
Aqui o script para isso:
for i in $(cat ../input.csv); do
qrencode $i -t png -l H -s 10 -o $i.q.png;
convert -size 290x40 xc:white -pointsize 34 -gravity center -font /usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf -draw "text 0,0 '$i'" $i.s.png;
convert -append $i.q.png $i.s.png $i.png; rm $i.q.png; rm $i.s.png;
echo $i;
done;
DejaVuSansMono.ttf possui pontos entre zeros, o que o torna bem legível, pode haver outros. 1 e L minúsculo e os suspeitos do costume também são bem discerníveis.
Responder3
Se você quiser manter o formato svg, parece que não é tão difícil editar o xml para adicionar um novo <text>
elemento ao final do arquivo. Não conheço SVG o suficiente para fazer isso de uma maneira padrão, mas observando a aparência do arquivo quando você usa um editor SVG para adicionar uma linha de texto, o awk
script a seguir pode ser suficiente para o exemplo que você deu.
i=1234
qrencode "$i" -t svg -l H -s 10 -o "$i.q.svg.orig"
awk <"$i.q.svg.orig" >"$i.q.svg" -v txt="$i" '
/<svg /{ match($0,"height=\"([0-9.]+)",grp)
ht = grp[1]*1.1
ht = "height=\"" ht
sub("height=\"([0-9.]+)",ht,$0)
match($0,"viewBox=\"0 0 ([0-9]+) ([0-9]+)",grp)
vb = int(grp[2]*1.1+.5)
x = int(grp[1]/2+.5)
y = grp[2]+1
vb = "viewBox=\"0 0 " grp[1] " " vb
sub("viewBox=\"0 0 ([0-9]+) ([0-9]+)",vb,$0)
}
/<rect x="0" /{
match($0,"height=\"([0-9.]+)",grp)
ht = int(grp[1]*1.1+.5)
ht = "height=\"" ht
sub("height=\"([0-9.]+)",ht,$0)
}
/<\/svg>/{
printf " <text font-family=\"Helvetica, sans-serif\" font-size=\"6\" stroke-width=\"0\" text-anchor=\"middle\" x=\"%d\" y=\"%d\" xml:space=\"preserve\">%s</text>",x,y,txt
}
{print}
'
Isto é mais complexo do que realmente necessário, para ser um pouco mais genérico.
Ele pega o inicial <svg width="10.23cm" height="10.23cm" viewBox="0 0 29 29" ...
e aumenta os valores de altura e 4º viewBox em 10% para que se torne <svg width="10.23cm" height="11.23cm" viewBox="0 0 29 33" ...
.
Em seguida, ele pega o retângulo branco de fundo e aumenta a altura de forma semelhante de <rect ... height="29"
para <rect ... height="33"
.
Por fim, ele adiciona uma <text...>
linha antes do final, usando como posições x e y os valores encontrados na viewBox. Centraliza text-anchor="middle"
o texto nesta coordenada.