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.
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)
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());
}
}
}
Meta-Plugin neue Version
01.08.2020
Das Meta-Plugin der sQLshell wurde in einer neuen Version veröffentlicht
WeiterlesenAndroid Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Java. Komponenten Jupyter JupyterBinder Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Präsentationen Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
Ich habe in einem Tröt auf Mastodon gesehen, wie man remote Filesysteme als Docker-Volumes nutzen kann und wollte das selbst ausprobieren:
WeiterlesenEine neue Version der sQLshell ist verfügbar!
WeiterlesenUnd wieder ein Fortschrittsbericht über mein Arbeiten mit (Neo)Vim...
WeiterlesenManche 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.