![Wie kann ich QR-Codes mit Untertiteln generieren?](https://rvso.com/image/192246/Wie%20kann%20ich%20QR-Codes%20mit%20Untertiteln%20generieren%3F.png)
Ich muss mehrere tausend QR-Codes mit einfachen IDs (1234, 1235, 1236, ...) generieren und möchte sie auch für Menschen lesbar machen. qrencode
ist ein wirklich cooles Tool zum Generieren von QR-Codes, ABER es gibt dort keine Möglichkeit, Untertitel hinzuzufügen.
Irgendwelche Ideen?
Antwort1
Erstellen Sie ein Bild mit dem Text und hängen Sie diesen an das Bild an:
#!/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"
Antwort2
Imagemagics convert
zur Rettung:
- QR-Code generieren mit
qrencode
(PNG ausgeben, SVG funktioniert mit Konvertieren nicht, glaube ich) - Generieren Sie ein PNG-Bild aus einem String mit
convert
- Bilder mit convert anhängen
Hier das Skript dazu:
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 hat Punkte in den Nullen, was es gut lesbar macht, es kann noch weitere geben. 1 und kleines L und die üblichen Verdächtigen sind auch gut erkennbar.
Antwort3
Wenn Sie das SVG-Format beibehalten möchten, scheint es nicht allzu schwierig zu sein, die XML zu bearbeiten, um <text>
am Ende der Datei ein neues Element hinzuzufügen. Ich kenne mich mit SVG nicht gut genug aus, um dies auf eine Standardmethode zu tun, aber wenn man sich ansieht, wie die Datei aussieht, wenn man mit einem SVG-Editor eine Textzeile hinzufügt, awk
könnte das folgende Skript für das von Ihnen angegebene Beispiel ausreichen.
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}
'
Dies ist komplexer als wirklich nötig, um etwas allgemeiner zu sein.
Es nimmt das Original <svg width="10.23cm" height="10.23cm" viewBox="0 0 29 29" ...
und skaliert die Höhe und die 4. ViewBox-Werte um 10 %, sodass es wird <svg width="10.23cm" height="11.23cm" viewBox="0 0 29 33" ...
.
Es nimmt dann das weiße Rechteck im Hintergrund und vergrößert die Höhe in ähnlicher Weise von <rect ... height="29"
auf <rect ... height="33"
.
Abschließend wird <text...>
vor dem Ende eine Zeile hinzugefügt, wobei als x- und y-Positionen die aus der viewBox ermittelten Werte verwendet werden. text-anchor="middle"
Der Text wird auf diese Koordinate zentriert.