接入指南

OCR 文字识别接入文档

基于 PaddleOCR PP-OCRv4 的中英文图像文字识别接口。共两步:完成身份核验(申请 API Key 并换取 Token,serviceType 选 OCR)→ 调用识别接口提交图片 base64 即可拿到识别文字与坐标。图片识别完毕后不会保存在服务器上

1身份核验(申请 API Key + 换取 Token)

调用识别接口前,需要一个有效的 API Key 并换取 OCR 服务 Token。详细步骤请参阅:

概要:注册账号 → 申请 API Key → 用 ApiKey + serviceType=OCR 换取 Token(有效期 1 小时)→ 使用 Token 调用下方接口。

2调用 OCR 识别接口

接口地址

POST https://<传思网域名>/api/ocr/recognize

请求体(JSON)

字段 必填 类型 说明
token string 身份核验中换取的 OCR 服务专用 Token(serviceType=OCR)。不能用 Poster/ASR/TTS 的 Token
imageBase64 string 图片的 base64 编码字符串。支持带前缀(如 data:image/png;base64,iVBORw...)和不带前缀两种形式,服务端会自动处理。
解码后字节数限制 ≤ 10MB。建议在前端先做压缩(参见步骤 3)。

请求体示例:

json
{
  "token": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
  "imageBase64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/..."
}

响应格式

识别成功:

json
{
  "success": true,
  "count": 3,
  "data": [
    { "text": "传思网", "x": 120, "y":  50, "width": 180, "height": 36 },
    { "text": "OCR 文字识别", "x":  90, "y": 110, "width": 220, "height": 32 },
    { "text": "PP-OCRv4 引擎", "x":  85, "y": 168, "width": 240, "height": 30 }
  ]
}
字段 类型 说明
success boolean 识别是否成功。
count number 识别到的文本块数量(即 data 数组长度)。
data array 识别项数组,每个元素为一个文本块。
data[].text string 识别出的文字内容(已去除首尾空白)。
data[].x / y number 该文本块在原图坐标系下的左上角坐标(单位:像素)。
data[].width / height number 该文本块外接矩形的宽 / 高(单位:像素)。

常见失败响应:

json
// HTTP 400 - 参数错误
{ "success": false, "message": "缺少 token" }
{ "success": false, "message": "缺少 imageBase64" }
{ "success": false, "message": "imageBase64 不是合法的 base64 字符串" }
{ "success": false, "message": "图片大小不能超过 10MB" }

// HTTP 401 - Token 无效
{ "success": false, "message": "token 无效" }
{ "success": false, "message": "token 已过期,请重新换取" }
{ "success": false, "message": "token 不支持 OCR 服务" }

// HTTP 503 - 服务端模型未就绪
{ "success": false, "message": "OCR 模型未就绪,请检查服务器 models/ 目录" }

// HTTP 500 - 识别异常
{ "success": false, "message": "OCR 识别失败: ..." }

curl 示例

bash
curl -X POST https://your-webapi.com/api/ocr/recognize \
  -H "Content-Type: application/json" \
  -d '{
    "token": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
    "imageBase64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/..."
  }'

JavaScript(浏览器)示例

<input type="file"> 选取图片后转为 base64 并提交识别:

html
<input type="file" id="file" accept="image/*">
<button onclick="recognize()">识别</button>

<script>
function fileToBase64(file) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = () => resolve(reader.result); // 含 data: 前缀
        reader.onerror = reject;
        reader.readAsDataURL(file);
    });
}

async function recognize() {
    const file = document.getElementById('file').files[0];
    if (!file) return alert('请选择图片');

    const imageBase64 = await fileToBase64(file);
    const resp = await fetch('https://your-webapi.com/api/ocr/recognize', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            token: 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6',
            imageBase64: imageBase64
        })
    });
    const result = await resp.json();
    if (result.success) {
        console.log('识别 ' + result.count + ' 项:', result.data);
        // result.data: [{ text, x, y, width, height }, ...]
    } else {
        alert(result.message);
    }
}
</script>
隐私安全:图片识别完毕后不会保存到服务器,识别过程全程在内存中完成,识别结束后立即释放。仅会在调用记录中保留鉴权信息(ApiKey、识别项数、调用时间),不保留图片原始内容

