2016-09-15 528 views
9

創建一個使用Tesseract的Java應用程序,以便將給定的圖像或PDF轉換爲字符串格式,在我的機器上運行時使用它運行的junit單元測試偉大的,但運行完整系統,這是一個RESTful API由接收圖像並運行正方體它給了我下面的錯誤Tomcat的運行時:Tesseract - 錯誤net.sourceforge.tess4j.Tesseract - null

23:22:36.511 [http-nio-9999-exec-3] ERROR net.sourceforge.tess4j.Tesseract - null java.lang.NullPointerException: null at net.sourceforge.tess4j.util.PdfUtilities.convertPdf2Png(PdfUtilities.java:107) at net.sourceforge.tess4j.util.PdfUtilities.convertPdf2Tiff(PdfUtilities.java:48) at net.sourceforge.tess4j.util.ImageIOHelper.getIIOImageList(ImageIOHelper.java:343) at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:213) at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:197) at ocr.OcrUtil.getString(OcrUtil.java:54) at com.tapd.server.api.handlers.IRSHandler.uploadIRSImage(IRSHandler.java:65) at com.tapd.server.api.WebAPIService.updateParentIrsForm(WebAPIService.java:250) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:309) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.process(Errors.java:267) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:292) at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1139) at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:460) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) [2016-09-14 23:22:36,512] [ERROR] java.lang.NullPointerException

我的猜測是,tessdata文件夾沒有位於正確的地方當打包到一個Jar中並由tomcat運行時,它放錯了位置,但是我找不到它應該放在哪裏,並且我進行了雙重檢查以查看所有Jars是否正確部署。

編輯:因此看起來Tesseract在遠程服務器(如AWS S3)上無法處理路徑,所以問題是爲什麼?我該如何讓它使用S3的路徑? (是的文件是公開的)

+0

哪個版本的Tesseract? –

+0

我使用tess4j版本3.2.1 – Adi

+0

您可以顯示[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)? – LEQADA

回答

1

作爲@Piotr R提到的錯誤是ghostscriptException.getCause()爲空,原因是發送到Tesseract的文件對象中配置的路徑不是有效的路徑,現在對Tesseract有效的定義是與你的有所不同,他認爲只有本地地址是有效的,所以當設置位於AWS S3上的文件時,即使它是公開的,也會引發錯誤。 解決方案在本地保存並在Tesseract完成後刪除它。

+0

@Piotr RI沒有GhostscriptException的堆棧跟蹤,我也不能調試它,因爲它是一個外部庫,我訪問s3的方式是不相關的,因爲它不能訪問本地沒有存儲的文件,這正是答案我正在尋找和解決方案。有人說我非常感謝你的幫助和支持,當我把自己標記爲正確的答案時,不要擔心,我不會得到獎勵。 – Adi

4

我的猜測是,有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,調用null.toString()引發NPE。

(從規格 - 的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行放置一個斷點。這將爲您提供有關真正異常的信息。

+0

我建議在OP的代碼中用'String.valueOf(e.getCause())'替換'e.getCause()。toString()'在這種情況下是安全的。 – Axel

+0

我設法儘可能瞭解GhostscriptException爲空,但真正的問題是爲什麼?我該如何解決它?以及爲什麼當我在本地運行它時(junit)它不會發生? – Adi

+0

「瞭解GhostscriptException爲空」 - 這是不正確的。 GhostscriptException不是null,GhostscriptException是Exception的有效實例。只有ghostscriptException.getCause()爲null。要解決這個問題,請在調試模式下啓動您的應用程序,並檢查什麼是異常消息 - 應該有更多的細節。 –