Spring Boot应用程序中的Tesseract为日语提供了废话结果

时间:2018-12-02 01:14:46

标签: spring-boot tomcat tesseract

我正在编写一个使用Bytedeco's Java Wrapper for Tesseract OCR来解析日语文本的Spring Boot应用程序。我设法使Tesseract在Spring Boot之外运行时可以正常工作,但是当我在Spring Boot应用程序中使用它时,会给我毫无意义的结果。

例如,给出以下图像:

坊ちゃん 夏目漱石

如果我运行以下函数,则结果是合理的:

pgsqlConnection.Open();

打印:

fun main() {
    val api = tesseract.TessBaseAPI()
    api.Init("src/main/resources/tessdata", "jpn_vert")
    api.SetPageSegMode(tesseract.PSM_SINGLE_BLOCK_VERT_TEXT)
    val pixImage = lept.pixRead("src/main/resources/image.png")
    api.SetImage(pixImage)
    val result = api.GetUTF8Text()
    System.out.println("Parsed text: " + result?.string)
}

但是,如果我从Spring Boot Web套接字中运行它,则结果不是:

Parsed text:
坊っちゃん
夏目 滞 石

在调用@SpringBootApplication open class BootApplication fun main(args: Array<String>) { runApplication<BootApplication>(*args) } @Configuration @EnableWebSocket open class WebSocketConfiguration: WebSocketConfigurer { @Bean open fun createWebSocketContainer(): ServletServerContainerFactoryBean { val container = ServletServerContainerFactoryBean() container.maxBinaryMessageBufferSize = 1024000 return container } override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) { registry.addHandler(Endpoint(), "/parse").setAllowedOrigins("*") } } class Endpoint: AbstractWebSocketHandler() { @Throws(IOException::class) override fun handleBinaryMessage(session: WebSocketSession?, message: BinaryMessage?) { // Same code as above: val api = tesseract.TessBaseAPI() api.Init("src/main/resources/tessdata", "jpn_vert") api.SetPageSegMode(tesseract.PSM_SINGLE_BLOCK_VERT_TEXT) val pixImage = lept.pixRead("src/main/resources/image.png") api.SetImage(pixImage) val result = api.GetUTF8Text() System.out.println("Parsed text:\n" + result?.string) } } 时打印以下内容:

handleBinaryMessage

我对一些英语文本进行了快速测试,并且效果很好,所以我认为这个问题是特定于语言的。

我正在使用Spring Boot Gradle插件中的Parsed text: 蝮翫▲縺。繧?繧? 螟冗岼 貊? 遏ウ 任务运行Boot应用程序,该插件启动了Apache Tomcat服务。我的第一个想法是,这与以下事实有关:Tesseract包装器是JNI库,并且它在(Tomcat)中运行的环境不同。如果是这样,是否需要做一些额外的配置才能使Tesseract与Spring Boot和Tomcat一起使用?

作为参考,我的bootRun如下:

build.gradle

1 个答案:

答案 0 :(得分:0)

修改

好像是编码问题。从引导程序外部运行时,Java的file.encoding系统属性设置为UTF-8,而在引导过程中,则设置为windows-31j。将result?.string切换为result?.getString("UTF-8")可以解决此问题。


我将用Bytedeco的Tesseract包装器来解决一个错误。我用tess4j做了等效测试,没有问题:

val imageFile = File("src/main/resources/image.png")
val tess = Tesseract()
tess.setPageSegMode(PSM_SINGLE_BLOCK_VERT_TEXT)
tess.setLanguage("jpn_vert")
System.out.println("Parsed text:\n" + tess.doOCR(imageFile))

给我:

坊っちゃん
夏目 滞 石

符合预期。

我已经提交了ticket on their github,因此希望不久以后就可以清除。