3图片压缩建议(强烈推荐)

base64 编码会让数据体积固定膨胀约 33%;手机直拍照片普遍 3~8MB,base64 后会超过 10MB 上限。同时 PaddleOCR 内部会把图像最长边压到 960px,因此前端保留过高分辨率纯属浪费。

推荐参数

参数 推荐值 说明
最长边 1600 px 留给识别精度的余量,再小可能影响小字识别。
输出格式 image/jpeg 体积小、全平台兼容;OCR 对压缩损失不敏感。
质量 0.85 0.7~0.9 之间均可,过低会损失细节笔画。

实测效果:5MB 手机照片 → 压缩后约 200~400KB → base64 后约 270~540KB。

Canvas 前端压缩函数(零依赖,可直接复制使用)

javascript
/**
 * 在浏览器端压缩图片,返回带 data: 前缀的 base64 字符串
 * @param {File|Blob} file        原始图片文件
 * @param {number}    maxSide     最长边像素,默认 1600
 * @param {number}    quality     JPEG 质量 0~1,默认 0.85
 * @returns {Promise<string>}     data:image/jpeg;base64,...
 */
function compressImage(file, maxSide = 1600, quality = 0.85) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = () => {
            const img = new Image();
            img.onload = () => {
                const ratio = Math.min(1, maxSide / Math.max(img.width, img.height));
                const w = Math.round(img.width * ratio);
                const h = Math.round(img.height * ratio);
                const canvas = document.createElement('canvas');
                canvas.width = w; canvas.height = h;
                const ctx = canvas.getContext('2d');
                // 白色底色,避免透明区域被 JPEG 渲染成黑色
                ctx.fillStyle = '#fff';
                ctx.fillRect(0, 0, w, h);
                ctx.drawImage(img, 0, 0, w, h);
                resolve(canvas.toDataURL('image/jpeg', quality));
            };
            img.onerror = reject;
            img.src = reader.result;
        };
        reader.onerror = reject;
        reader.readAsDataURL(file);
    });
}

// 用法:
// const dataUrl = await compressImage(file, 1600, 0.85);
// fetch('/api/ocr/recognize', { ... body: JSON.stringify({ token, imageBase64: dataUrl }) });
其他可选方案:
WebP 格式:把上面的 'image/jpeg' 换成 'image/webp',体积可再缩小 25%~35%(注意服务端需支持 WebP 解码,本接口已支持);
browser-image-compression / pica:高质量重采样库,适合对画质敏感的场景,会增加前端体积;
multipart/form-data:本接口仅支持 JSON+base64;如需二进制上传请联系我们扩展接口。

快速换取 Token

在线测试 Token 换取功能位于「接口身份核验」页面,支持所有服务类型(Poster / OCR / ASR / TTS)。

在线体验

我们提供了一个可视化的演示页,无需写代码即可跑通 OCR 完整流程:

  • OCR 识别演示页:填入 ApiKey 一键换取 OCR Token,上传图片自动转 base64 提交识别,直接展示接口原始报文。

建议先在身份核验页换好 OCR Token,再到识别演示页验证识别效果,最后按上面的示例代码集成到您自己的网站。

注意事项与常见问题

常见错误排查:
「token 不支持 OCR 服务」 — 换取 Token 时 serviceType 必须传 OCR,不能用 Poster/ASR/TTS 的 Token;
「token 已过期」 — Token 有效期 1 小时,过期请重新调 /api/auth/access-token 换取;
「图片大小不能超过 10MB」 — 限制的是 base64 解码后字节数,建议先按步骤 3 压缩;
「imageBase64 不是合法的 base64」 — 检查是否有换行 / URL 编码污染;带 data: 前缀和不带均支持;
识别结果为空数组 — 图片分辨率过低 / 文字过小 / 非中英文字体;可放大或裁剪文字区域后再识别;
「OCR 模型未就绪」 — 服务端配置问题,请联系我们。
调用频率与计费:每次调用接口(无论成功或失败)都会在「调用记录」中产生一条记录,可在控制台 - 调用记录中按 ApiKey、ServiceType=OCR 维度查询。具体计费规则请参考您的套餐说明。