PaddleOCR 官方 API TypeScript SDK 集成指南:Node.js 云端 OCR 与文档解析实战
2026/9/19 13:38:13 网站建设 项目流程

PaddleOCR 官方 API TypeScript SDK 集成指南:Node.js 云端 OCR 与文档解析实战

【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR

PaddleOCR 官方 API TypeScript SDK(@paddleocr/api-sdk)面向 Node.js 18+ 环境,通过调用 PaddleOCR 官方云端服务完成 OCR 识别与文档解析,无需在本地安装飞桨推理环境。本文基于该 SDK 的官方文档与仓库源码(api_sdk/typescript),系统讲解安装认证、异步任务提交/轮询模型、模型选择、客户端与请求级配置、结果结构与资源下载、错误处理等完整链路,帮助你直接用 TypeScript/JavaScript 接入 PP-OCRv5、PP-OCRv6 识别与 PP-StructureV3、PaddleOCR-VL 系列文档解析能力。

SDK 定位与适用场景

官方 API TypeScript SDK 是一个云端服务客户端,而非本地推理框架:它调用托管在 AI Studio 上的 PaddleOCR 官方 API,由服务端负责模型加载与计算,客户端只负责提交任务、轮询状态、拉取结果与下载资源。因此:

  • 不需要本地安装 PaddlePaddle、PaddleOCR 推理依赖或下载模型权重;
  • 适合在 Node.js 服务端、无头脚本、CI 流水线等场景中集成 OCR 与文档解析能力;
  • 网络层基于标准fetch,天然可运行在支持 Node.js 18+ 的各类运行环境。

从仓库源码看,SDK 的默认服务地址为https://paddleocr.aistudio-app.com(见 client.ts 与 internal/http.ts),请求路径为/api/v2/ocr/jobs,因此所有调用都需要有效的云端访问令牌。

安装与认证

安装 SDK

npm install @paddleocr/api-sdk

SDK 打包入口见 src/index.ts,统一导出PaddleOCRClientModel枚举、全部请求/结果类型以及各类错误类。

获取与配置 Access Token

使用前需要先从 AI Studio 官网的账号设置中获取 Access Token(官方文档称为 AI Studio Access Token 页面)。SDK 默认从环境变量PADDLEOCR_ACCESS_TOKEN读取令牌:

export PADDLEOCR_ACCESS_TOKEN="your-access-token"

也可以在构造客户端时显式传入token

import { PaddleOCRClient } from "@paddleocr/api-sdk"; const client = new PaddleOCRClient({ token: process.env.PADDLEOCR_ACCESS_TOKEN, });

从源码看,构造时令牌解析顺序为options.token优先、其次是process.env.PADDLEOCR_ACCESS_TOKEN;两者都缺失时会直接抛出AuthError(见 client.ts)。仓库测试 tests/client.test.ts 也明确覆盖了这一行为:无令牌构造必抛AuthError,设置环境变量后即可正常构造。

实际请求时令牌会以Authorization: Bearer <token>请求头携带(见 internal/http.ts),因此请务必通过安全方式(环境变量、密钥管理服务)保存令牌,不要硬编码进代码或提交到仓库。

快速开始

通过文件 URL 提交 OCR

import { Model, PaddleOCRClient } from "@paddleocr/api-sdk"; const client = new PaddleOCRClient(); const result = await client.ocr({ fileUrl: "https://example.com/invoice.pdf", model: Model.PPOCRv5, }); console.log(result.jobId, result.pages.length);

通过本地文件路径提交

fileUrl换成filePath即可上传本地文件:

const result = await client.ocr({ filePath: "./invoice.pdf", model: Model.PPOCRv6, });

源码明确规定:fileUrlfilePath必须恰好二选一——两者都缺失会抛出InvalidRequestError("Either fileUrl or filePath is required."),同时传入则会抛出“互斥”错误(见 client.ts)。使用filePath时,SDK 通过FormData以 multipart 方式上传文件(见 internal/http.ts),文件不存在会抛出FileNotFoundError

完整的可运行示例见仓库 examples/ocr-url.ts 与 examples/doc-parsing-file.ts。

公共 API 总览

SDK 提供的公共方法分为“一站式便捷方法”“手动控制方法”“状态查询”“资源保存”四类:

方法作用
ocr(...)提交 OCR 任务并等待完成,返回解析好的 OCR 结果
parseDocument(...)提交文档解析任务并等待完成,返回解析好的文档结果
submitOcr(...)仅提交 OCR 任务,返回Job对象(不等待)
submitDocumentParsing(...)仅提交文档解析任务,返回Job对象(不等待)
getStatus(jobId)执行一次非阻塞的状态查询
waitOcrResult(job)等待指定 OCR 任务完成并解析结果
waitDocumentParsingResult(job)等待指定文档解析任务完成并解析结果
saveResource(resourceUrl, destination, options)将单个资源 URL 保存到本地
saveOcrResultResources(result, destination, options)保存 OCR 结果引用的全部资源
saveDocumentParsingResultResources(result, destination, options)保存文档解析结果引用的全部资源

