接入指南
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 格式:把上面的
• browser-image-compression / pica:高质量重采样库,适合对画质敏感的场景,会增加前端体积;
• multipart/form-data:本接口仅支持 JSON+base64;如需二进制上传请联系我们扩展接口。
• 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 时
• 「token 已过期」 — Token 有效期 1 小时,过期请重新调
• 「图片大小不能超过 10MB」 — 限制的是 base64 解码后字节数,建议先按步骤 3 压缩;
• 「imageBase64 不是合法的 base64」 — 检查是否有换行 / URL 编码污染;带
• 识别结果为空数组 — 图片分辨率过低 / 文字过小 / 非中英文字体;可放大或裁剪文字区域后再识别;
• 「OCR 模型未就绪」 — 服务端配置问题,请联系我们。
• 「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 维度查询。具体计费规则请参考您的套餐说明。