【发布时间】:2015-01-03 05:24:26
【问题描述】:
我有一个使用 Jersey 构建的 REST Web 服务,它通过 Tess4J Java 绑定使用 Tesseract 进行 OCR(光学字符识别)。现在,Tess4J 库希望您向它发送一个图像文件(png、jpg、tif 等),但是通过 Jersey 处理,我得到了一个 包含图像的 InputStream。
如何将此 InputStream 转换为 Tesseract 可以识别的文件类型?我尝试了以下方法:
import org.apache.commons.io.IOUtils;
.....
private static File stream2file (InputStream in) throws IOException {
final File tempFile = File.createTempFile("stream2file", ".tmp");
tempFile.deleteOnExit();
try (FileOutputStream out = new FileOutputStream(tempFile)) {
IOUtils.copy(in, out);
}
return tempFile;
}
但是随后 Tesseract 库抛出一个异常,指出它不接受我发送的文件类型(在本例中为“tmp”)。我尝试将那个小 'tmp' 更改为 'tif' 和其他受支持的文件类型,但只产生了相同的结果,所以我显然在这里遗漏了一些东西。
那么,我如何获取 InputStream,对其进行转换,然后将其作为它所期望的受支持文件类型之一转发到 Tesseract?
【问题讨论】:
-
如何从 WebService 调用中获取 InputStream?您是否曾尝试使用
Image Magick等不同的图像处理工具打开临时文件?您的图像文件(tmp 文件)是否具有预期的大小? ... 顺便提一句。 Java 7java.nio.file.Files支持将InputStreams复制到路径。 -
我使用 POST 通过表单('multipart/form-data')获取图像。不过,图像没有问题,在我使用 Tess4J 的控制台应用程序中完美运行。我没有尝试过 Image Magick 不,我只是可能会。
-
并且临时文件的大小和内容与原始文件相同?从命令提示符调用的 tesseract 是否接受临时文件
-
顺便说一下,
.deleteOnExit();直到 JVM 成功关闭(并且只有在成功关闭时)才会真正删除临时文件。您应该考虑使用类似try { ... } finally { tempFile.delete(); }的东西。在deleteOnExithere 上阅读 Oracle 的更多信息。
标签: java web-services jersey inputstream tesseract