提交 + 轮询的两阶段模型

理解 SDK 的调用模型是正确使用它的关键。从源码看,ocrparseDocument都是“提交 + 等待”的语法糖(见 client.ts):

async ocr(req: OCRRequest, options?: { signal?: AbortSignal }): Promise<OCRResult> { const job = await this.submitOcr(req, options); return this.waitOcrResult(job, options); }

waitOcrResult/waitDocumentParsingResult内部由轮询器(internal/poller.ts)驱动:以3 秒为初始间隔、按1.5 倍指数退避、最长15 秒间隔轮询任务状态,直到状态变为done(拉取 JSONL 结果)或failed(抛JobFailedError),超过总等待时间则抛PollTimeoutError。轮询器的默认最大等待时间为600000ms(10 分钟)

因此,当你有多个文件需要处理时,推荐先用submitOcr/submitDocumentParsing批量提交拿到全部jobId,再并发等待结果,充分利用云端异步处理能力——examples/doc-parsing-file.ts 就展示了这种“提交后Promise.all并发等待”的写法。

选择模型

Model 枚举

Model枚举值是官方 API 模型名字符串的类型安全别名(定义见 models.ts),提交请求时会序列化为对应的模型名。你也可以直接传官方 API 模型名字符串,例如model: "PaddleOCR-VL-1.6"

export enum Model { PPOCRv5 = "PP-OCRv5", PPOCRv5Latin = "PP-OCRv5-latin", PPOCRv6 = "PP-OCRv6", PPStructureV3 = "PP-StructureV3", PaddleOCRVL = "PaddleOCR-VL", PaddleOCRVL15 = "PaddleOCR-VL-1.5", PaddleOCRVL16 = "PaddleOCR-VL-1.6", }

任务与模型的对应关系

任务接口默认模型支持的模型选项类型
OCRocrsubmitOcrwaitOcrResultModel.PPOCRv6Model.PPOCRv5Model.PPOCRv5LatinModel.PPOCRv6OCROptions
文档解析parseDocumentsubmitDocumentParsingwaitDocumentParsingResultModel.PaddleOCRVL16Model.PPStructureV3Model.PaddleOCRVLModel.PaddleOCRVL15Model.PaddleOCRVL16使用PPStructureV3时传PPStructureV3Options;使用 PaddleOCR-VL 系列模型时传PaddleOCRVLOptions

注意两点实现细节:

  1. 默认模型在提交时按任务自动填充:OCR 任务默认Model.PPOCRv6,文档解析任务默认Model.PaddleOCRVL16(见 client.ts);
  2. 模型与任务强校验:SDK 内置了isOCRModel/isDocumentParsingModel判定集合(见 models.ts),提交前会校验模型是否属于对应任务,不匹配即抛InvalidRequestError,例如对文档解析任务传入 OCR 模型会直接报错(见 client.ts)。

配置详解

客户端配置

const client = new PaddleOCRClient({ requestTimeout: 300_000, pollTimeout: 600_000, });
  • requestTimeout:单次 HTTP 请求的超时上限,覆盖提交、状态查询、资源下载等所有请求,默认300000ms(5 分钟)
  • pollTimeoutocrparseDocumentwaitOcrResultwaitDocumentParsingResult的总等待时间上限,默认600000ms(10 分钟)
  • 二者同时传入时也兼容旧字段timeout(见 client.ts)。

公共方法还支持传入AbortSignal实现调用方主动取消,例如配合AbortController在用户取消操作或请求超时场景下中断等待。

覆盖服务地址:通过环境变量PADDLEOCR_BASE_URLbaseUrl选项覆盖默认服务地址,适合自建代理或私有化网关场景:

const client = new PaddleOCRClient({ baseUrl: "https://my-proxy.com/paddle", });

从源码看,baseUrl优先级高于PADDLEOCR_BASE_URL,且会去掉末尾斜杠后再拼接/api/v2/ocr/jobs(见 internal/http.ts)。

注入自定义 fetch:对于代理、自定义网络层、测试打桩等需求,可以注入自己的fetch实现:

const client = new PaddleOCRClient({ fetch: myCustomFetch, });

仓库单元测试正是通过注入 mockfetch来模拟各类响应与错误场景(见 tests/client.test.ts)。

请求选项

