开发文档

开发者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 确保传输安全

相关资源

这篇文章有帮助吗?

欢迎访问帮助中心

分享: