Rezepte

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

Weitere Beispiele für die Verwendung von pyStrich finden Sie in unserem Repository.

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