TS SDK 的字段命名采用camelCase,与官方 API 直接对应;未显式设置的字段不会随请求发送。所有选项对象都带有索引签名([key: string]: unknown),即官方 API 新增字段但 SDK 尚未显式声明时,也可以直接透传。完整字段定义可查看 models.ts。

OCROptions 公共字段
字段类型说明
useDocOrientationClassifyboolean文档方向分类
useDocUnwarpingboolean文档去畸变(展平)
useTextlineOrientationboolean文本行方向分类
textDetLimitSideLennumber文本检测时图像最长边限制
textDetLimitTypestring文本检测边长限制方式(如 min/max)
textDetThreshnumber文本检测二值化阈值
textDetBoxThreshnumber文本检测框阈值
textDetUnclipRationumber文本检测框扩张比例
textRecScoreThreshnumber文本识别得分阈值
visualizeboolean返回可视化图片
PPStructureV3Options 公共字段
字段类型说明
useTableRecognitionboolean表格识别
useFormulaRecognitionboolean公式识别
useChartRecognitionboolean图表识别
prettifyMarkdownbooleanMarkdown 美化
useDocOrientationClassifyboolean文档方向分类
useDocUnwarpingboolean文档去畸变
useSealRecognitionboolean印章识别
useRegionDetectionboolean版面区域检测
layoutThresholdnumber 或 Record版面检测阈值
layoutNmsboolean版面检测 NMS
layoutUnclipRationumber / number[] / Record版面框扩张比例
layoutMergeBboxesModestring / Record版面框合并模式
formatBlockContentboolean是否格式化区块内容
textDet*/textRec*系列见上表文本检测/识别参数透传
useWiredTableCellsTransToHtmlboolean有线表格单元格转 HTML
useWirelessTableCellsTransToHtmlboolean无线表格单元格转 HTML
useTableOrientationClassifyboolean表格方向分类
useOcrResultsWithTableCellsboolean返回带单元格的 OCR 结果
useE2eWiredTableRecModel/useE2eWirelessTableRecModelboolean端到端有线/无线表格识别模型
markdownIgnoreLabelsstring[]Markdown 中忽略的标签
showFormulaNumberboolean显示公式编号
returnMarkdownImagesboolean返回 Markdown 引用的图片
outputFormatsstring[]输出格式
visualizeboolean返回可视化图片
PaddleOCRVLOptions 公共字段
字段类型说明
useLayoutDetectionboolean版面检测
useChartRecognitionboolean图表识别
temperaturenumber采样温度
prettifyMarkdownbooleanMarkdown 美化
useDocOrientationClassify/useDocUnwarpingboolean文档方向分类 / 去畸变
useSealRecognitionboolean印章识别
useOcrForImageBlockboolean对图片块执行 OCR
layoutThreshold/layoutNms/layoutUnclipRatio/layoutMergeBboxesMode见上表版面检测相关参数
layoutShapeMode"rect" / "quad" / "poly" / "auto"版面框输出形状
promptLabel"ocr" / "formula" / "table" / "chart" / "seal" / "spotting"提示标签,引导模型聚焦特定内容
formatBlockContentboolean是否格式化区块内容
repetitionPenaltynumber重复惩罚系数
topPnumber核采样参数
minPixels/maxPixelsnumber输入图像最小/最大像素数
maxNewTokensnumber生成的最大新 token 数
vlmExtraArgsRecordVLM 额外参数透传
mergeLayoutBlocksboolean合并版面块
markdownIgnoreLabelsstring[]Markdown 忽略标签
showFormulaNumberboolean显示公式编号
restructurePages/mergeTables/relevelTitlesboolean页面重构 / 表格合并 / 标题层级重排
returnMarkdownImagesboolean返回 Markdown 图片
outputFormatsstring[]输出格式
visualizeboolean返回可视化图片

结果结构解析

SDK 把原始 JSONL 响应解析为类型化结果(类型定义见 results.ts),核心结构如下:

  • OCRResult{ jobId, pages: OCRPage[], dataInfo? },其中每个OCRPage包含prunedResult(精简识别结果)、ocrImageUrl(可视化图 URL)、docPreprocessingImageUrl(预处理图 URL)、inputImageUrl(输入图 URL)与raw(原始响应);
  • DocParsingResult{ jobId, pages: DocParsingPage[], dataInfo? },每个DocParsingPage包含markdownText(Markdown 正文)、markdownImages(Markdown 引用图片 URL 映射)、outputImages(输出图片映射)、prunedResultexportsraw
  • Job{ jobId, model, task: "ocr" | "document_parsing", pageRanges?, batchId? },由submit*系列方法返回;
  • JobStatus{ jobId, state: "pending" | "running" | "done" | "failed", progress?, resultUrl?, errorMsg? }
  • Progress{ totalPages, extractedPages, startTime?, endTime? },用于展示多页任务的进度。

