2016-11-01 3 views
3

Ich versuche OCR und Ausgabe als PDF mit Tess4J und dem folgenden Code auf Linux (Ubuntu 16 Xenial) zu tun. Tess4J: "Ungültige Aufrufkonvention 63" trotz korrekten Versionen

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); 
} 

Die letzte Zeile

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

löst eine Ausnahme:

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) 

ich dies mit Tess4J eine bekannte (aber angeblich geschlossen) Thema sein gefunden:

aber ich habe meine Versionen sowie die TESSDATA_PREFIX env Variable. Soweit ich sehen kann, ist alles richtig eingestellt.

Tesseract und Leptonica Version:

$ /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 Version: (dies ist die neueste Version, die ich über apt-get bekommen)

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

Tess4j Version:

3.2.1 

und die TESSDATA_PREFIX (die Konfigurationsdateien usw. unter /projects/de.conradt.core/tessdata sind):

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

bei dem Release-Protokoll Tess4j Suche: http://tess4j.sourceforge.net/changelog.html, soll ich die richtige Version verwendet werden Stapel. Besonders Version 3.2 im Änderungsprotokoll sagt:

Version 3.2 - 15. Mai 2016: JNA Revert to 4.1.0 wegen "Invalid Aufruf Konvention 63" Fehler Ghost über Ghost4J auf Linux

Aufruf

so dachte ich, ich sollte mit 3.2.1 sicher sein.

Muss ich manuell etwas über JNA einstellen? Aus meiner Sicht wurde dies explizit für Linux in 3.2.0 behoben.

+0

Stellen Sie sicher, dass Sie 'jna-4.1.0' Version verwenden. – nguyenq

+0

Ok, ich habe JNA nirgendwo explizit in meinem Projekt pom erwähnt, ich dachte, das ist alles in Tess4J 3.2.1 und es ist pom.xml (https://github.com/nguyenq/tess4j/commit/7ea11dd991b02892db335248cfe380ea32aaabf7). Ich habe jetzt auch JNA 4.1.0 in meiner pom.xml hinzugefügt und das scheint das Problem zu lösen. –

Antwort

1

Ok, ich habe JNA nirgendwo explizit in meinem Projekt pom erwähnt, ich dachte, das ist alles in Tess4J 3.2.1 und seiner pom.xml. Ich habe jetzt JNA 4.1.0 als eine Abhängigkeit in meine eigene pom.xml hinzugefügt, und dies scheint das Problem zu lösen.

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