# OCR mit Tesseract und Tesjeract



## 76heinz (9. Mrz 2011)

Hallo,

ich habe ein .tif Bild und möchte da tesseract drüber laufen lassen. Ich habe das ganze per batch getestet und es funktioniert für meine Ansprüche ausreichend gut.
Nun bin versuche ich seid Tagen, das OCR mit Tesjeract aus meinem Java Programm zu realisieren.

Ziel soll es sein, das die Zeichen aus meinem .tif Bild als String in mein Java Prog kommen.

Ich bekomm es einfach nicht hin. Sehr viele Seiten und Beispiele findet man dazu leider nicht.

Also was habe ich bisher gemacht. Achso, ich nutze Windows XP und mein Java Prog soll nur hier laufen, die Plattformunabhängigkeit is mir egal.

1. tesseract herunter geladen und installiert inkl. Visual C++ 2008 SP1. Funktioniert auch sehr gut.
2. tesjeract geladen. Die tesjeract.dll in System32 rein kopiert.

Aber so richtig versteh ich die Faq nicht. Ich finde zum Beispiel keine tessdll.dll und was ich mit den ganzen anderen Dateien machen soll weiß ich auch nicht.
Kann mir an der Stelle schonmal jemand nen Tip geben was überhaupt erstmal mit den ganzen Sachen aus den beiden Tesjeract Zip Archiven machen muss.

Danke
MfG


----------



## Andi_CH (9. Mrz 2011)

Hm - du hast irgend etwas falsch gemacht. Hm was? - Hm - Keine Ahnung wir wissen ja nicht was du versucht hast .....

Verrate mir bitte mal wie dir jemand helfen sollte ohne dass du ---- na ja, da solltest du selbst drauf kommen...


----------



## 76heinz (9. Mrz 2011)

Ich will versuchen, Tesseract zu nutzen. Dann habe ich mich belesen und es gibt ja schon diesen JNI Wrapper Namens tesjeract. Dazu gibt es auch eine FAQ wie man diesen nutzen kann.
Meine Java Kenntnisse beschränken sich allerdings auf das Programmieren in java selbst. Wie man so nen Wrapper nutzt weiß ich leider nicht und anhand der FAQ bekomm ichs nicht hin.

Also helfen könnte mir jemand, der sich mal kurz die FAQ zu Tesjeract ansieht und mir kurz erklären könnte, was ich da machen muss.


----------



## Andi_CH (9. Mrz 2011)

.. und wir sollen immer noch Orakeln wo wohl dein fehler auftritt?

Ich schätze er liegt zwischen Zeile 15 und 20 :lol:

Mal gespannt wartet ob sich überhaupt jemand meldet ...


----------



## hansmueller (9. Mrz 2011)

Hallo,

wenn ich das so auf die Schnelle richtig sehe, bezieht sich das Beispiel aus den FAQ auf den Sourcecode.
Lade dir also folgende Datei runter tesjeract-0.3.2-src.zip - tesjeract - Java and C++ sources for Tesjeract 0.3.2 - Project Hosting on Google Code
Darin ist auch eine tessdll.lib vorhanden.

Ansonsten, wenn du mit den Wrapper nicht klarkommst, kannst du es ja mit einem ProcessBuilder versuchen.

MfG
hansmueller


----------



## 76heinz (9. Mrz 2011)

@Andi_CH

Hallo, direkt einen fehelr habe ich nicht. Mich interessiert die Herangehensweise wie ich den Wrapper nutzen kann, da ich wie gesagt da noch keine Erfahrung mit habe.

@hansmueller
Das Paket habe ich schon geladen, was mach ich denn mit der tessdll.lib?

Sorry, aber ich beschäftige mich noch nicht so lange damit. Mit Java an sich komm ich gut zurecht, aber sobald es darum geht auf Externe Sachen zuzugreifen ob API oder JNI hörts leider bei mir auf.

Mit dem ProcessBuilder hab ich mich schon befasst und das funktioniert auch, allerdings bin ich im Moment nur so weit, dass tesseract mir .txt files erzeugt. Ich werd mal versuchen, das hin zu bekommen, den Ausgabestrom direkt zu übernehmen.
Ich dachte wenn es schonmal nen Wrapper gibt, kann ich den ja gleich nutzen, aber über den ProcessBuilder gehts natürlich auch.


----------



## hansmueller (9. Mrz 2011)

