Java 实现图片OCR文字识别功能

前言:

由于网上很多算法, 以及语言库无法做到精准识别, 所以综合条件下 使用了一款 space OCR API 的产品进行使用, 每个月有25000条的 使用额度, 日常使用或开发绰绰有余

网址链接


一. 注册 API 秘钥
1. 进入网址点击下面的注册链接输入自己的邮箱以及开发用途就会收到一个秘钥
image-20210927110736558
2. 注册好的API如下
image-20210927111035189
二. API解析
1. 上传方式选择

通过阅读API 文档我们可以得知, 发送图片解析的方式有三种:

  1. ) URL 上传, 前提是需要将图片放到公网可以访问到的位置
  2. ) File 上传, 通过Post 请求将图片放到from-data中发送
  3. ) base64编码上传 [推荐~]
2. 识别引擎选择

OCR 引擎 1 的特点:

  • - 支持更多语言(包括中文、日文和韩文等亚洲语言)
  • - 快点
  • - 支持更大的图像
  • - 多页 TIFF 扫描支持
  • - 参数:OCREngine=1

OCR 引擎 2 的特点:

3. 传参选择

在请求过程中只有两个参数是必填的, 分别是 apikey和 三种上传方式的一种

  1. ) language 在识别中文时可以选择 chs(简体), cht(繁体) 两种, 不识别中文可以选择引擎二 并且不用填写该参数
  2. ) filetype 填写该参数可以有效的增加识别精度
  3. ) scale 如果设置为 true,api 会进行一些内部升级。这可以显着改善 OCR 结果,尤其是对于低分辨率 PDF 扫描。 API 默认使用 scale=false
