2016-11-01 10 views
3

я пытаюсь сделать OCR и вывод как PDF с использованием Tess4J и следующий код на Linux (Ubuntu 16) дружественный.Tess4J: "Invalid соглашение о вызове 63", несмотря на правильные версии

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:

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

Тессеракт и 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: Откат ЮНА 4.1.0 из-за "Invalid вызова конвенции 63" ошибки, ссылающегося GhostScript через Ghost4J на Linux

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

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

+0

Просто убедитесь, что вы используете версию 'jna-4.1.0'. – nguyenq

+0

Хорошо, я явно не упоминал JNA нигде в моем проекте pom, я думал, что все это сделано в Tess4J 3.2.1, и это pom.xml (https://github.com/nguyenq/tess4j/commit/7ea11dd991b02892db335248cfe380ea32aaabf7). Я добавил JNA 4.1.0 в свой pom.xml сейчас, и это, похоже, решает проблему. –

ответ

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>