QR-Code Label Generator fuer Paperless-ngx ASN-Labels (Archive Serial Number). Generiert druckfertige PDF-Boegen mit QR-Codes und lesbarem ASN-Text - fuer jedes beliebige Etikettenformat und jeden Drucker.
Im Gegensatz zu anderen ASN-Generatoren, die nur ein festes Etikettenformat unterstuetzen (z.B. Avery L4731), ist dieses Projekt vollstaendig konfigurierbar: Label-Groessen, Raster, Raender, Drucker-Skalierung und Offset lassen sich frei definieren - ueber das Web-Frontend oder per YAML.
| Labels erstellen | Generierte PDFs |
|---|---|
![]() |
![]() |
| Setup-Profile | Drucker-Profile |
|---|---|
![]() |
![]() |
- Beliebige Etikettenformate - Topstick, Avery, Herma, Zweckform oder jedes andere Raster-Etikett
- Jeder Drucker - Individuelle Kalibrierung mit automatischer Skalierungsberechnung
- Web-Frontend mit Dark Mode UI und Sidebar-Navigation
- Setup-Profile - Konfiguriere einmal, nutze immer wieder
- Drucker-Kalibrierung - Kompensiert druckerspezifische Abweichungen automatisch
- Offset-Korrektur - Feinabstimmung fuer exakte Positionierung auf dem Bogen
- Per-Run Overrides - Drucker, Format, Startposition etc. pro Generierungslauf anpassen
- ASN-Text unter QR-Code - Nummer auch ohne Scanner lesbar
- Mehrere Drucker - Verschiedene Drucker-Profile mit eigener Kalibrierung
- PDF-Verwaltung - Download und Loeschen direkt im Web-Frontend
- CLI-Zugang - Auch per Kommandozeile nutzbar
- Python 3.8+
- Apache 2.4 mit PHP 8.x (fuer Web-Frontend)
# 1. Dateien kopieren
sudo mkdir -p /opt/qr_codes
sudo cp -r * /opt/qr_codes/
cd /opt/qr_codes
# 2. Python-Umgebung
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 3. Apache konfigurieren
sudo cp /opt/qr_codes/docs/qrcodes.conf /etc/apache2/conf-available/
sudo a2enconf qrcodes
sudo systemctl reload apache2
# 4. Berechtigungen
sudo chown -R www-data:www-data /opt/qr_codes/config /opt/qr_codes/outputDas Web-Frontend ist dann erreichbar unter http://<server-ip>/qr_codes/.
Das Frontend hat vier Bereiche:
- Setup-Profil auswaehlen
- Info-Panel zeigt aktuelle Einstellungen (Drucker, Format, Skalierung, Offset)
- Optionale Overrides pro Generierungslauf (anderer Drucker, Format, Startposition, ASN-Prefix)
- Start/End ASN-Nummer angeben
- PDF wird generiert und unter "PDFs" gespeichert
- Liste aller generierten PDFs mit Dateigroesse und Datum
- Download und Loeschen
- Setup-Profile anlegen und bearbeiten
- Jedes Profil verbindet Drucker + Label-Format + Workflow-Einstellungen
- Workflow: Startposition, ASN-Format, Rahmen ein/aus
- Drucker-Profile mit Kalibrierungsdaten anlegen
- Raender, Skalierung (gemessene Breite/Hoehe), Offset
- Profile koennen geloescht werden
# Mit Setup-Profil
qr-labels --setup standard --start 1 --end 65 --output labels.pdf
# Test-Blatt
qr-labels --setup test --test-sheet
# Setups auflisten
qr-labels --list-setupsqr_codes/
├── bin/
│ └── qr_label_generator.py # CLI-Hauptprogramm
├── config/
│ ├── setup_profiles.yaml # Setup-Profile
│ ├── printer_profiles.yaml # Drucker-Profile
│ └── label_formats.yaml # Label-Formate (Topstick 8697)
├── lib/
│ ├── qr_generator.py # QR-Code Erzeugung
│ ├── setup_manager.py # Profil-Verwaltung
│ └── pdf_builder.py # PDF-Erzeugung mit Skalierung
├── web/
│ ├── index.php # Web-Frontend
│ ├── download.php # PDF-Download Handler
│ └── assets/
│ ├── style.css # Dark Mode CSS
│ └── app.js # Frontend JavaScript
├── output/ # Generierte PDFs
├── docs/screenshots/ # Screenshots
├── requirements.txt
└── docker-compose.yml # Paperless-ngx Setup
Das Projekt wird mit Topstick 8697 als Beispiel ausgeliefert, unterstuetzt aber jedes beliebige Raster-Etikett. Neue Formate werden einfach in config/label_formats.yaml definiert:
mein-etikett:
name: "Mein Etikett"
page_width: 210 # Seitenbreite in mm (A4 = 210)
page_height: 297 # Seitenhoehe in mm (A4 = 297)
label_width: 38 # Etikettenbreite in mm
label_height: 21.2 # Etikettenhoehe in mm
columns: 5 # Anzahl Spalten
rows: 13 # Anzahl Zeilen
margin_left: 5 # Seitenrand links in mm
margin_top: 5 # Seitenrand oben in mm
gap_horizontal: 0 # Abstand zwischen Spalten in mm
gap_vertical: 0 # Abstand zwischen Zeilen in mm
qr_size_percent: 75 # QR-Code Groesse relativ zum Etikett| Format | Groesse | Raster | Labels/Seite |
|---|---|---|---|
| Topstick 8697 | 38.1 x 21.2mm | 5 x 13 | 65 |
| Avery L4731 | 25.4 x 10mm | 7 x 27 | 189 |
| Avery L4732 | 35.6 x 16.9mm | 5 x 16 | 80 |
| Herma 4210 | 38.1 x 21.2mm | 5 x 13 | 65 |
| Zweckform 3666 | 38 x 21.2mm | 5 x 13 | 65 |
| Herma 10001 | 25.4 x 10mm | 7 x 27 | 189 |
Jedes Etikett mit regelmaessigem Raster laesst sich verwenden - einfach die Masse vom Datenblatt des Herstellers uebernehmen.
Jeder Drucker hat eigene Abweichungen bei Skalierung und Positionierung. Der Generator kompensiert das automatisch:
Fuer jeden Drucker wird ein eigenes Profil mit Kalibrierungsdaten angelegt:
- Raender - Nicht bedruckbarer Bereich des Druckers (links, rechts, oben, unten)
- Skalierung - Gemessene Breite/Hoehe eines Testdrucks vs. Soll-Werte
- Offset - Feinverschiebung in X/Y-Richtung fuer millimetergenaue Positionierung
- Test-Blatt drucken - Mit aktivierter Rahmen-Option (zeigt Label-Grenzen)
- Messen - Tatsaechliche Breite und Hoehe des Drucks mit Lineal messen
- Werte eintragen - Im Drucker-Profil (Web-Frontend oder YAML)
Das System berechnet automatisch die Skalierungsfaktoren. Beispiel:
Soll-Breite: 190mm Gemessen: 182mm --> Scale X = 1.044 (+4.4%)
Soll-Hoehe: 275.6mm Gemessen: 265mm --> Scale Y = 1.040 (+4.0%)
So passen die Labels auf jedem Drucker exakt auf die Etiketten - egal ob Laser, Tintenstrahl oder Buero-MFP.
Die generierten QR-Codes enthalten den ASN-String (z.B. ASN00001). Paperless-ngx erkennt diese beim Scannen automatisch und weist die Archivnummer zu.
Docker Compose fuer Paperless-ngx ist enthalten:
docker-compose up -dWenn dir dieses Projekt gefaellt, kannst du mich gerne unterstuetzen:
MIT




