为什么我无法捕获TesseractException?

时间:2019-07-24 08:03:06

标签: java swing tesseract tess4j

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

Code sample

在测试过程中,我想测试锁扣是否闭合,因此我向Tesseract输入了错误的信息,这应该导致TesseractException。 我设法从TesseractException方法中引出createDocuments()。 这是堆栈跟踪: Console Output

请注意,在异常中,我们可以在try-catch子句中找到doOcr()的line 125,但是即使控制台显示抛出了TesseractException,代码也会移至{ {1}}返回true。

我使用line 126来启动OCR流程,但是我也尝试了net.sourceforge.tess4j.Tesseract,这导致了与Tess4j相同的红色控制台输出,但是没有net.sourceforge.tess4j.Tesseract1

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

2 个答案:

答案 0 :(得分:1)

查看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 {catch}块中,其主体为logger.error(e.getMessage(), e);(第555行)。

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

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

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

答案 1 :(得分:0)

将pdf.ttf文件添加到tessdata路径(tessdata / pdf.ttf) pdf.ttf