tess4j with Spring mvc

余生长醉 提交于 2019-12-02 08:40:12

问题


I have tried tess4j as a standalone java program and it worked properly giving the text output.

Now i am trying to create a spring mvc web project adding the dependencies for tess4j in pom and i have added the tess4j source inside my project.

File imageFile = new File("D:/Data/jars/tess/eurotext.tif");    
Tesseract instance = Tesseract.getInstance(); // JNA Interface Mapping
        // Tesseract1 instance = new Tesseract1(); // JNA Direct Mapping
        try {
            result = instance.doOCR(imageFile);
            System.out.println(result);
        } catch (TesseractException e) {
            System.err.println(e.getMessage());
        }

The above code works properly when i tried to run a standalone java program inside the project.so its clear that the jar files are added to build path properly.

but when i call the code in a controller mapping or service it throws a run time exception.

    SEVERE: Unsupported image format. May need to install JAI Image I/O package.
https://java.net/projects/jai-imageio/
java.lang.RuntimeException: Unsupported image format. May need to install JAI Image I/O package.
https://java.net/projects/jai-imageio/
    at net.sourceforge.vietocr.ImageIOHelper.getIIOImageList(ImageIOHelper.java:324)
    at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:173)
    at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:158)
    at com.ocr.tesseract.TesseractExample.getTextFromImage(TesseractExample.java:27)
    at com.cogz.tp.controller.HomeController.view(HomeController.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:748)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:662)
java.lang.RuntimeException: Unsupported image format. May need to install JAI Image I/O package.
https://java.net/projects/jai-imageio/

Please let me know what am missing.Thanks in advance.


回答1:


Even I faced the similar problem of using tess4j for DynamicWebProject. But thanks to comment by @nguyenq that helped me I got it working. Mostly tess4j uses TIFF handler for optical recognition. The dependencies required for it are not available with default ImageIO. So, jai-imageio.jar is required. All I did was added line ImageIO.scanForPlugins() before I called the wrapper class that performed doOCR. I had following jars in my lib:-

tess4j.jar

jai_imageio.jar

ghost4j-0.3.1.jar

jna.jar

junit-4.10.jar

Here's the sample code:

TessractOCR tessocr = new TessractOCR();
        ImageIO.scanForPlugins();
        String extractedString = tessocr.extractTextFromImage(binarizrImage);

The function

public static String extractTextFromImage(BufferedImage image){
        RenderedImage img = image;

        String result =null;
        try {
            File outputfile = new File("saved.png");
       ImageIO.write(img, "png", outputfile);
        Tesseract instance = Tesseract.getInstance(); // JNA Interface Mapping
        instance.setDatapath("E:\\OCR-data\\Tess4J-1.2-src\\Tess4J");

        result = instance.doOCR(outputfile);


            System.out.println(result);

        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        return result;
    }

It works 100% :)




回答2:


Below is the working code sharing for all:

public static String doOCR(File pdfInvoice) {
        String result = "";
        long totalTime = 0;
        long endTime = 0;
        long startTime = System.currentTimeMillis();
        File imageFile = new File("D:\\docfolder\\9011121584.pdf");
        Tesseract instance = Tesseract.getInstance(); //

        try {

            ImageIO.scanForPlugins();
            result = instance.doOCR(imageFile);

            endTime = System.currentTimeMillis();
            totalTime = endTime - startTime;
            System.out.println("Total Time Taken For OCR: " + (totalTime / 1000));
            return result;
        } catch (Exception e) {
            System.err.println(e.getMessage());
            result = "";
            return result;
        }
    }


来源:https://stackoverflow.com/questions/22014969/tess4j-with-spring-mvc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!