Ideen für die schnellere Beschaffung von Schulmaterialien

vorhergehende Artikel in: Java Komponenten OpenSource
03.08.2025

Ich wurde auf ein Problem hingewiesen, das in meiner Welt bisher noch nie vorkam: Jedes Jahr erhält man als Eltern eine Liste von Dingen, die für die lieben Kleinen anzuschaffen sind, damit sie in der Schule mitarbeiten können.

All das anzuschaffen kann (Originalzitat) ganz schön nerven - vor allem, wenn man versucht, das im Büroausstatter des Vertrauens zu finden, wenn währenddessen auch 50 andere Eltern dasselbe tun - nur mit minimal anderen Listen weil andere Klassenstufe und/oder Schule. Das Problem potenziert sich noch, wenn man als Eltern gleichzeitig mehrere schulpflichtige Kinder hat, die alle ihre eigenen Listen mitbringen.

Es gibt nun verschiedene Möglichkeiten, dieses Problem zu lösen: Man tankt sich einfach durch, man setzt sich nervtötende Stunden an den Rechner oder Smartphone, um sich alles online zusammenzuklicken, man hat liebe Bekannte, die das für einen übernehmen oder man benutzt einen Service eines Online-Händlers, der es erlaubt, die Liste zu scannen und den Warenkorb mit den (hoffentlich richtig) erkannten Dingen des schulischen Bedarfs bestückt.

dWb+ Logo Bei der letzten Lösung bin ich imer ein wenig skeptisch: Kriege ich da das günstigste Angebot? sind da versteckte Haken und Fallstricke eingebaut? Da ich ja ein Befürworter digitaler Souveränität bin, hat dieses Problem in mir gearbeitet und dazu geführt, das Projekt tesseractuzneditor zu überholen und zu aktualisieren. Dadurch war ich dann auch in der Lage, OCR-Funktionalität in dWb+ anzubieten - diesen Aspekt der Anwendung wollte ich bereits seit einiger Zeit überarbeiten.

Also besorgte ich mir einige Beispiele solcher Listen und wendete die OCR darauf an - das ergab zunächst einmal eine Liste von Punkten, die idealerweise mit je einem zu beschaffenden Ding korrespondieren sollte. Ein wenig Skriptmagie später war es dann geschafft: Für jeden einzelnen Punkt auf der Liste wurde ein neuer Browsertab geöffnet, in dem entsprechende Suchtreffer angezeigt wurden. Das funktionierte mit der Google-Suche

https://www.google.com/search?q=6+Hefte+DIN+A4+liniert%252C+Lineatur+25

Oder bei der Google-Produktsuche:

https://www.google.com/search?sclient=gws-wiz-modeless-products&q=6+Hefte+DIN+A4+liniert%2C+Lineatur+25

Oder bei anderen Suchmaschinen:

https://www.qwant.com/?q=6+Hefte+DIN+A4+liniert%252C+Lineatur+25

Oder bei online-Kaufhäusern:

https://www.mueller.de/search/?q=6+Hefte+DIN+A4+liniert%252C+Lineatur+25

Oder bei Vergleichsportalen:

https://www.idealo.de/preisvergleich/MainSearchProductCategory.html?q=6+Hefte+DIN+A4+liniert%2C+Lineatur+25

Oder, oder, oder...

Ein praktisches Beispiel gefällig? Nun, mit dieser Liste (Quelle)

Screenshot Eine Beispielliste zur Beschaffung

und der folgenden Regionsdefinition

102	77	1138	726	Region_1

ermittelt das Beispielprogramm zunächst einmal den Textinhalt

[
  {
    "confidence": -1,
    "w": 1138,
    "name": "Region_1",
    "x": 102,
    "h": 726,
    "y": 77,
    "text": "6 Hefte DIN A4 liniert, Lineatur 25\n\n5 Hefte DIN A4 liniert, Lineatur 27\n\n5 Hefte DIN A4 kariert, Lineatur 26\n\n5 Hefte DIN A4 kariert, Lineatur 28\n\n3 spaltiges Vokabelheft DIN A 4 (2x
)\n\nCollegeblock DIN A4 kariert und liniert mit Rand\nGeodreieck und ein 30 cm Lineal\n\nZeichenblock DIN A3\n\nSammelmappe DIN A 3\n\n12er Farbkasten mit Deckweiß (Markenqualität)\n\nPinsel in verschied
enen Größen (Borsten- u. Haarpinsel)\nMäppchen: Füller, Holzstifte, 2 Bleistifte Stärke B oder HB, Schere, Klebestift, Spitzer,\nRadiergummi, Tintenpatronen (blau)\n\nFineliner in rot, blau, grün, gelb, s
chwarz\n\nTextmarker in verschiedenen Farben\n\nGünstige Kopfhörer beispielsweise für Hörverstehen",
    "zIndex": 0
  }
]

Und daraus werden die einzelnen Zeilen extrahiert, daraus die gewünschte URL erstellt und mit dieser im Browser des Vertrauens ein Tab geöffnet, wo man das Gewünschte dann nur noch mit einem Klick in den Warenkorb befördern muss!

