Тессеракт - ОШИБКА net.sourceforge.tess4j.Tesseract - ноль

Создано Java-приложение, которое использует Tesseract для преобразования заданного изображения или pdf в строковый формат, при запуске его на моем компьютере в качестве модульного теста с использованием junit оно работает отлично, но при запуске полной системы, которая представляет собой API restFul, запускаемый tomcat который получает изображение и запускает Tesseract, он выдает мне следующую ошибку:

23: 22: 36.511 [http-nio-9999-exec-3] ОШИБКА net.sourceforge.tess4j.Tesseract - null java.lang.NullPointerException: пусто в net.sourceforge.tess4j.util.PdfUtilities.convertPdf2Png(PdfUtilities.java):107) по адресу net.sourceforge.tess4j.util.PdfUtilities.convertPdf2Tiff(PdfUtilities.java:48) по адресу net.sourceforge.tess4j.util.ImageIOHelper.getIIOImageList(ImageIOHelper.java:343) по адресу net.sourceforge.tese4. (Tesseract.java:213) в net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:197) в ocr.OcrUtil.getString(OcrUtil.java:54) в com.tapd.server.api.handlers.IRSHandler.uploadIRSImage(IRSHandler.java:65) по адресу com.tapd.server.api.WebAPIService.updateParentIrsForm(WebAPIService.java:250) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.refl.) на sun.reflect.DelegatingMethodAccessorImpl.invoke(неизвестный источник) на java.lang.reflect.Method.invoke (неизвестный источник) на org.glassfish.jersey.server.model.internal.ResourceMethodInv OCATIONHANDLERFACTORY invoke(AbstractJavaResourceMethodDispatcher.java:161) по адресу org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.javaes.ho..D.Derg.WD.WD.WD.WD.WD.WD.WD.WD.WD.WD.W.Serg.Server.Play.serg.serg.serg.60).AbstractJavaResourceMethodDispatcher.java:99) в org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) в org.glassfish.jersey.server.model.ResourceMethodInvoker.Serv..glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) в org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:309) в org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) в org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) в org.glassfish.jersey.internal.Errors.process(Errors.java:315) в org.glassfish.jersey.internal.Errors.process(Errors.java:297) в org.glassfish.jersey.internal.Errors.process (Errors.java): 267) в org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) в org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:292) в org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1139) в org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:460) в org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:38) на org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334) на org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) на org.apache.catalina.core.AppilinFilterC (ApplicationFilterChain.java:230) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) в org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.jgap. atg).catalina.core.:198) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) в org.apache.cat.StandardHostValve.invoke(StandardHostValve.java:140) в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) в org.apache.catalina.valves.AbstractAccessLogValve.invoke(org) atgLag.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) в org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110) в org.apache.coyote.AbstractProcessorLight.pro66.jpg в org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) в org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) в org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) в java.util.concurrent.ThreadPoolExecutor.runWorker(неизвестный источник) в java.util.concurrent.ThreadPoolExecutor$Worker.run(неизвестный источник) в org.ache.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) в java.lang.Thread.run(неизвестный источник) [2016-09-14 23:22:36,512] [ОШИБКА] java.lang.NullPointerException

Я предполагаю, что папка tessdata расположена не в нужном месте, и когда она упакована в Jar и запускается tomcat, она неуместна, но я не могу понять, где она должна быть расположена, и я дважды проверил, чтобы увидеть, что все Jars развернуты правильно.

Изменить: так получается, что Tesseract не может обрабатывать путь, когда он находится на удаленном сервере, таком как AWS S3, поэтому возникает вопрос, почему? и как я могу позволить ему использовать путь от S3? (да, файл общедоступен)

2 ответа

Решение

Как упомянул @Piotr R, ошибка была в том, что ghostscriptException.getCause() имеет значение null, и причина этого в том, что путь, настроенный в объекте файла, отправляемом в Tesseract, был неверным, теперь определение valid для Tesseract немного отличается от Ваш он считает действительным только локальный адрес, поэтому при настройке файла, расположенного на AWS S3, даже если он общедоступный, он выдаст ошибку. Решением было сохранить его локально и удалить после завершения работы Tesseract.

Я предполагаю, что есть GhostscriptException, который не зарегистрирован должным образом, и это вызывает NullPointerException:

https://github.com/nguyenq/tess4j/blob/212d72bc2ec8b3a4d4f5a18f1eb01a0622fc5521/src/main/java/net/sourceforge/tess4j/util/PdfUtilities.java#L107

106        } catch (GhostscriptException e) {
107            logger.error(e.getCause().toString(), e);
108        } finally {

В строке 107 - e.getCause () является (вероятно) нулевым, вызывая null.toString() выбрасывает NPE.

(из спецификации - getCause может иметь значение null: https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html, GhostscriptException также позволяет причине быть нулевой: http://grepcode.com/file/repo1.maven.org/maven2/org.ghost4j/ghost4j/1.0.0/org/ghost4j/GhostscriptException.java)

Чтобы проверить этот ответ (без перекомпиляции всего tess4j), вы можете запустить вашу программу в режиме отладки и поставить точку останова в строке 107. Это даст вам информацию о реальном исключении.

Resources I used: Windows 10 (tried on Windows Server 2016 as well), JAVA, MAVEN

Status: Working good on my local as well as VM 

1. Download  Tess4J-3.4.8  from here http://tess4j.sourceforge.net/  and set your ENV variable path under Advance System Setting 
2. Get repo from MAVEN - 

<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>org.ghost4j</groupId>
<artifactId>ghost4j</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>net.sourceforge.lept4j</groupId>
<artifactId>lept4j</artifactId>
<version>1.7.0</version>
</dependency>

3. Get libtesseract302.dll and copy to "C:\Windows\System32" folder 
from here http://api.256file.com/libtesseract302.dll/en-download-56466.html
do not forget to set your ENV variable path under Advance System Setting  

4. Download and install Visual C++ 2015 Redistributable or VC++ 2017 Redistributable (I installed both )
from here https://programmer.help/blogs/net.sourceforge.tess4j.tesseractexception-java.lang.nullpointerexception.html 

then do restart your PC 

5. on Safer side can have some Jar files if you dont have already in local - Please see image

do not forget to set your ENV variable path for JARs under Advance System Setting 

Другие вопросы по тегам