java - 为什么我无法捕获 TesseractException?

标签 java swing tesseract tess4j

我正在使用 Tess4j为了使用 Tesseract-OCR 技术,我一直在使用以下代码:

Code sample

在测试期间,我想测试捕获关闭,所以我向 Tesseract 提供了错误的信息,这应该会导致 TesseractException。 我设法从 createDocuments() 方法中引发了一个 TesseractException。 这是堆栈跟踪: Console Output

请注意,在异常中我们可以找到 doOcr() 的 line 125,它在 try-catch 子句中,但即使控制台显示 TesseractException 正在抛出,代码移动到 line 126 返回 true。

我使用 net.sourceforge.tess4j.Tesseract 启动 OCR 过程,但我也尝试了 net.sourceforge.tess4j.Tesseract1,结果是相同的红色控制台由 Tess4j 完成的输出,但没有 TesseractException

我的问题是我做错了什么?我只是假设我的代码存在问题,因为正在抛出 TesseractException,但我的代码没有捕捉到它。

最佳答案

查看Tesseract.java源码:

@Override
public void createDocuments(String[] filenames, String[] outputbases, List<RenderedFormat> formats) throws TesseractException {
    if (filenames.length != outputbases.length) {
        throw new RuntimeException("The two arrays must match in length.");
    }

    init();
    setTessVariables();

    try {
        for (int i = 0; i < filenames.length; i++) {
            File workingTiffFile = null;
            try {
                String filename = filenames[i];

                // if PDF, convert to multi-page TIFF
                if (filename.toLowerCase().endsWith(".pdf")) {
                    workingTiffFile = PdfUtilities.convertPdf2Tiff(new File(filename));
                    filename = workingTiffFile.getPath();
                }

                TessResultRenderer renderer = createRenderers(outputbases[i], formats);
                createDocuments(filename, renderer);
                api.TessDeleteResultRenderer(renderer);
            } catch (Exception e) {
                // skip the problematic image file
                logger.error(e.getMessage(), e);
            } finally {
                if (workingTiffFile != null && workingTiffFile.exists()) {
                    workingTiffFile.delete();
                }
            }
        }
    } finally {
        dispose();
    }
}

/**
 * Creates documents.
 *
 * @param filename input file
 * @param renderer renderer
 * @throws TesseractException
 */
private void createDocuments(String filename, TessResultRenderer renderer) throws TesseractException {
    api.TessBaseAPISetInputName(handle, filename); //for reading a UNLV zone file
    int result = api.TessBaseAPIProcessPages(handle, filename, null, 0, renderer);

    if (result == ITessAPI.FALSE) {
        throw new TesseractException("Error during processing page.");
    }
}

在第 579 行抛出异常。此方法由上面的公共(public)方法调用 - 在第 551 行。这是在带有 logger.error(e.getMessage(), e);< 的 try-catch block 内 在 catch 正文中(第 555 行)。

现在的问题是您真正想要实现的目标是什么?

如果不想看到这个日志,可以配置slf4j不打印这个库的日志。

如果你想得到实际的异常,这是不可能的,因为库吞噬了它。我不熟悉该库,但查看代码似乎没有任何好的选项 - 抛出异常的方法是私有(private)的并且仅在这个地方使用 - 在 try-catch block 下。但是,当 api.TessBaseAPIProcessPages(...) 返回 ITessAPI.FALSE 并且 api 有一个 getter 时,会抛出异常。所以你可以得到它,调用 TessBaseAPIProcessPages(...) 方法并检查结果。这可能并不理想,因为您可能会对每个图像处理两次。另一种解决方案是 fork 源代码并自行修改。您可能还想联系作者并寻求建议 - 您可以更进一步并提交拉取请求以供他们批准和发布。

关于java - 为什么我无法捕获 TesseractException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57178075/

相关文章:

java - MongoDB 从嵌套文档中读取

java - 使用 imageio 编写 jpeg2000 的问题

java - 将变量用于任何类型并在 Java 中检查它的类型?

java - 存储用户数据 Java Swing

c++ - 如何从图像中检测文本区域?

java - 如何使用 Java 在 PC 扬声器上发出噪音

JAVA设置JFrame的最大大小

java - 调用数据库时应用程序卡住

iphone - 从超立方体图像中获取文本的确切位置

c# - OCR 引擎从图像中捕获字符