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

  • Meta-Plugin neue Version

    01.08.2020

    Das Meta-Plugin der sQLshell wurde in einer neuen Version veröffentlicht

    Weiterlesen

Neueste Artikel

  • Remote Filesysteme als Docker-Volumes

    Ich habe in einem Tröt auf Mastodon gesehen, wie man remote Filesysteme als Docker-Volumes nutzen kann und wollte das selbst ausprobieren:

    Weiterlesen
  • sQLshell Version 7.7pre10 build 11049

    Eine neue Version der sQLshell ist verfügbar!

    Weiterlesen
  • Arbeiten mit (Neo)Vim

    Und wieder ein Fortschrittsbericht über mein Arbeiten mit (Neo)Vim...

    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.