前言:
由于网上很多算法, 以及语言库无法做到精准识别, 所以综合条件下 使用了一款 space OCR API 的产品进行使用, 每个月有25000条的 使用额度, 日常使用或开发绰绰有余
网址链接
通过阅读API 文档我们可以得知, 发送图片解析的方式有三种:
OCR 引擎 1 的特点:
OCR 引擎 2 的特点:
在请求过程中只有两个参数是必填的, 分别是 apikey和 三种上传方式的一种
apikey |
API 密钥 | |
---|---|---|
url 或file 或base64Image |
url :远程图像文件的 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);
}
{
"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"
}
ParsedResults |
OCR结果 | 图像或 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 |
文本 | 解析引擎返回的用于调试的详细错误信息 |