--- comments: true --- # PaddleOCR.js(浏览器端部署) PaddleOCR 提供可在浏览器中运行 PP-OCR 产线的浏览器端 OCR SDK **PaddleOCR.js**。您可以将文字检测与识别能力嵌入 Web 应用,在客户端完成推理。 npm 上的包名为 **`@paddleocr/paddleocr-js`**。源码与演示应用位于 GitHub 仓库的 [`paddleocr-js`](https://github.com/PaddlePaddle/PaddleOCR/tree/{{PADDLEOCR_GITHUB_REF}}/paddleocr-js) 目录。 ## 安装 ```bash npm install @paddleocr/paddleocr-js ``` ## 快速开始 ```js import { PaddleOCR } from "@paddleocr/paddleocr-js"; const ocr = await PaddleOCR.create({ lang: "ch", ocrVersion: "PP-OCRv5", ortOptions: { backend: "auto" } }); const [result] = await ocr.predict(fileOrBlob); console.log(result.items); ``` `predict` 返回 **`OcrResult` 组成的数组**(每张输入图像对应一项)。传入单个 `Blob` / `File` 时也会得到长度为 1 的数组,请使用解构或 `results[0]` 取值。 ## 构造选项 主要有两种构造方式:向 `PaddleOCR.create({ ... })` 传入**直接参数**,或传入 **产线配置** `pipelineConfig`。 ### 1. 直接参数 可通过直接参数指定模型,也可设置推理 batch size、ORT 选项等运行参数。 **按语言与版本选择模型** — `lang` + `ocrVersion`: ```js await PaddleOCR.create({ lang: "ch", ocrVersion: "PP-OCRv5" }); ``` **按内置模型名选择**: ```js await PaddleOCR.create({ textDetectionModelName: "PP-OCRv5_mobile_det", textRecognitionModelName: "PP-OCRv5_mobile_rec" }); ``` **自定义模型** — 为检测 / 识别分别指定模型名与资源地址: ```js await PaddleOCR.create({ textDetectionModelName: "my_det_model", textDetectionModelAsset: { url: "https://example.com/models/my_det_model.tar" }, textRecognitionModelName: "my_rec_model", textRecognitionModelAsset: { url: "https://example.com/models/my_rec_model.tar" } }); ``` **batch size 与 ORT 选项等运行参数**: ```js await PaddleOCR.create({ lang: "ch", ocrVersion: "PP-OCRv5", textDetectionBatchSize: 2, textRecognitionBatchSize: 8, ortOptions: { backend: "wasm", wasmPaths: "/assets/" } }); ``` #### 自定义模型包格式与校验行为 SDK 通过 HTTP(S) 下载 `textDetectionModelAsset.url` / `textRecognitionModelAsset.url` 指向的资源,并按 **标准 ustar tar(未压缩)** 解析。请保证: | 要求 | 说明 | |------|------| | 归档格式 | 响应体需为 **未压缩的 `.tar`**。当前实现不对 **`.tar.gz` / gzip** 做解压;若误传压缩包,解析结果通常不正确,随后会报错。 | | 必需文件 | tar 内必须包含 **`inference.onnx`** 与 **`inference.yml`**(可在子目录中;按文件名匹配)。 | | `model_name` | `inference.yml` 中必须能解析出 **`model_name`**,且须与您在 `create` 中传入的 `textDetectionModelName` / `textRecognitionModelName` **完全一致**。初始化加载模型后会校验。 | 如需从 Paddle 模型转换得到这里使用的 ONNX 模型文件,可参考 [获取 ONNX 模型](../others/obtaining_onnx_models.md)。按该文档转换得到的标准模型文件,可按上述要求打包为 `.tar` 后提供给 PaddleOCR.js 使用。 若格式不满足要求,通常会在初始化阶段以 **抛出带明确信息的 `Error`** 失败,例如:下载非 2xx、tar 中找不到 `inference.onnx` / `inference.yml`、资源为空、`model_name` 缺失或与所选名称不一致、模型配置不完整,或 ONNX 无法加载。不会在后台静默失败。 所有通过上述方式选用的 OCR 模型,其 `inference.yml` 都应满足上述 `model_name` 约定。 ### 2. 产线配置 ```js import { PaddleOCR } from "@paddleocr/paddleocr-js"; const pipelineConfig = ` pipeline_name: OCR SubModules: TextDetection: model_name: PP-OCRv5_mobile_det batch_size: 2 TextRecognition: model_name: PP-OCRv5_mobile_rec batch_size: 6 `; const ocr = await PaddleOCR.create({ pipelineConfig }); ``` `pipelineConfig` 可以是 YAML 文本,也可以是已解析的对象。在浏览器中,子模块的 `model_dir` 仅支持 **`null` 或资源描述对象**(形如 `{ url: "..." }`),不支持本地路径字符串。如需基于 PaddleOCR / PaddleX 导出的产线配置作为起点,可参考 [PaddleOCR 与 PaddleX](../../paddleocr_and_paddlex.md) 中“导出产线配置文件”一节;导出的 YAML 可作为 `pipelineConfig` 的基础,再按浏览器端要求将其中的 `model_dir` 调整为资源描述对象。 若同时提供直接参数与 `pipelineConfig`,**以直接参数为准**。 ## 预测 ### 参数 `ocr.predict(image | images[], params?)` 同时接受 camelCase 与 PaddleOCR 风格的 snake_case: - `textDetLimitSideLen` / `text_det_limit_side_len` - `textDetLimitType` / `text_det_limit_type` - `textDetMaxSideLimit` / `text_det_max_side_limit` - `textDetThresh` / `text_det_thresh` - `textDetBoxThresh` / `text_det_box_thresh` - `textDetUnclipRatio` / `text_det_unclip_ratio` - `textRecScoreThresh` / `text_rec_score_thresh` 支持的 `image` 类型包括:`Blob`、`ImageBitmap`、`ImageData`、`HTMLCanvasElement`、`HTMLImageElement`、`cv.Mat`。可传入上述类型的数组以在一次调用中处理多图。 在 **Worker 模式**下,`cv.Mat` 无法传输,不能作为 Worker 路径的输入。 ### 返回值 返回 `Promise`。每个 `OcrResult` 包含: - `image`:该图源尺寸 `{ width, height }` - `items`:识别行(`poly`、`text`、`score`) - `metrics`:`detMs`、`recMs`、`totalMs`、`detectedBoxes`、`recognizedCount` — 框数与行数为**每张图**统计;`detMs`、`recMs`、`totalMs` 为**整次** `predict()` 调用耗时(多图时每一项上这三个值相同) - `runtime`:请求的后端与各阶段 Provider 等元数据 ## Worker 模式 可在独立 Worker 中运行产线,同时保持相同的高层 API: ```js import { PaddleOCR } from "@paddleocr/paddleocr-js"; const ocr = await PaddleOCR.create({ lang: "ch", ocrVersion: "PP-OCRv5", worker: true, ortOptions: { backend: "wasm", wasmPaths: "https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/", numThreads: 2, simd: true } }); ``` 行为概要: - Worker 模式使用包内 Worker 脚本路径,而非 ONNX Runtime Web 的 `env.wasm.proxy` - 启用 `worker: true` 时,包内会关闭 ORT 的 wasm proxy,避免双层 Worker - 浏览器输入先在主线程标准化,再传入 Worker 推理 - `cv.Mat` 仅支持主线程产线路径 ## 可视化 可选子路径 **`@paddleocr/paddleocr-js/viz`** 提供将 OCR 结果渲染为图像的工具。 ```js import { OcrVisualizer } from "@paddleocr/paddleocr-js/viz"; const viz = new OcrVisualizer({ font: { family: "Noto Sans SC", source: "/fonts/NotoSansSC-Regular.ttf" } }); const blob = await viz.toBlob(imageBitmap, result); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "ocr_result.png"; a.click(); URL.revokeObjectURL(url); viz.dispose(); ``` 也提供一次性函数 `renderOcrToBlob` 与 `deterministicColor`(用于与内置检测框配色一致)。可视化需传入**单个** `OcrResult`(单张图时取 `predict` 返回数组的首项)。 ## API 摘要 - `PaddleOCR.create(options)` - `ocr.initialize()` / `ocr.getInitializationSummary()` - `ocr.predict(image | images[], params?)` → `Promise` - `ocr.dispose()` - `parseOcrPipelineConfigText(text)` / `normalizeOcrPipelineConfig(config)` - `OcrVisualizer`、`renderOcrToBlob`、`deterministicColor`(`@paddleocr/paddleocr-js/viz`) ## 宿主环境职责 SDK 内部管理 OpenCV.js 与 ONNX Runtime。您仍需自行处理: - 启用多线程 WASM 或 WebGPU 时所需的 **COOP/COEP** 等响应头 - **ORT 环境选项**(如 `wasmPaths`、线程数、SIMD) - 使用 **`worker: true`** 时,构建工具需能产出并加载 **module worker**