4. 请求参数解析
apikeyAPI 密钥
urlfilebase64Imageurl:远程图像文件的 URL(确保它具有正确的内容类型file:具有文件名的多部分编码图像文件 base64Image:图像或 PDF 作为Base64 编码字符串您可以使用三种方法上传输入图像或 PDF。对于大于 10 MB 的文件,我们建议使用 URL 方法以提高上传速度。
language[可选] 阿拉伯语=ara 保加利亚语=bul 中文(简体)=chs 中文(繁体)=cht 克罗地亚语=hrv 捷克语=cze 丹麦语=dan 荷兰语=dut 英语=eng 芬兰语=fin 法语=fre 德语=ger 希腊语=gre 匈牙利语=hun 韩语=kor 意大利语=ita 日语=jpn 波兰语=pol 葡萄牙语=por 俄语=rus 斯洛文尼亚语=slv 西班牙语=spa 瑞典语=swe 土耳其语 = tur用于 OCR 的语言。如果未指定语言,eng则默认使用英语。 重要提示:语言代码总是3-letters(不是 2)。所以它是“eng”而不是“en”。 Engine2具有自动西文检测功能,因此该值将被忽略。
isOverlayRequired[可选] 布尔值默认值 =False 如果为 true,则返回每个单词的边界框坐标。如果为 false,则 OCR 处理的文本仅作为文本块返回(这会使 JSON 响应变小)。例如,覆盖数据可用于在图像上显示文本
filetype[可选] 字符串值:PDF、GIF、PNG、JPG、TIF、BMP覆盖基于content-type的自动文件类型检测。支持的图像文件格式有 png、jpg (jpeg)、gif、tif (tiff) 和 bmp。对于文档 ocr,api 支持 Adobe PDF 格式。支持多页 TIFF 文件。
detectOrientation[可选] 真/假如果设置为 true,api 会正确自动旋转图像并TextOrientation在 JSON 响应中设置参数。如果图像旋转,则TextOrientation=0,否则为旋转度数,例如“270”。
isCreateSearchablePdf[可选] 布尔值默认值 =False 如果为 true,API 会生成可搜索的 PDF。此参数自动设置 isOverlayRequired = true。
isSearchablePdfHideTextLayer[可选] 布尔值默认值 = False。如果为 true,则隐藏文本层(不可见)
scale[可选] 真/假如果设置为 true,api 会进行一些内部升级。这可以显着改善 OCR 结果,尤其是对于低分辨率 PDF 扫描。请注意, API 默认使用 scale=false
isTable[可选] 真/假如果设置为 true,则 OCR 逻辑确保始终逐行返回解析的文本结果。建议将此开关用于 表格 OCR收据 OCR、发票处理和所有其他类型的具有表格结构的输入文档。
OCREngine[可选] 1 或 2引擎 1 是默认值

三. 编写代码解析图片
public static void main(String[] args) {
        HashMap<String,Object> map = new HashMap<>();
        String imgStr = "data:image/jpg;base64,"+getImgStr("G:/2021-09-24/c8dc889efdb06f4f3860e2cd8ff1750.jpg");
        map.put("apikey","your keys");
        //map.put("url","https://gitee.com/Jarvis_D/typora-images/raw/master/img/0f08de942bb82ff8675f790b9b0a74a.png");
        map.put("base64Image",imgStr);
        //map.put("language","chs");
        map.put("filetype","JPG");
        map.put("OCREngine",2);
        //map.put("scale",true);
        String yy = HttpUtil.post("https://api.ocr.space/parse/image",map);
        //String yy = HttpUtils.doPostToJson("https://api.ocr.space/parse/image", JSON.toJSONString(map));
        JsonRootBean jsonRootBean = JSON.parseObject(yy, JsonRootBean.class);
        System.err.println(jsonRootBean.getParsedResults().get(0).getParsedText());
    }

    /**
     * 将图片转换成Base64编码
     * @param imgFile 待处理图片
     * @return
     */
    public static String getImgStr(String imgFile) {
        InputStream in = null;
        byte[] data = null;
        try {
            // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Base64.encodeBase64String(data);
    }

四. 返回结果的解析
1. 返回格式
{
        "ParsedResults" : [
            {
                "TextOverlay" : {
                    "Lines" : [
                        {
                            "Words": [
                                {
                                "WordText": "Word 1",
                                "Left": 106,
                                "Top": 91,
                                "Height": 9,
                                "Width": 11
                                },
                                {
                                "WordText": "Word 2",
                                "Left": 121,
                                "Top": 90,
                                "Height": 13,
                                "Width": 51
                                }
                            ],
                            "MaxHeight": 13,
                            "MinTop": 90
                        }
                    ],
                "HasOverlay" : true,
                "Message" : null
                },
                "FileParseExitCode" : "1",
                "ParsedText" : "This is a sample parsed result",
                                        
                "ErrorMessage" : null,
                "ErrorDetails" : null
            },
            {
                "TextOverlay" : null,
                "FileParseExitCode" : -10,
                "ParsedText" : null,
                                        
                "ErrorMessage" : "...error message (if any)",
                "ErrorDetails" : "...detailed error message (if any)"
            }
            ],
        "OCRExitCode" : "2",
        "IsErroredOnProcessing" : false,
        "ErrorMessage" : null,
        "ErrorDetails" : null,
        "SearchablePDFURL": "https://.....",
        "ProcessingTimeInMilliseconds" : "3000"
    }

2. 返回参数解析
ParsedResultsOCR结果图像或 PDF 每一页的 OCR 结果。对于 PDF:每个页面都有自己的 OCR 结果和错误消息(如果有)
OCRExitCode整数退出代码显示 OCR 是否成功完成、部分或失败并出现错误 1:解析成功(图像/所有页面解析成功) 2:部分解析(所有页面中只有几页成功解析) 3:图像/所有 PDF 页面解析失败(这主要发生因为 OCR 引擎无法解析图像) 4:尝试解析时发生错误(在解析过程中发生致命错误时会发生这种情况)
IsErroredOnProcessing真假如果在解析 Image/PDF 页面时发生错误
ErrorMessage文本解析图片时出现错误的报错信息
ErrorDetails文本详细的错误信息
SearchablePDFURL关联查看可搜索的 PDF
图像/页面解析结果
FileParseExitCode每个解析结果的退出代码解析引擎返回的退出代码 0:File not found 1:Success -10:OCR Engine Parse Error -20:Timeout -30:Validation Error -99:Unknown Error
ParsedText解析文本图像的解析文本
TextOverlay图像/pdf 中文本的覆盖数据仅当 ‘isOverlayRequired’ 设置为 ‘True’
Lines覆盖文本中的行数组这包含所有行的数组。每行将包含一个单词数组
Words一行中的一组单词这包含具有单词特定细节的单词,例如其文本和位置
WordText文字的文字这包含该特定单词的文本
Left单词与左侧的距离(以像素 (px) 为单位)包含单词与图像左边缘的距离(以 px 为单位)
Top单词与顶部的距离(以 px 为单位)包含单词与图像上边缘的距离(以 px 为单位)
Height字的高度包含单词的高度(以像素为单位)
Width字宽包含单词的宽度(以像素为单位)
MaxHeight线的最大高度包含线的高度(以像素为单位)
MinTop线距图像上边缘的最小距离包含图像原始大小中线距顶部边缘的距离(以 px 为单位)
HasOverlay叠加层是否存在真/假取决于解析结果的覆盖是否存在
ErrorMessage文本解析引擎返回的错误信息
ErrorDetails文本解析引擎返回的用于调试的详细错误信息

更多推荐