Rezepte

Gängige Muster für die Verwendung von pyStrich in realen Anwendungen.

Für einmalige Erzeugung aus einer Shell siehe Kommandozeilen-Schnittstelle.

Barcodes aus einer Web-Anfrage ausliefern

Jeder Encoder hat eine get_imagedata()-Methode, die das PNG als bytes-Objekt zurückgibt, geeignet zum direkten Zurückstreamen an einen Client, ohne das Dateisystem zu berühren.

Mit Flask:

from flask import Flask, Response
from pystrich.code39 import Code39Encoder

app = Flask(__name__)

@app.route("/barcode/<text>")
def barcode(text):
    encoder = Code39Encoder(text)
    return Response(encoder.get_imagedata(), mimetype="image/png")

Dasselbe Muster gilt für FastAPI, Django oder jedes andere Framework – der Encoder erzeugt rohe PNG-Bytes, die mit dem Content-Type image/png zurückgegeben werden können.

Barcodes in großer Menge erzeugen

Jeder Encoder erstellt ein frisches Symbol; es gibt keinen gemeinsamen Zustand, der zwischen Aufrufen zurückgesetzt werden müsste. Um viele Barcodes zu erzeugen, iterieren Sie über Ihre Eingaben:

from pathlib import Path
from pystrich.code128 import Code128Encoder

out = Path("labels")
out.mkdir(exist_ok=True)

for sku in ["A1266470501", "A1268206342", "A0001513255"]:
    Code128Encoder(sku).save(out / f"{sku}.png")

Die Ausgabe zur Weiterverarbeitung in Pillow laden

Um einen Barcode auf eine Etikettenvorlage zu montieren, rufen Sie get_pilimage() auf, um direkt ein PIL.Image.Image zu erhalten:

from PIL import Image
from pystrich.datamatrix import DataMatrixData, DataMatrixEncoder

payload = DataMatrixData("EMMETT", encoding="ascii")
barcode = DataMatrixEncoder(payload).get_pilimage(cellsize=8)

label = Image.new("RGB", (400, 200), "white")
label.paste(barcode, (20, 20))
label.save("label.png")

Ausgabe im Speicher

Jeder Encoder hat In-Memory-Methoden sowohl für Raster- als auch für Vektorausgabe. get_imagedata() gibt PNG-Bytes zurück (das In-Memory-Äquivalent von save()); get_svg() gibt eine SVG-Zeichenkette zurück (das In-Memory-Äquivalent von save_svg()).

from pystrich.qrcode import QRCodeEncoder

encoder = QRCodeEncoder('{"institution": "New York University", "major": "Philosophy"}')

png_data = encoder.get_imagedata()   # bytes -- attach to an email, store in a database
svg_markup = encoder.get_svg()       # str  -- embed directly in an HTML response

Barcodes als Data-URLs in Templates einbetten

Jeder Encoder hat die Methoden svg_dataurl() und png_dataurl() (cellsize für 2D, bar_width für 1D), die in einem Aufruf einen data:-URL-String zurückgeben. Registrieren Sie einen schlanken Wrapper bei Ihrer Template-Engine, um Barcodes direkt in das gerenderte HTML einzubetten.

Flask / Jinja2

from flask import Flask
from pystrich.ean13 import EAN13Encoder
from pystrich.qrcode import QRCodeEncoder

app = Flask(__name__)


@app.template_filter("ean13_dataurl")
def ean13_dataurl(code):
    return EAN13Encoder(code).svg_dataurl()


@app.template_filter("qr_dataurl")
def qr_dataurl(text):
    return QRCodeEncoder(text).svg_dataurl(cellsize=4)

Dann in einem Template:

<img src="{{ product.gtin | ean13_dataurl }}" alt="EAN-13 for {{ product.name }}">
<img src="{{ product.url | qr_dataurl }}" alt="QR code">

Django

Definieren Sie den Filter in einem templatetags-Modul unter <app>/templatetags/pystrich_filters.py (mit einer __init__.py in templatetags/, damit Django ihn erkennt):

from django import template
from django.template.defaultfilters import stringfilter

from pystrich.qrcode import QRCodeEncoder

register = template.Library()


@register.filter
@stringfilter
def qr_dataurl(text):
    return QRCodeEncoder(text, ecl="H").svg_dataurl(cellsize=8)

Dann in einem Template:

{% load pystrich_filters %}
<img src="{{ product.url|qr_dataurl }}" alt="QR code for {{ product.name }}">

Eine Kontaktkarte codieren

Ein QR-Code mit einer vCard ermöglicht es einem Telefon, das Speichern des Kontakts anzubieten. vCard ist reiner Text – bauen Sie ihn direkt auf, mit CRLF-Zeilenenden:

from pystrich.qrcode import QRCodeEncoder

vcard = (
    "BEGIN:VCARD\r\n"
    "VERSION:3.0\r\n"
    "FN:Red\r\n"
    "TEL:+14175550142\r\n"
    "END:VCARD\r\n"
)
QRCodeEncoder(vcard).save("red.png")
QR-Code mit einem vCard-Kontakt für Red

Tipp

Um die vCard nicht von Hand zu bauen, erzeugen Sie sie mit vobject.

Einen Standort codieren

Das geo:-URI-Schema (RFC 5870) trägt ein Breiten-/Längengrad-Paar, das Scanner in einer Karten-App öffnen:

from pystrich.qrcode import QRCodeEncoder

QRCodeEncoder("geo:37.335278,-94.302222").save("location.png")
QR-Code mit Geokoordinaten