news 2026/9/12 1:38:32

PaddleOCR TypeScript SDK:基于官方托管 API 的 OCR 与文档解析客户端完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleOCR TypeScript SDK:基于官方托管 API 的 OCR 与文档解析客户端完整指南

PaddleOCR TypeScript SDK:基于官方托管 API 的 OCR 与文档解析客户端完整指南

【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR

PaddleOCR 官方 TypeScript SDK(@paddleocr/api-sdk)为 Node.js 18+ 环境提供了一组类型安全的客户端接口,通过调用 PaddleOCR 官方托管 API 完成 OCR 识别与版面解析,无需在本地运行任何 PaddleOCR 推理。本文将以 官方 TypeScript 文档 为骨架,结合 api_sdk/typescript 下的源码实现,系统讲解 SDK 的安装认证、快速上手、模型选择、客户端配置、请求参数、结果处理与错误处理,帮助你在十分钟内把图片/PDF 转成可供 AI 与 LLM 直接消费的结构化数据。

一、SDK 是什么:托管推理,零本地部署

TypeScript SDK 面向 Node.js 18+ 设计,核心定位是调用 PaddleOCR 官方 API完成 OCR 与文档解析。它依赖 PaddleOCR 托管的云端服务,不执行本地 PaddleOCR 推理——这意味着你不需要安装 PaddlePaddle、下载模型权重或配置 GPU,只要持有访问令牌(Access Token)即可发起任务。

从 源码结构 可以看到 SDK 的分层设计:

文件职责
client.ts对外主类PaddleOCRClient,封装全部公开方法
models.tsModel枚举、请求/客户端选项类型定义
results.ts结果、任务(Job)、状态等返回类型
errors.ts类型化错误体系,统一继承自PaddleOCRAPIError
internal/http.tsHTTP 传输层:提交任务、查询状态、拉取结果
internal/poller.ts轮询器:指数退避等待任务完成
internal/abort.tsAbortSignal取消支持

SDK 默认服务地址为https://paddleocr.aistudio-app.com,任务提交路径为/api/v2/ocr/jobs(见 http.ts)。

二、安装与认证

安装依赖与配置令牌只需两步:

npm install @paddleocr/api-sdk export PADDLEOCR_ACCESS_TOKEN="your-access-token"

访问令牌需要先在 AI Studio 的 Access Token 页面申请获取。客户端默认从环境变量PADDLEOCR_ACCESS_TOKEN读取令牌,也可以显式传入token选项:

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

从 client.ts 的实现看,令牌解析顺序为options.tokenprocess.env.PADDLEOCR_ACCESS_TOKEN,两者都缺失时会直接抛出AuthError,提示 "Token is required."。这一行为也在 tests/client.test.ts 中有明确测试覆盖:未设置令牌构造客户端抛AuthError,仅设置环境变量则构造成功。

本地开发构建方式见 api_sdk/typescript/README.md:npm install后执行npm run build,之后可通过npm run lintnpm testnpm audit --audit-level=moderate完成质量检查。

三、快速开始:一行代码完成 OCR

3.1 识别远程文件(URL)

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);

client.ocr(...)是一个便捷方法:内部先提交 OCR 任务,再自动轮询等待完成,最后解析返回OCRResultresult.pages按页存放识别结果,result.jobId为任务 ID。

3.2 识别本地文件(filePath)

const result = await client.ocr({ filePath: "./invoice.png", });

fileUrlfilePath二选一、互斥。SDK 在 client.ts 中做了强制校验:两者都未提供或同时提供都会抛出InvalidRequestError。本地文件场景下,SDK 会通过FormDatamultipart/form-data上传文件,并携带modeloptionalPayload、可选的pageRangesbatchId字段(见 http.ts);文件不存在时抛出FileNotFoundError

3.3 文档解析:输出结构化 Markdown

const doc = await client.parseDocument({ filePath: "./report.pdf", options: { useChartRecognition: true, }, }); console.log(doc.jobId, doc.pages.length); // 每页的 markdownText 即结构化结果

parseDocument返回DocParsingResult,每一页包含markdownText(Markdown 文本)、markdownImagesoutputImages(图片资源映射)等字段。文档解析默认使用 PaddleOCR-VL-1.6 模型。

四、公开 API 总览

SDK 公开方法分为三类:便捷方法(提交 + 等待合并)、手动控制方法(提交与等待分离)和资源保存方法

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