资源保存:把云端结果落到本地

saveResource系列方法用于把结果引用的图片等资源下载到本地磁盘:

// 保存单个资源到指定路径(destination 为文件路径时直接写入该文件) await client.saveResource(result.pages[0].ocrImageUrl, "./output/"); // 保存 OCR 结果引用的全部资源 await client.saveOcrResultResources(result, "./output/"); // 保存文档解析结果引用的全部资源(markdownImages + outputImages) await client.saveDocumentParsingResultResources(result, "./output/");

从源码看(client.ts)有以下行为值得注意:

  • destination是已存在目录时,文件名取自资源 URL 的 basename;OCR 结果资源会命名为ocr-page-<页码><扩展名>
  • SaveResourceOptions.overwrite控制是否覆盖已存在的目标文件,默认不覆盖,目标已存在会抛InvalidRequestError
  • 目标目录不存在会抛FileNotFoundError;结果资源文件名会做安全校验(拒绝...、含路径分隔符或以点开头的文件名),防止路径穿越。

错误处理

SDK 的所有错误都继承自PaddleOCRAPIError(错误类定义见 errors.ts),因此可以统一捕获:

try { const result = await client.ocr({ fileUrl }); } catch (e) { if (e instanceof RateLimitError) { // 触发限流,建议退避重试 } else if (e instanceof JobFailedError) { console.error(`任务 ${e.jobId} 失败: ${e.errorMsg}`); } else if (e instanceof PaddleOCRAPIError) { // 其他 SDK 错误 } }

常用错误类型及其含义:

错误类触发场景
AuthError缺少令牌,或服务端返回 401/403
InvalidRequestError参数不合法(如 fileUrl/filePath 互斥、模型与任务不匹配)
RateLimitError触发限流(HTTP 429)
ServiceUnavailableError服务不可用(HTTP 503/504)
APIError其余 HTTP 错误,携带statusCode
NetworkError网络连接失败
JobFailedError任务在服务端执行失败,携带jobIderrorMsg
RequestTimeoutError单次请求超时
PollTimeoutError轮询等待超时
ResponseFormatError响应格式不符合预期
ResultParseError结果 JSONL 解析失败
FileNotFoundError本地文件或目标目录不存在

HTTP 状态码到错误类型的映射实现在 internal/http.ts:401/403 →AuthError,400 →InvalidRequestError,429 →RateLimitError,503/504 →ServiceUnavailableError,其余 →APIError

官方 API 参考与配额

  • 官方 API 文档:PP-OCRv5 API、PP-StructureV3 API、PaddleOCR-VL API、PaddleOCR-VL-1.5 API 的完整字段定义与请求/响应格式,可在 AI Studio 官方文档站对应页面查阅;SDK 字段与官方 API 一一对应(camelCase),需要查看完整字段列表时可对照官方 API Reference 或直接阅读 models.ts 中的接口定义;
  • 配额与错误码:API 配额规则与错误码说明同样收录在 AI Studio 官方文档中,接入前建议先阅读,了解免费/付费额度、并发限制及 429 限流语义,以便正确设计重试与降级策略。

小结与实战建议

从“两阶段异步模型”到“类型安全的结果解析”,PaddleOCR 官方 API TypeScript SDK 为 Node.js 开发者提供了一条零本地依赖的 OCR/文档解析接入路径。实战中的几个关键建议:

  1. 先提交后等待:批量处理多个文件时,先用submitOcr/submitDocumentParsing一次性提交全部任务,再并发wait*等待,吞吐更高;
  2. 显式设置超时:根据业务对耗时与稳定性的要求调整requestTimeoutpollTimeout,并配合AbortSignal支持用户侧取消;
  3. 统一错误处理:用PaddleOCRAPIError兜底捕获,对RateLimitErrorServiceUnavailableError做指数退避重试,对PollTimeoutError保留jobId以便稍后恢复查询;
  4. 善用资源保存saveOcrResultResourcessaveDocumentParsingResultResources可一键把可视化图、Markdown 图片等云端资源落盘,注意overwrite语义与目录存在性检查;
  5. 类型安全:优先使用Model枚举与OCROptions/PPStructureV3Options/PaddleOCRVLOptions类型,借助编译期检查避免模型名拼写错误与字段名不一致问题。

更完整的可运行示例与接口文档可继续阅读仓库中的 api_sdk/typescript/README.md、examples/ocr-url.ts、examples/doc-parsing-file.ts,以及同名中文文档 docs/version3.x/inference_deployment/serving/paddleocr_official_api/typescript.md。

【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询