Oder kompiliere dir die tessdll.dll selber.
Oder lade sie dir herunter: http://download.corruptedfilerepair.com/post/2010/02/24/tessdlldll-Information-about-Process-tessdlldll.aspx oder http://download.corruptedfilerepair.com/post/2010/03/03/tessdlldll-Download-File-tessdlldll.aspx

MfG
handmueller


----------



## Dennis8115 (17. Mrz 2011)

Hi,
die tessdll.dll muss auch in system32.
Wenn du tesjeract mit ANT kompilierst, bekommst du eine jar-Datei, die du in den classpath deiner Java-Anwendung setzst. Dann kannst du analog zum JUnit-Beispiel im FAQ auf tesseract zugreifen. Die wichtige Zeile ist hier

```
EANYCodeChar[] words = tess.recognizeAllWords(buf);
```

Den Ergebnis-Text kannst du dann so auslesen:

```
for (EANYCodeChar w : words){
			if(w.blanks > 0)
				System.out.print(" ");
			System.out.print((char)w.char_code);
		}
```


----------



## 76heinz (19. Aug 2011)

Ich muss das Thema leider nochmal hoch holen.

Ich hatte in den letzten Monaten leider wenig zeit, aber nun wollte ich das Projekt nochmal aufgreifen.

Also ich habs bis dato noch nicht hinbekommen mit diesem JNI Wrapper tesjeract ein tif geschweige denn ein BufferedImage auszulesen.

Was ich bis jetzt gemacht habe:

Ich habe die beiden Pakete herunter geladen.
Downloads - tesjeract - JNI wrapper for Tessaract OCR - Google Project Hosting

Hab die tessdll.dll und die tesjeract.dll ins System32 Verzeichnis kopiert.

Mein Code sieht so aus:


```
package tesseract;

import java.io.File;
import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel.MapMode;


public class Main {


	public static void main(String[] args) throws Exception {



		if (System.getProperty("os.name").toLowerCase().startsWith("windows"))
			System.loadLibrary("tessdll");

	        System.loadLibrary("tesjeract");

		if (args.length != 1) {
			System.err.println("Should give TIFF file as first argument");
			System.exit(1);
		}

		File tiff = new File(args[0]);

		if (!tiff.exists()) {
			System.err.println("No such file " + args[0]);
			System.exit(1);
		}

		MappedByteBuffer buf = new FileInputStream(tiff).getChannel().map(MapMode.READ_ONLY, 0, tiff.length());
		Tesjeract tess = new Tesjeract("eng");
		EANYCodeChar[] words = tess.recognizeAllWords(buf);

		for (EANYCodeChar c:words) {
			while (c.blanks-- > 0)
				System.out.print(" ");

			System.out.print((char) c.char_code);
		}
	}

}
```

Und es kommt folgende Fehlermeldung:
run:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\WINDOWS\system32\tesjeract.dll: Die angegebene Prozedur wurde nicht gefunden
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1728)
        at java.lang.Runtime.loadLibrary0(Runtime.java:823)
        at java.lang.System.loadLibrary(System.java:1028)
        at tesseract.Main.main(Main.java:20)
Java Result: 1
ERSTELLEN ERFOLGREICH (Gesamtzeit: 0 Minuten 0 Sekunden)

Leider kann ich damit nix anfangen, da ich wie gesagt zwar erfahrung mit Java ansich habe, aber mit JNI bzw. arbeiten mit externen Programm ziemlich unbeleckt bin. Ich hab auch schon sehr viel drüber gelsen, aber ich komme da einfach nicht weiter.

Bin für jeden Post dankbar, was ich noch machen könnte.


----------



## Kevin94 (21. Aug 2011)

Bin was JNI angeht auch nicht wirklich fit, aber analysieren wir mal deine Fehlermeldung:

Der Fehlertyp ist UnsatisfiedLinkError -> ergo ist mit JNI was schiefgelaufen
Der Fehler ist im Aufruf von System.loadLibrary in Zeile 20 von Main aufgetreten -> beim Laden der tesjeract.dll stimmt was nicht
Laut Fehlermeldung hat er die tesjeract.dll in C:\WINDOWS\system32\ gefunden

Ich fürchte also der Fehler liegt in dieser dll und nicht in deinem Javacode. Entweder ist in der dll eine Funktion nicht definiert die beim Laden aufgerufen wird oder beim Laden wird eine Funktion aufgerufen die annimmt das eine andere dll schon geladen wurde und versucht auf Funktionen in dieser zuzugreifen.


----------