此外还有getBatchStatus(batchId)用于批量任务状态查询。

4.1 手动提交与并发等待

当需要并行提交多个任务时,可以拆分提交与等待两个阶段,例如 doc-parsing-file.ts 中的模式:

const job1 = await client.submitOcr({ fileUrl: "https://example.com/f1.pdf" }); const job2 = await client.submitDocumentParsing({ model: Model.PPStructureV3, filePath: "./sample.pdf", }); const [r1, r2] = await Promise.all([ client.waitOcrResult(job1.jobId), client.waitDocumentParsingResult(job2.jobId), ]);

Job对象包含jobIdmodeltask"ocr" | "document_parsing")以及可选的pageRangesbatchId(见 results.ts)。wait*方法也接受纯字符串 jobId;若传入的Job任务类型与方法不匹配,会抛出InvalidRequestError(见 client.ts)。

4.2 资源保存与overwrite语义

saveResourcedestination既可以是已存在的目录(自动按 URL 文件名命名),也可以是目标文件路径(见 client.ts)。saveOcrResultResources/saveDocumentParsingResultResources则要求destination必须是已存在的目录:

  • 文档解析结果:保存每页markdownImagesoutputImages中引用的资源,文件名取自资源映射的 key,并进行路径安全校验(拒绝含/\..等危险 key,见 client.ts);
  • OCR 结果:保存每页的ocrImageUrl,自动命名为ocr-page-{n}{扩展名}
  • 默认不允许覆盖已存在文件(会抛InvalidRequestError),传入options: { overwrite: true }可启用覆盖。

五、模型选择:Model 枚举与官方模型名

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

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

关于模型名与校验,有两点值得注意:

  1. Model.PPOCRv5Latin("PP-OCRv5-latin")专门用于拉丁文体系的托管 OCR 模型(见 README.md);
  2. 任务-模型匹配校验:SDK 内部通过isOCRModelisDocumentParsingModel集合(见 models.ts)校验模型与任务是否匹配。例如把PaddleOCRVL16传给submitOcr,或把PPOCRv6传给submitDocumentParsing,都会抛出InvalidRequestError(见 client.ts)。这与测试文件中对公共契约的断言一致(client.test.ts)。

六、客户端配置:超时、代理与自定义网络层

6.1 超时控制

