-1

Tesseract を OCR エンジンとして使用して、画像ファイルを Doc ファイルに変換する OCR アプリケーションを作成しました。これには Tess4j JNA ラッパーを使用しました。アプリケーションの作成中に、プロジェクトの bin フォルダーに dll ファイルと言語データ (tessdata) を配置すると、アプリケーションは正常に動作しました。プロジェクトをビルドすると、dll ファイルと tessdata が JAR に含まれていないため、プログラムが動作しません。エクスポートの2つの方法を試しました

**1. 必要なライブラリを生成された JAR にパッケージ化 **

DLL ファイルと Tessdata を JAR ファイルと同じディレクトリに追加しました。しかし、それは実行されませんでした。

http://i.imgur.com/cGwiVFC.png

それは私に次のエラーを与えました

F:\New folder>java -jar w.jar scan.jpg
Error opening data file bin//tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent d
irectory of your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
Caused by: java.util.ServiceConfigurationError: javax.imageio.spi.ImageInputStre
amSpi: Provider com.sun.media.imageioimpl.stream.ChannelImageInputStreamSpi coul
d not be instantiated: java.lang.IllegalArgumentException: vendorName == null!
        at java.util.ServiceLoader.fail(ServiceLoader.java:224)
        at java.util.ServiceLoader.access$100(ServiceLoader.java:181)
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:377)
        at java.util.ServiceLoader$1.next(ServiceLoader.java:445)
        at javax.imageio.spi.IIORegistry.registerApplicationClasspathSpis(IIOReg
istry.java:210)
        at javax.imageio.spi.IIORegistry.<init>(IIORegistry.java:138)
        at javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:159
)
        at javax.imageio.ImageIO.<clinit>(ImageIO.java:65)
        at net.sourceforge.vietocr.ImageIOHelper.getImageByteBuffer(Unknown Sour
ce)
        at net.sourceforge.tess4j.Tesseract.setImage(Unknown Source)
        at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source)
        at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source)
        at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source)
        at com.shaurya.back.OCR.TesseractEngine.getResult(TesseractEngine.java:2
0)
        at com.shaurya.back.ImageToDocument.identify(ImageToDocument.java:117)
        at com.shaurya.back.ImageToDocument.transform(ImageToDocument.java:53)
        at com.shaurya.front.runnow.main(runnow.java:27)
        ... 5 more
Caused by: java.lang.IllegalArgumentException: vendorName == null!
        at javax.imageio.spi.IIOServiceProvider.<init>(IIOServiceProvider.java:7
6)
        at javax.imageio.spi.ImageInputStreamSpi.<init>(ImageInputStreamSpi.java
:90)
        at com.sun.media.imageioimpl.stream.ChannelImageInputStreamSpi.<init>(Ch
annelImageInputStreamSpi.java:63)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
orAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at java.lang.Class.newInstance(Class.java:374)
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:373)
        ... 19 more

F:\New folder>

**2. 生成された JAR の横にあるサブフォルダーに必要なライブラリをコピーします **

ここでも、dll ファイルと tessdata フォルダーを JAR ファイルと同じディレクトリにコピーしました (ライブラリを含むサブフォルダー内にコピーすると、DLL ファイルを見つけることさえできませんでした。)

http://i.imgur.com/7ShF3Ev.png

与えられたエラーは次のとおりです。

F:\New folder\kol>java -jar runn.jar scan.jpg
Error opening data file bin//tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent d
irectory of your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Exception in thread "main" java.lang.Error: Invalid memory access
        at com.sun.jna.Native.invokePointer(Native Method)
        at com.sun.jna.Function.invokePointer(Function.java:470)
        at com.sun.jna.Function.invoke(Function.java:404)
        at com.sun.jna.Function.invoke(Function.java:315)
        at com.sun.jna.Library$Handler.invoke(Library.java:212)
        at com.sun.proxy.$Proxy0.TessBaseAPIGetUTF8Text(Unknown Source)
        at net.sourceforge.tess4j.Tesseract.getOCRText(Unknown Source)
        at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source)
        at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source)
        at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source)
        at com.shaurya.back.OCR.TesseractEngine.getResult(TesseractEngine.java:2
0)
        at com.shaurya.back.ImageToDocument.identify(ImageToDocument.java:117)
        at com.shaurya.back.ImageToDocument.transform(ImageToDocument.java:53)
        at com.shaurya.front.runnow.main(runnow.java:27)

F:\New folder\kol>

したがって、主な問題は、dllが見つかったにもかかわらず、Tessdataフォルダーを見つけることができないことです。私が興味を持っていたもう 1 つのことは、両方のケースで例外スタックに少し変更がある理由です (パッケージ化が少し異なるだけで、両方が同じコードを持ち、同じ問題に直面しているため、これは珍しいようです)。

編集1:

ビンからdllとtessdataを別のフォルダーに削除し、Javaビルドパス->ライブラリーの外部クラスフォルダーとして追加しても機能しません。それを行うと、tessdataが見つからないという同じエラーが発生します(アプリケーション自体で)。

編集2:

instance.setDatapath("bin//tessdata");

これが私のデータパスとして設定されているものです。これを何らかの方法で変更すると、エラーが修正される可能性がありますか?

投稿にフォーマットの問題があった場合は申し訳ありません。現在、StackOverflow の質問にプレビューが表示されていないか、書式設定ボタンがありません。後で表示されたときに問題が発生した場合は編集します:)

-シャウリヤ

4

1 に答える 1

1

tessdataの下のフォルダが見つからなかったようbinです。その下にありますか?二重のスラッシュも疑わしいようです。に変更してみてください"bin/"

于 2015-01-05T23:45:22.387 に答える