Tess4J: недопустимое соглашение о вызовах 63, несмотря на правильные версии

Я пытаюсь выполнить OCR и вывести в виде PDF, используя Tess4J и следующий код в Linux (Ubuntu 16 Xenial) .

public void testOcr() throws Exception {
    File imageFile = new File("/projects/de.conradt.core/tessdata/urkunde.jpg");
    ITesseract instance = new Tesseract1();  // tried both Tesseract() and Tesseract1()

    // File tessDataFolder = LoadLibs.extractTessResources("tessdata"); // Maven build bundles English data
    // instance.setDatapath(tessDataFolder.getParent());
    instance.setDatapath("/projects/de.conradt.core/tessdata");
    instance.setLanguage("deu");

    try {
        String result = instance.doOCR(imageFile);
        System.out.println(result);
    } catch (TesseractException e) {
        System.err.println(e.getMessage());
    }

    List<ITesseract.RenderedFormat> list = new ArrayList<ITesseract.RenderedFormat>();
    list.add(ITesseract.RenderedFormat.PDF);
    File pdfFile = new File("/projects/de.conradt.core/tessdata/urkunde.pdf");
    instance.createDocuments(pdfFile.getAbsolutePath(), "/projects/de.conradt.core/tessdata/urkunde", list);
}

Последняя строка

        instance.createDocuments(pdfFile.getAbsolutePath(), "/projects/de.conradt.core/tessdata/urkunde", list);

выдает исключение:

11:03:12.651 [http-nio-8080-exec-1] ERROR net.sourceforge.tess4j.Tesseract - Invalid calling convention 63                                
java.lang.IllegalArgumentException: Invalid calling convention 63                                                                         
        at com.sun.jna.Native.createNativeCallback(Native Method)                                                                         
        at com.sun.jna.CallbackReference.<init>(CallbackReference.java:239)                                                               
        at com.sun.jna.CallbackReference.getFunctionPointer(CallbackReference.java:413)                                                   
        at com.sun.jna.CallbackReference.getFunctionPointer(CallbackReference.java:395)                                                   
        at com.sun.jna.Function.convertArgument(Function.java:541)                                                                        
        at com.sun.jna.Function.invoke(Function.java:305)                                                                                 
        at com.sun.jna.Library$Handler.invoke(Library.java:236)                                                                           
        at com.sun.proxy.$Proxy89.gsapi_set_stdio(Unknown Source)                                                                         
        at org.ghost4j.Ghostscript.initialize(Ghostscript.java:323)                                                                       
        at net.sourceforge.tess4j.util.PdfUtilities.convertPdf2Png(PdfUtilities.java:103)                                                 
        at net.sourceforge.tess4j.util.PdfUtilities.convertPdf2Tiff(PdfUtilities.java:48)                                                 
        at net.sourceforge.tess4j.Tesseract.createDocuments(Tesseract.java:535)                                                           
        at net.sourceforge.tess4j.Tesseract.createDocuments(Tesseract.java:507)                                                           
        at de.conradt.core.Example.testOcr(Example.java:62)                                                                               
        at de.conradt.core.Example.ocr(Example.java:35)  

Я обнаружил, что это известная (но предположительно закрытая) проблема с Tess4J:

но я проверил свои версии, а также переменную env TESSDATA_PREFIX. Насколько я вижу, все настроено правильно.

Версия Tesseract и Leptonica:

$ /usr/bin/tesseract --version                                                                        
tesseract 3.04.01                                                                                                                        
 leptonica-1.73                                                                                                                          
  libgif 5.1.2 : libjpeg 8d (libjpeg-turbo 1.4.2) : libpng 1.2.54 : libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.4 : libopenjp2 2.1.0

Версия Ghostscript: (это последняя версия, которую я получил через apt-get)

$ ghostscript -v                                                                                      
GPL Ghostscript 9.18 (2015-10-05)                                                                                                        
Copyright (C) 2015 Artifex Software, Inc.  All rights reserved.  

Версия Tess4j:

3.2.1

и TESSDATA_PREFIX (файлы конфигурации и т. д. находятся в /projects/de.conradt.core/tessdata):

$ echo $TESSDATA_PREFIX                                                                                     
/projects/de.conradt.core

Глядя на журнал выпуска Tess4j: http://tess4j.sourceforge.net/changelog.html, я должен использовать правильный стек версий. Особенно версия 3.2 в журнале изменений написано:

Версия 3.2 — 15 мая 2016 г.: возврат JNA к версии 4.1.0 из-за ошибок «Недопустимое соглашение о вызовах 63» при вызове GhostScript через Ghost4J в Linux.

поэтому я подумал, что должен быть в безопасности с 3.2.1.

Нужно ли мне вручную устанавливать что-либо о JNA? Насколько я понимаю, это было явно исправлено в 3.2.0 для Linux.


person Mathias Conradt    schedule 01.11.2016    source источник
comment
Просто убедитесь, что вы используете jna-4.1.0 версию.   -  person nguyenq    schedule 02.11.2016
comment
Хорошо, я нигде явно не ссылался на JNA в своем проекте pom, я думал, что все это делается в Tess4J 3.2.1, и это pom.xml (github.com/nguyenq/tess4j/commit/). Я также добавил JNA 4.1.0 в свой pom.xml, и это, похоже, решает проблему.   -  person Mathias Conradt    schedule 02.11.2016


Ответы (1)


Хорошо, я нигде явно не ссылался на JNA в своем проекте pom, я думал, что все это делается в Tess4J 3.2.1 и его pom.xml. Я также добавил JNA 4.1.0 в качестве зависимости в свой собственный pom.xml, и это, похоже, решает проблему.

    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>4.1.0</version>
    </dependency>
person Mathias Conradt    schedule 02.11.2016