const client = new PaddleOCRClient({ requestTimeout: 300_000, // 单次 HTTP 请求上限,默认 300000ms pollTimeout: 600_000, // 总等待上限,默认 600000ms });
  • requestTimeout约束单次 HTTP 请求,包括提交任务、查询状态、下载资源;
  • pollTimeout约束ocrparseDocumentwaitOcrResultwaitDocumentParsingResult总等待时间

从 client.ts 看,还兼容旧字段timeout:当requestTimeout/pollTimeout未设置时,两者都回退到options.timeout。所有公开方法还可接收AbortSignal实现调用方主动取消。

6.2 覆盖服务地址

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

也可通过环境变量PADDLEOCR_BASE_URL覆盖(优先级低于baseUrl选项)。baseUrl 末尾的斜杠会被自动去除(http.ts)。这一能力便于对接代理或私有网关。

6.3 注入自定义 fetch

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

注入自定义fetch实现可用于代理、日志、mock 或自定义网络层。测试代码正是利用这一机制注入vi.fnmock 的 fetch 来验证请求体与错误映射(client.test.ts)。

6.4 其他客户端选项

ClientOptions还包含clientPlatform,设置后会在请求头附加Client-Platform(见 models.ts 与 http.ts)。

七、请求参数详解:camelCase 字段与三大选项类型

SDK 字段名采用 camelCase,与官方 API 直接对应;未设置的字段不会随请求发送。完整字段定义以接口源码或官方 API 参考为准。下面结合 models.ts 中的接口定义,给出三大选项类型的完整字段说明。

7.1 OCROptions(OCR 通用字段)

字段类型说明
useDocOrientationClassifyboolean文档方向分类
useDocUnwarpingboolean文档展开(去透视畸变)
useTextlineOrientationboolean文本行方向分类
textDetLimitSideLennumber检测端输入边长限制
textDetLimitTypestring检测端限制类型(如 min/max)
textDetThreshnumber检测二值化阈值
textDetBoxThreshnumber检测框阈值
textDetUnclipRationumber检测框扩张比例
textRecScoreThreshnumber识别分数阈值
visualizeboolean返回可视化图片

7.2 PPStructureV3Options(文档解析-结构模型通用字段)

字段类型说明
useTableRecognitionboolean表格识别
useFormulaRecognitionboolean公式识别
useChartRecognitionboolean图表识别
prettifyMarkdownbooleanMarkdown 美化
useDocOrientationClassify/useDocUnwarping/useTextlineOrientationboolean文档预处理三项
useSealRecognitionboolean印章识别
useRegionDetectionboolean区域检测
layoutThresholdnumber | Record<string, number>版面分类阈值(支持按类别细分)
layoutNmsboolean版面 NMS
layoutUnclipRationumber | number[] | Record<string, number>版面框扩张比例
layoutMergeBboxesModestring | Record<string, string>版面框合并模式
formatBlockContentboolean块内容格式化
textDet*/textRecScoreThreshnumber/string文本检测/识别参数(同 OCR)
useWiredTableCellsTransToHtml/useWirelessTableCellsTransToHtmlboolean有线/无线表格转 HTML
useTableOrientationClassifyboolean表格方向分类
useOcrResultsWithTableCellsboolean表格单元附带 OCR 结果
useE2eWiredTableRecModel/useE2eWirelessTableRecModelboolean端到端表格识别模型
markdownIgnoreLabelsstring[]忽略的 Markdown 标签列表
showFormulaNumberboolean公式编号显示
returnMarkdownImagesboolean返回 Markdown 图片
outputFormatsstring[]输出格式列表
visualizeboolean返回可视化图片

7.3 PaddleOCRVLOptions(PaddleOCR-VL 系列通用字段)

字段类型说明
useLayoutDetectionboolean版面检测
useChartRecognitionboolean图表识别
temperaturenumber采样温度
prettifyMarkdownbooleanMarkdown 美化
useDocOrientationClassify/useDocUnwarpingboolean文档预处理
useSealRecognitionboolean印章识别
useOcrForImageBlockboolean对图片块执行 OCR
layoutThreshold/layoutNms/layoutUnclipRatio/layoutMergeBboxesMode同 PPStructureV3版面控制参数
layoutShapeMode"rect" \| "quad" \| "poly" \| "auto"版面形状模式
promptLabel"ocr" \| "formula" \| "table" \| "chart" \| "seal" \| "spotting"提示标签
formatBlockContentboolean块内容格式化
repetitionPenaltynumber重复惩罚
topPnumbertop-p 采样
minPixels/maxPixelsnumber图像像素范围
maxNewTokensnumber生成最大 token 数
vlmExtraArgsRecord<string, unknown>VLM 附加参数
mergeLayoutBlocksboolean合并版面块
markdownIgnoreLabelsstring[]忽略的 Markdown 标签
showFormulaNumberboolean公式编号
restructurePagesboolean页面重构
mergeTablesboolean合并表格
relevelTitlesboolean标题层级重排
returnMarkdownImages/outputFormats/visualize同 PPStructureV3输出控制

说明:DocParsingOptionsPPStructureV3Options | PaddleOCRVLOptions的联合类型,实际可用字段取决于所选模型(见 models.ts)。

八、结果结构与轮询机制:从提交到拿到结构化数据

8.1 结果对象

OCR 结果OCRResult与文档解析结果DocParsingResult都包含jobIdpages数组与可选的dataInfo(见 results.ts):

  • OCRPageprunedResult(精简后的识别结果)、ocrImageUrldocPreprocessingImageUrl(预处理可视化图)、inputImageUrl(输入图)、raw(原始数据);
  • DocParsingPagemarkdownTextmarkdownImagesoutputImagesprunedResultinputImageUrlexportsmarkdownraw

任务状态JobStatus包含statepending/running/done/failed)、progresstotalPages/extractedPages等进度信息)、resultUrlerrorMsg(results.ts)。

8.2 结果解析:JSONL 逐行还原

任务完成后,SDK 从状态响应中的resultUrl.jsonUrl拉取 JSONL 结果并按行解析(poller.ts):

  • OCR:校验result.ocrResults数组,每页必须有prunedResult,并提取ocrImagedocPreprocessingImageinputImage等 URL(client.ts);
  • 文档解析:校验result.layoutParsingResults,每页必须有markdown.text,并映射markdown.imagesoutputImages(client.ts)。