https://www.mueller.de/search/?q=6 Hefte DIN A4 liniert, Lineatur 25
https://www.mueller.de/search/?q=5 Hefte DIN A4 liniert, Lineatur 27
https://www.mueller.de/search/?q=5 Hefte DIN A4 kariert, Lineatur 26
https://www.mueller.de/search/?q=5 Hefte DIN A4 kariert, Lineatur 28
https://www.mueller.de/search/?q=3 spaltiges Vokabelheft DIN A 4 (2x)
https://www.mueller.de/search/?q=Collegeblock DIN A4 kariert und liniert mit Rand
Geodreieck und ein 30 cm Lineal
https://www.mueller.de/search/?q=Zeichenblock DIN A3
https://www.mueller.de/search/?q=Sammelmappe DIN A 3
https://www.mueller.de/search/?q=12er Farbkasten mit Deckweiß (Markenqualität)
https://www.mueller.de/search/?q=Pinsel in verschiedenen Größen (Borsten- u. Haarpinsel)
Mäppchen: Füller, Holzstifte, 2 Bleistifte Stärke B oder HB, Schere, Klebestift, Spitzer,
Radiergummi, Tintenpatronen (blau)
https://www.mueller.de/search/?q=Fineliner in rot, blau, grün, gelb, schwarz
https://www.mueller.de/search/?q=Textmarker in verschiedenen Farben
https://www.mueller.de/search/?q=Günstige Kopfhörer beispielsweise für Hörverstehen

Hier der Vollständigkeit halber noch das kurze Programm dazu:

import java.io.IOException;
import org.json.JSONException;
import org.slf4j.event.Level;
import de.elbosso.algorithms.image.TesseractBackend;

public class OcrTester extends java.lang.Object { private final static org.slf4j.Logger CLASS_LOGGER =org.slf4j.LoggerFactory.getLogger(OcrTester.class); private final static org.slf4j.Logger EXCEPTION_LOGGER =org.slf4j.LoggerFactory.getLogger("ExceptionCatcher");

public static void main(java.lang.String[] args) throws IOException, JSONException { java.io.File dir=new java.io.File(DLLPATH); java.io.File[] dlls=dir.listFiles(); for(java.io.File dll:dlls) { try{ System.load(dll.getCanonicalPath()); }catch(java.lang.Throwable t){} } de.elbosso.util.Utilities.configureBasicStdoutLogging(Level.DEBUG); java.util.Properties config=new java.util.Properties(); java.io.InputStream is=de.netsysit.util.ResourceLoader.getResource(CONFIGPROPERTIES).openStream(); config.load(is); is.close(); TesseractBackend be=new TesseractBackend(config); java.io.File f=new java.io.File(IMAGEFILE); java.io.File uznFile=new java.io.File(REGIONDEFINITION); java.awt.image.BufferedImage bimg=javax.imageio.ImageIO.read(f); java.util.List<de.elbosso.algorithms.image.OcrRegion>regions=be.readUznFile(uznFile,0); java.lang.String found=be.scanForPresentRegionsAsJson(bimg, regions).getJSONObject(0).getString("text"); java.lang.String[] parts=found.split("\\n\\n"); for(int i=0;i<parts.length;++i) { java.net.URL url=new java.net.URL("https://www.mueller.de/search/?q="+parts[i]); System.out.println(url); de.netsysit.util.lowlevel.BareBonesBrowserLaunch.openURL(url.toString()); } } }

Artikel, die hierher verlinken

sQLshell Version 7.9pre1 build 11189

30.11.2025

Eine neue Version der sQLshell ist verfügbar!

Alle Artikel rss Wochenübersicht Monatsübersicht Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • xBrowserSync in Docker

    29.03.2021

    Nachdem ich schon längere Zeit nicht mehr über neue Dienste in meinem Docker-Zoo berichtet habe, habe ich in der vergangenen Woche wieder einmal einen Neuzugang begrüßen dürfen...

    Weiterlesen

Neueste Artikel

  • Asymmetrische Kryptographie

    Ich habe mich mit der Idee schon länger getragen: Nochmal einen Rundumschlag zu asymmetrischer Kryptographie zu machen. Dabei werde ich mich auf Demonstrationen der einzelnen Konzepte und Operationen mit Beispielcode konzentrieren und zu jedem der vorgestellten Konzepte mehr oder weniger ausführlich bezüglich der Einsatzszenarien und Vor- und Nachteile Stellung beziehen

    Weiterlesen
  • Windows? Nur noch gegen Bezahlung!

    Ich habe mich nun völlig von Windows - der armseligen Ausrede für ein Computerbetriebssystem aus Redmond - abgenabelt

    Weiterlesen
  • Vergleich Analoger und Digitaler Identitäten

    Eine Präsentation zum besseren Verständnis der Konzepte hinter digitalen Identitäten

    Aktualisierung vom 16. März 2025

    Aktualisierung der Präsentation mit einem Beispiel aus einem Film der 1980er Jahre und Betonung des Fakts, dass das Subjekt überhaupt nicht bemerken muss, dass eine Identität erstellt wird...

    Aktualisierung vom 17. August 2025

    Ein weiteres Beispiel wurde hinzugefügt.

    Aktualisierung vom 30. März 2026

    Aktualisierung der Präsentation: Erläuterung der Möglichkeit, mehr als ein Zertifikat für dasselbe Schlüsselpaar auszustellen und Exkurs zu Transport Layer Security als Beispiel der Forderung des Vorweisens bestimmter Arten digitaler Identitäten.
    Weiterlesen

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen Codeberg-Repositories findet man hier.