我正在编写一个使用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
答案 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,因此希望不久以后就可以清除。