2016-11-01 4 views
3

나는 Tess4J를 사용하여 PDF리눅스 (우분투 16 주객 관계의)에 다음과 같은 코드로 OCR 출력을하려고합니다.Tess4J : "잘못된 호출 규칙 (63)"올바른 버전에도 불구하고이

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 알려진 (그러나 폐쇄 형) 문제가 발견 :

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

    예외가 발생 https://github.com/nguyenq/tess4j/issues/35

  • https://github.com/zippy1978/ghost4j/issues/44

  • https://sourceforge.net/p/tess4j/discussion/1202294/thread/2a25344c/
  • 6,는하지만 내 버전뿐만 아니라 TESSDATA_PREFIX의 ENV 변수를 확인했습니다. 내가 볼 수있는 한 모두 올바르게 설정되었습니다.

    정팔 포체 및 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 -v                      
    GPL Ghostscript 9.18 (2015-10-05)                           
    Copyright (C) 2015 Artifex Software, Inc. All rights reserved. 
    

    Tess4j 버전 (이 내가 apt-get를 통해 얻을 최신 버전입니다) :

    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-2016 월 15 일 : 인해

    리눅스

    에 Ghost4J를 통해 고스트 스크립트를 호출 오류 "잘못된 규칙 (63)을 호출"에 4.1.0에 JNA 되돌리기

    그래서 나는 3.2.1에서 안전해야한다고 생각했습니다.

    JNA에 대해 수동으로 설정해야합니까? 내 이해에서, 이것은 Linux 용 3.2.0에서 명시 적으로 수정되었습니다.

    +0

    'jna-4.1.0' 버전을 사용하고 있는지 확인하십시오. – nguyenq

    +0

    좋아, 내가 어디에 명시 적으로 내 프로젝트 pom에서 JNA를 참조하지 않았다, 나는이 모든 Tess4J 3.2.1에서다고 생각하고 pom.xml (https://github.com/nguyenq/tess4j/commit/7ea11dd991b02892db335248cfe380ea32aaabf7)이야. 이제 내 pom.xml에 JNA 4.1.0을 추가했는데 문제가 해결 된 것 같습니다. –

    답변

    1

    좋아, 내가 명시 적으로 내 프로젝트 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>