开发者OCR集成指南:从零开始接入OCR API
面向开发者的OCR API集成教程,包含多种编程语言示例、错误处理、性能优化和最佳实践。
阅读时间 14 分钟
为什么开发者需要 OCR
作为开发者,你可能在以下场景需要集成 OCR 功能:
- 开发文档管理系统,需要全文检索扫描件
- 构建财务应用,自动识别发票信息
- 开发移动 App,实现拍照识别功能
- 搭建 RPA 流程,自动化处理纸质文档
- 构建数据采集系统,从图片中提取结构化数据
EasyOCR API 概述
API 端点
POST https://api.easyocr.org/ocr
请求格式
使用 multipart/form-data 格式上传图片文件。
支持的图片格式
- JPEG / JPG
- PNG
- BMP
- WebP
响应格式
{
"success": true,
"text": "识别出的文字内容",
"confidence": 0.98
}
多语言代码示例
JavaScript / Node.js
// 使用 fetch API(浏览器或 Node.js 18+)
async function recognizeText(imageFile) {
const formData = new FormData();
formData.append('file', imageFile);
const response = await fetch('https://api.easyocr.org/ocr', {
method: 'POST',
body: formData
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
}
// Node.js 使用 axios
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
async function recognizeFile(filePath) {
const form = new FormData();
form.append('file', fs.createReadStream(filePath));
const response = await axios.post('https://api.easyocr.org/ocr', form, {
headers: form.getHeaders()
});
return response.data;
}
Python
import requests
def recognize_text(image_path):
"""识别图片中的文字"""
url = 'https://api.easyocr.org/ocr'
with open(image_path, 'rb') as f:
files = {'file': (image_path, f, 'image/jpeg')}
response = requests.post(url, files=files)
response.raise_for_status()
return response.json()
# 使用示例
result = recognize_text('document.jpg')
print(f"识别结果: {result['text']}")
Java
import java.io.*;
import java.net.http.*;
import java.net.URI;
import java.nio.file.*;
public class OCRClient {
private static final String API_URL = "https://api.easyocr.org/ocr";
public static String recognizeText(String imagePath) throws Exception {
HttpClient client = HttpClient.newHttpClient();
String boundary = "----WebKitFormBoundary" + System.currentTimeMillis();
Path path = Paths.get(imagePath);
byte[] fileBytes = Files.readAllBytes(path);
String body = "--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"" +
path.getFileName() + "\"\r\n" +
"Content-Type: image/jpeg\r\n\r\n";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(body.getBytes());
baos.write(fileBytes);
baos.write(("\r\n--" + boundary + "--\r\n").getBytes());
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(API_URL))
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(HttpRequest.BodyPublishers.ofByteArray(baos.toByteArray()))
.build();
HttpResponse response = client.send(request,
HttpResponse.BodyHandlers.ofString());
return response.body();
}
}
Go
package main
import (
"bytes"
"io"
"mime/multipart"
"net/http"
"os"
"path/filepath"
)
func recognizeText(imagePath string) (string, error) {
file, err := os.Open(imagePath)
if err != nil {
return "", err
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("file", filepath.Base(imagePath))
if err != nil {
return "", err
}
_, err = io.Copy(part, file)
if err != nil {
return "", err
}
writer.Close()
req, err := http.NewRequest("POST", "https://api.easyocr.org/ocr", body)
if err != nil {
return "", err
}
req.Header.Set("Content-Type", writer.FormDataContentType())
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
respBody, err := io.ReadAll(resp.Body)
return string(respBody), err
}
PHP
<?php
function recognizeText($imagePath) {
$url = 'https://api.easyocr.org/ocr';
$curl = curl_init();
$postFields = [
'file' => new CURLFile($imagePath)
];
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postFields
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($httpCode !== 200) {
throw new Exception("HTTP Error: $httpCode");
}
return json_decode($response, true);
}
// 使用示例
$result = recognizeText('document.jpg');
echo "识别结果: " . $result['text'];
?>
错误处理
常见错误码
| 状态码 | 含义 | 处理方式 |
| 400 | 请求格式错误 | 检查是否正确上传了文件 |
| 413 | 文件过大 | 压缩图片后重试 |
| 415 | 不支持的格式 | 转换为支持的图片格式 |
| 429 | 请求过于频繁 | 添加延迟后重试 |
| 500 | 服务器错误 | 稍后重试 |
错误处理示例
async function recognizeWithRetry(imageFile, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const result = await recognizeText(imageFile);
return result;
} catch (error) {
if (error.status === 429) {
// 请求过于频繁,等待后重试
await new Promise(r => setTimeout(r, 1000 * (i + 1)));
continue;
}
if (error.status >= 500) {
// 服务器错误,等待后重试
await new Promise(r => setTimeout(r, 2000));
continue;
}
// 其他错误直接抛出
throw error;
}
}
throw new Error('Max retries exceeded');
}
性能优化建议
1. 图片预处理
- 压缩大图片,建议宽度不超过 2000px
- 使用 JPEG 格式,质量设为 80-90%
- 裁剪掉不需要识别的区域
2. 并发控制
- 控制并发请求数量(建议 3-5 个)
- 使用请求队列管理大批量任务
- 添加适当的请求间隔
3. 缓存策略
- 对相同图片的识别结果进行缓存
- 使用图片哈希作为缓存键
安全注意事项
- 不要在前端代码中暴露敏感的 API 密钥
- 对用户上传的图片进行格式和大小验证
- 敏感文档识别后及时清理临时文件
- 考虑使用 HTTPS 确保传输安全