解析失败会抛出ResultParseError

8.3 轮询策略:指数退避

Poller的默认参数为:初始间隔3000ms、退避倍数1.5、最大间隔15000ms、最大等待600000ms(poller.ts)。轮询循环中,done即拉取结果,failedJobFailedError,超过pollTimeoutPollTimeoutErrorsleep期间监听AbortSignal以支持调用方取消。

九、错误处理:类型化异常体系

SDK 所有错误统一继承自PaddleOCRAPIError(见 errors.ts):

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

HTTP 状态到类型化错误的映射实现在 http.ts:401/403 → AuthError400 → InvalidRequestError429 → RateLimitError503/504 → ServiceUnavailableError,其余归入APIError;业务响应体中code !== 0同样抛APIError。所有请求默认携带Authorization: Bearer <token>头。实践建议:对RateLimitError做退避重试,对PollTimeoutError保存jobId以便稍后通过getStatus恢复查询。

十、测试与示例:验证公共契约

仓库为该 SDK 提供了完整的测试与可运行示例:

  • tests/client.test.ts:覆盖令牌要求、公共方法存在性、请求体契约、状态轮询、JSONL 解析、错误映射与资源保存等 703 行测试;
  • examples/ocr-url.ts:远程 URL 的 OCR 完整示例;
  • examples/doc-parsing-file.ts:本地文件文档解析 + 手动提交并发等待示例。

SDK 遵循 SemVer 语义化版本,以公共 scoped npm 包发布。除 TypeScript 外,官方 API 还提供 Python、Go 与 CLI 等语言/工具变体文档,以及中文版 typescript.md,可按需查阅。配额规则与错误码说明请以官方 API 的 Quota and Error Codes 文档为准。

总结

@paddleocr/api-sdk将「提交任务 → 轮询状态 → 拉取 JSONL → 结构化解析」的完整链路封装为十余个类型安全的方法:ocr/parseDocument适合串行便捷调用,submit*+wait*适合批量并发,save*系列则一键落盘可视化图片与 Markdown 资源。配合Model枚举、camelCase 请求选项与类型化错误体系,你可以快速把 PDF/图片转成文本、表格、公式与 Markdown 结构化数据,直接对接下游 AI 应用与 LLM 工作流。

【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 1:38:14

高云FPGA FIR低通滤波器设计:系数生成、IP配置与仿真验证

简介&#xff1a;面向FPGA开发学习者&#xff0c;这套基于高云FPGA的IP设计实现的FIR低通滤波器工程包&#xff0c;覆盖RTL源码编写、IP核配置、仿真验证到工程实现的全流程&#xff0c;适合通信工程、电子信息、自动化等专业用于课程设计、毕业设计或项目初期的方案演示。压缩…

作者头像 李华
网站建设 2026/9/12 1:37:51

国产NFC芯片FSV9510与FSV9510E深度解析:低功耗设计、天线匹配与选型实战

这两年做物联网和智能硬件的朋友&#xff0c;应该能明显感觉到一个趋势&#xff1a;NFC相关的国产芯片越来越能打了。最近我一直在跟进的一款芯片迭代&#xff0c;就是FSV9510 和 FSV9510E 这对组合。标题信息很直接——小尺寸优化、性能全面进阶&#xff0c;但放到实际项目里&…

作者头像 李华
网站建设 2026/9/12 1:36:33

Proteus仿真PM2.5检测系统:单片机数据采集与显示设计

简介&#xff1a;基于单片机Proteus仿真的空气质量PM2.5检测系统资源包&#xff0c;面向单片机初、中级学习者和电子设计人员&#xff0c;主要用于课程设计、毕业设计及环境监测类项目验证。系统集成PM2.5粉尘检测与温湿度采集&#xff0c;具备空气质量等级判断、历史数据查询、…

作者头像 李华
网站建设 2026/9/12 1:36:32

完全二叉搜索树1064题详解:中序填充与递归建树

很多人第一次看到“Complete Binary Search Tree”这个题目时&#xff0c;大概率会像我一样愣一下。BST&#xff08;二叉搜索树&#xff09;我熟&#xff0c;完全二叉树我也熟&#xff0c;但这俩拼在一起&#xff0c;还要按层序遍历输出&#xff0c;总觉得哪里卡住了。最关键的…

作者头像 李华