Tesseract OCR не работает для веб-приложения Java

Я пытаюсь разработать веб-приложение Tesseract OCR для Java. Следующий код работает отлично:

public class App {

public String getImgText(String imageLocation) {
    ITesseract instance = new Tesseract();
    instance.setDatapath(Thread.currentThread().getContextClassLoader().getResource("tessdata").getPath());
    System.out.println("Thread.currentThread().getContextClassLoader().getResource(\"tessdata\").getPath() : "+Thread.currentThread().getContextClassLoader().getResource("tessdata").getPath());
    instance.setLanguage("eng");

    try {
        String imgText = instance.doOCR(new File(imageLocation));
        return imgText;
    } catch (TesseractException e) {
        e.getMessage();
        return "Error while reading image";
    }
}

public static void main(String[] args) {
    App app = new App();
    System.out.println(app.getImgText("/home/user/Desktop/1.png"));
}
}

Но когда я пытаюсь использовать приведенный выше код в своем веб-приложении Java (JSF) после строки

  ITesseract instance = new Tesseract();

ничего не распечатывается. Ниже приведен код моего веб-приложения:

public String uploadImage(FileUploadEvent event) {
    System.out.println("webcore bean");
    //get uploaded file from the event
    UploadedFile uploadedFile = (UploadedFile) event.getFile();
    //create an InputStream from the uploaded file
    InputStream inputStr = null;
    try {
        inputStr = uploadedFile.getInputstream();
    } catch (IOException e) {
        //log error
    }

    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    String directory = externalContext.getInitParameter("uploadDirectory");
    String filename = FilenameUtils.getName(uploadedFile.getFileName());

    File destFile = new File(directory, "static" + getFileExtension(filename));

    //use org.apache.commons.io.FileUtils to copy the File
    try {
        FileUtils.copyInputStreamToFile(inputStr, destFile);
    } catch (IOException e) {
        //log error
    }
    System.out.println("getImageText(directory) : " + getImageText(directory));
    FacesMessage msg = new FacesMessage(event.getFile().getFileName() + " is uploaded.");
    FacesContext.getCurrentInstance().addMessage(null, msg);
    return null;
}

private String getImageText(String imageLocation) {
    try {
        System.out.println("Before ");
        ITesseract instance = new Tesseract1();
        System.out.println("After ");
        //instance.setDatapath("/usr/share/tesseract-ocr/4.00/tessdata");
        instance.setDatapath(Thread.currentThread().getContextClassLoader().getResource("tessdata").getPath());
        instance.setLanguage("eng");

        try {
            String imgText = instance.doOCR(new File(imageLocation));
            return imgText;
        } catch (TesseractException e) {
            e.getMessage();
            return "Error while reading image";
        }
    } catch (Exception e) {
        System.out.println("Before returning null");
        e.printStackTrace();
        return null;
    }

}

Журнал «До» печатается, а журнал «После» не печатается. Я использую следующие технологии:

а) Ubuntu 18.04 64-битная ОС

б) Нетбинс

в) Мавен

г) Стеклянная рыбка 4.1


person paawan    schedule 09.09.2018    source источник
comment
Вы установили тессеракт правильно? Какой сервер вы используете?   -  person m4gic    schedule 09.09.2018
comment
уверен, что нет никаких исключений или даже бросков?   -  person Kukeltje    schedule 09.09.2018
comment
Да, я правильно установил tesseract, и он работает для консольного приложения. Я использую сервер GlassFish 4.1.   -  person paawan    schedule 10.09.2018
comment
Да, я уверен, что нет никаких исключений и исключений.   -  person paawan    schedule 10.09.2018
comment
Это невозможно... если только... вы не запускаете код, который, по вашему мнению, вы запускаете. И как этот jsf связан между прочим. getImageText вызывается, поэтому jsf выполнил свою работу   -  person Kukeltje    schedule 10.09.2018
comment
Попробуйте setDatapath в папку tessdata Tesseract, а не во встроенный ресурс.   -  person nguyenq    schedule 11.09.2018
comment
nguyenq, setDatapath установлен в папку tessdata Tesseract, которая находится внутри ресурсов в других ресурсах в netbeans, где есть файл eng.traineddata, и он отлично работает для консольного приложения.   -  person paawan    schedule 12.09.2018
comment
} catch (TesseractException e) { e.getMessage(); вы выбрасываете здесь самую ценную информацию. e.getMessage() ничего не делает. По крайней мере, регистрируйте исключения. Вероятно, ЕСТЬ исключение, просто вы его не видите из-за этих плохих универсальных приемов. (Поймать все только для регистрации в большинстве случаев также не является правильной обработкой исключений. См. stackoverflow.com/a/23796357/1341535для начала)   -  person Vsevolod Golovanov    schedule 18.09.2018
comment
Я заменил TesseractException e на Exception e и получил тот же результат, что и раньше.   -  person paawan    schedule 21.09.2018