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 の質問にプレビューが表示されていないか、書式設定ボタンがありません。後で表示されたときに問題が発生した場合は編集します:)
-シャウリヤ