我正在使用Tess4j来使用Tesseract-OCR技术,并且一直在使用以下代码:

java - 为什么我不能 catch TesseractException?-LMLPHP

在测试过程中,我想测试锁扣,因此我向Tesseract输入了错误的信息,这应该导致TesseractException
我设法从TesseractException方法中引出createDocuments()
这是堆栈跟踪:
java - 为什么我不能 catch TesseractException?-LMLPHP

请注意,在例外情况下,我们可以在try-catch子句中找到doOcr()的line 125,但是即使控制台显示抛出了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行抛出异常。上面的公共方法在第551行调用了此方法。该方法位于try捕获块中,捕获主体中为logger.error(e.getMessage(), e);(第555行)。

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

如果您不想看到此日志,可以将slf4j配置为不从该库中打印日志。

如果您想获取实际的异常,则无法执行,因为库会将其吞噬。我不熟悉该库,但是查看代码似乎没有任何不错的选择-引发异常的方法是私有的,并且仅在这一位置使用-try-catch块下。但是,当api.TessBaseAPIProcessPages(...)返回ITessAPI.FALSE并且api具有吸气剂时,将引发异常。这样就可以得到它,调用TessBaseAPIProcessPages(...)方法并检查结果。这可能不理想,因为每个图像可能要处理两次。另一个解决方案是分叉源代码并自行修改。您可能还希望与作者联系并寻求建议-您可以进一步提出建议并提交拉取请求,以供他们批准和发布。

09-13 07:51