Tess4J:"Invalid calling convention 63" 尽管版本正确

Tess4J: "Invalid calling convention 63" despite correct versions

我尝试使用 Tess4J 和以下代码执行 OCR 并输出为 PDF 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 的一个已知(但应该已解决)问题:

但我检查了我的版本以及 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 版说:

Version 3.2 - 15 May 2016: Revert JNA to 4.1.0 due to "Invalid calling convention 63" errors invoking GhostScript via Ghost4J on Linux

所以我认为 3.2.1 应该是安全的。

我是否需要手动设置有关 JNA 的任何内容?据我了解,这已在 3.2.0 中明确修复 Linux。

好的,我没有在我的项目 pom 中的任何地方明确引用 JNA,我认为这都是在 Tess4J 3.2.1 及其 pom.xml 中完成的。我现在也在自己的 pom.xml 中添加了 JNA 4.1.0 作为依赖项,这似乎解决了问题。

    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>4.1.0</version>
    </dependency>