我嘗試做OCR和輸出使用Tess4JPDF和的Linux(Ubuntu的16 Xenial)下面的代碼。Tess4J: 「無效的調用約定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已知的(但據說關閉)問題:
- https://github.com/nguyenq/tess4j/issues/35
- https://sourceforge.net/p/tess4j/discussion/1202294/thread/2a25344c/
- https://github.com/zippy1978/ghost4j/issues/44
但我檢查了我的版本還有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版本在更改日誌中說:
Ghostscript的調用3.2版 - 2016年5月15日:恢復JNA 4.1.0由於 「調用 約定63無效」 的錯誤通過Ghost4J在Linux上
所以我認爲我應該用3.2.1來安全。
我需要手動設置有關JNA的任何內容嗎?根據我的理解,這已經明確地在3.2.0中修正了Linux。
只要確保您使用'jna-4.1.0'版本。 – nguyenq
好吧,我沒有明確地引用JNA在我的項目pom中的任何地方,我認爲這全部在Tess4J 3.2.1中完成,它是pom.xml(https://github.com/nguyenq/tess4j/commit/7ea11dd991b02892db335248cfe380ea32aaabf7)。我現在也在我的pom.xml中添加了JNA 4.1.0,這似乎解決了這個問題。 –