我正在使用Tess4j来使用Tesseract-OCR技术,并且一直在使用以下代码:
在测试过程中,我想测试锁扣,因此我向Tesseract输入了错误的信息,这应该导致TesseractException
。
我设法从TesseractException
方法中引出createDocuments()
。
这是堆栈跟踪:
请注意,在例外情况下,我们可以在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(...)
方法并检查结果。这可能不理想,因为每个图像可能要处理两次。另一个解决方案是分叉源代码并自行修改。您可能还希望与作者联系并寻求建议-您可以进一步提出建议并提交拉取请求,以供他们批准和发布。