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()); } } }

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


Vor 5 Jahren hier im Blog

  • When Someone Requests a Jimi Hendrix Song

    23.08.2020

    Er hier ist mir schon einige Male mit interessanten Videos aufgefallen...

    Weiterlesen

Neueste Artikel

  • Anlehnung an todo.txt für collectedlinks

    Ich habe den Generator für meine Heimatseite im Zwischennetz wieder um ein neues Feture erweitert.

    Weiterlesen
  • NeoVim und ausrangierte Plugins

    Ich habe nun seit geraumer Zeit NeoVim im Einsatz im Produktivbetrieb zum Entwickeln - nicht nur - von Software. Dabei hat sich gezeigt, dass ich meinem Ziel, der Philosophie des Einsatzes möglichst weniger Plugins immer näher komme:

    Weiterlesen
  • Kritzelgenerator

    Ich habe mal wieder etwas im Internet gefunden, das mich herausforderte, eine Fingerübung in Java abzuhalten:

    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.