Tesseract — ОШИБКА net.sourceforge.tess4j.Tesseract — ноль

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

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

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

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


person Adi    schedule 15.09.2016    source источник
comment
Я использую tess4j версии 3.2.1   -  person Piotr Reszke    schedule 18.09.2016
comment
Можете ли вы показать минимальный, полный и проверяемый пример?   -  person Adi    schedule 18.09.2016
comment
Какая ОС? Если не Windows, у вас установлен GhostScript?   -  person LEQADA    schedule 19.09.2016
comment
В настоящее время работает на Windows в производстве, это будет Linux   -  person nguyenq    schedule 20.09.2016
comment
Я предлагаю заменить _1_ на _2_ в коде OP, чтобы быть в безопасности в этом случае.   -  person Adi    schedule 20.09.2016


Ответы (3)


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

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

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

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

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

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

person Piotr Reszke    schedule 19.09.2016
comment
Мне удалось понять, что GhostscriptException имеет значение null, но реальный вопрос в том, почему? как я могу это решить? и почему, когда я запускаю его локально (junit), этого не происходит? - person Axel; 19.09.2016
comment
понимание того, что GhostscriptException равно null - это неправильно. Исключение GhostscriptException не равно null, исключение GhostscriptException является действительным экземпляром исключения. Только ghostscriptException.getCause() имеет значение null. Чтобы решить эту проблему, запустите приложение в режиме отладки и проверьте сообщение об исключении — должно быть больше деталей. - person Adi; 19.09.2016
comment
Чтобы полностью решить эту проблему, вам нужно будет сообщить об ошибке в tess4j: github.com/nguyenq/tess4j/issues. (и, возможно, отправить запрос на извлечение). Если вам нужны дополнительные рекомендации о том, как временно решить эту проблему, вы можете позвонить мне в чат. - person Piotr Reszke; 19.09.2016
comment
@Axel - проблема здесь в том, что это сторонняя библиотека (для исправления этой ошибки требуется PR) - person Piotr Reszke; 19.09.2016
comment
@Adi — я отправил сообщение о проблеме с библиотекой tess4j github.com/nguyenq/tess4j/issues /41 - person Piotr Reszke; 19.09.2016
comment
@Piotr R - Большое спасибо! - person Piotr Reszke; 19.09.2016
comment
@Piotr RI не имеет трассировки стека GhostscriptException, и я не могу отлаживать ее, поскольку это внешняя библиотека, способ доступа к s3 не имеет значения, поскольку он не может получить доступ к файлам, которые не хранятся локально, это точно ответ Я искал и решение. Тем не менее, я очень ценю вашу помощь и поддержку, не волнуйтесь, когда я отмечаю себя как правильный ответ, я не получаю награду. - person Adi; 20.09.2016

Ресурсы, которые я использовал: Windows 10 (также пробовал на Windows Server 2016), JAVA, MAVEN

person Adi    schedule 22.09.2016
comment
23:22:36.511 [http-nio-9999-exec-3] ОШИБКА net.sourceforge.tess4j.Tesseract — null java.lang.NullPointerException: null at 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.tess4j.Tesseract.doOCR (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.reflect.NativeMethodAccessorImpl.invoke(неизвестный источник ) в sun.reflect.DelegatingMethodAccessorImpl.invoke(неизвестный источник) в java.lang.reflect.Method.invoke(неизвестный источник) в org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) в org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) в org. Glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) в org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160) в org.glassfish. jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) в org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) в org.glassfish.jersey.server.model. ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) в org.glassfish.jersey.server.model.ResourceMethod Invoker.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:386) в org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer .java:334) в org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) в org.apache.catalina. core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) в org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 192) на org.apache.catalina.cor e.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) в org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:79) по адресу org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) по адресу org.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.process(AbstractProcessorLight.java:66) на org.apache.coyote.Ab stractProtocol$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.apache.tomcat.util.threads.TaskThread$WrappingRunnable .run(TaskThread.java:61) на java.lang. Thread.run (неизвестный источник) [2016-09-14 23:22:36,512] [ОШИБКА] java.lang.NullPointerException - person Adi; 23.09.2016

Статус: Работает хорошо как на моем локальном компьютере, так и на виртуальной машине

Получите libtesseract302.dll и скопируйте в папку C:\Windows\System32 отсюда http://api.256file.com/libtesseract302.dll/en-download-56466.html не забудьте указать путь к переменной ENV в разделе «Расширенные настройки системы».

  1. Получить репо от MAVEN -
  2. Какая версия Тессеракта?
<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>
  1. Загрузите и установите распространяемый пакет Visual C++ 2015 или VC++ 2017 (я установил оба) отсюда https://programmer.help/blogs/net.sourceforge.tess4j.tesseractexception-java.lang.nullpointerexception.html

  2. затем перезагрузите компьютер

на более безопасной стороне могут быть некоторые файлы Jar, если у вас их еще нет локально - см. Изображение

  1. не забудьте установить путь переменной ENV для JAR в разделе «Расширенные настройки системы».

    введите здесь описание изображения

Загрузите Tess4J-3.4.8 отсюда http://tess4j.sourceforge.net/ и установите переменную ENV. путь в разделе «Дополнительные настройки системы»

person Mike ASP    schedule 12.04.2020