PaddleOCR 3.5 正式发布,带来以下核心升级:

  1. 发布浏览器端 PaddleOCR.js,开发者可以用更轻量的方式在前端应用中直接调用 OCR 能力。
  2. 支持将 PaddleOCR-VL 文档解析内容转为 Word,以及将 Word、Excel、PPT 等类型的办公文档转为 Markdown。
  3. 融入 Hugging Face 开发生态,通过统一推理引擎配置方式,支持基于 Transformers 完成 OCR 系列模型推理。

一、发布 PaddleOCR.js

在 Agent 时代,越来越多的智能体需要直接感知和理解用户界面上的信息——而这些信息,往往就存在于浏览器里。​让数据不离开浏览器就能完成识别​,不仅是对隐私的保护,更是降低系统复杂度、实现真正轻量化部署的关键一步。

PaddleOCR.js 正是为此而生。从能力上看,它已经不仅仅是"能识别",而是在浏览器侧提供了一套更完整的使用体验:基于 ONNX Runtime Web 搭建,同时支持 WebGPUWasm 两种加速后端;提供 ​Worker 模式​,推理过程在后台线程运行,不阻塞主线程、不影响页面交互;并已适配 Chrome、Safari 等主流浏览器。

无论是验证码识别、在线票据处理,还是构建更强调交互体验的前端 AI 工具,开发者都可以用更轻量的方式,将 PaddleOCR 无缝接入现有 Web 场景。

<pre spellcheck="false" data-title="" data-lang="js" data-autowrap="true" data-indent="0" data-view="code" class="mp-block-code-wrapper language-js "><div class="mp-block-code-content mp-block-code-content-auto-wrap"><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="import%20%7B%20PaddleOCR%20%7D%20from%20%22%40paddleocr%2Fpaddleocr-js%22%3B">import { PaddleOCR } from "@paddleocr/paddleocr-js";</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=""></span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="const%20ocr%20%3D%20await%20PaddleOCR.create(%7B">const ocr = await PaddleOCR.create({</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20lang%3A%20%22ch%22%2C"> lang: "ch",</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20ocrVersion%3A%20%22PP-OCRv5%22%2C"> ocrVersion: "PP-OCRv5",</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20worker%3A%20true%2C"> worker: true,</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20ortOptions%3A%20%7B"> ortOptions: {</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20backend%3A%20%22auto%22"> backend: "auto"</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%7D"> }</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%7D)%3B">});</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=""></span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="const%20%5Bresult%5D%20%3D%20await%20ocr.predict(fileOrBlob)%3B">const [result] = await ocr.predict(fileOrBlob);</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="console.log(result.items)%3B">console.log(result.items);</span></span></div></div></pre>

同时,从调用风格上看,PaddleOCR.js 与 PaddleOCR Python 接口也保持了较高的一致性。Python 侧通过 PaddleOCR(...) 初始化并调用 predict,浏览器侧则通过 PaddleOCR.create({...}) 初始化后同样调用 predict 得到推理结果列表。这让已有 PaddleOCR Python 库用户迁移到 Web 端时几乎不需要重新理解一套完全不同的接口设计:

<pre spellcheck="false" data-title="" data-lang="python" data-autowrap="true" data-indent="0" data-view="code" class="mp-block-code-wrapper language-python "><div class="mp-block-code-content mp-block-code-content-auto-wrap"><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="from%20paddleocr%20import%20PaddleOCR">from paddleocr import PaddleOCR</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=""></span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="ocr%20%3D%20PaddleOCR(">ocr = PaddleOCR(</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20lang%3D%22ch%22%2C"> lang="ch",</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20ocr_version%3D%22PP-OCRv5%22"> ocr_version="PP-OCRv5"</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=")">)</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="result%20%3D%20ocr.predict(%22general_ocr_002.png%22)">result = ocr.predict("general_ocr_002.png")</span></span></div></div></pre>

<pre spellcheck="false" data-title="" data-lang="js" data-autowrap="true" data-indent="0" data-view="code" class="mp-block-code-wrapper language-js "><div class="mp-block-code-content mp-block-code-content-auto-wrap"><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="import%20%7B%20PaddleOCR%20%7D%20from%20%22%40paddleocr%2Fpaddleocr-js%22%3B">import { PaddleOCR } from "@paddleocr/paddleocr-js";</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=""></span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%2F%2F%20%E6%94%AF%E6%8C%81%20Python%20%E9%A3%8E%E6%A0%BC%E7%9A%84%20snake_case%20%E5%8F%82%E6%95%B0">// 支持 Python 风格的 snake_case 参数</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="const%20ocr%20%3D%20await%20PaddleOCR.create(%7B">const ocr = await PaddleOCR.create({</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20lang%3A%20%22ch%22%2C"> lang: "ch",</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20ocr_version%3A%20%22PP-OCRv5%22"> ocr_version: "PP-OCRv5"</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%7D)%3B">});</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%2F%2F%20%E4%B9%9F%E6%94%AF%E6%8C%81%20JavaScript%20%E9%A3%8E%E6%A0%BC%E7%9A%84%20camelCase%20%E5%8F%82%E6%95%B0">// 也支持 JavaScript 风格的 camelCase 参数</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%2F%2F%20const%20ocr%20%3D%20await%20PaddleOCR.create(%7B">// const ocr = await PaddleOCR.create({</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%2F%2F%20%20%20lang%3A%20%22ch%22%2C">// lang: "ch",</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%2F%2F%20%20%20ocrVersion%3A%20%22PP-OCRv5%22">// ocrVersion: "PP-OCRv5"</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%2F%2F%20%7D)%3B">// });</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="const%20%5Bresult%5D%20%3D%20await%20ocr.predict(fileOrBlob)%3B">const [result] = await ocr.predict(fileOrBlob);</span></span></div></div></pre>

另外,PaddleOCR.js 还提供了结果可视化能力,能够把检测框、识别文字等结果以与 PaddleOCR Python 库相同的风格渲染出来。

<pre spellcheck="false" data-title="" data-lang="js" data-autowrap="true" data-indent="0" data-view="code" class="mp-block-code-wrapper language-js "><div class="mp-block-code-content mp-block-code-content-auto-wrap"><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="import%20%7B%20OcrVisualizer%20%7D%20from%20%22%40paddleocr%2Fpaddleocr-js%2Fviz%22%3B">import { OcrVisualizer } from "@paddleocr/paddleocr-js/viz";</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=""></span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="const%20viz%20%3D%20new%20OcrVisualizer(%7B">const viz = new OcrVisualizer({</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20font%3A%20%7B%20family%3A%20%22Noto%20Sans%20SC%22%2C%20source%3A%20%22%2Ffonts%2FNotoSansSC-Regular.ttf%22%20%7D"> font: { family: "Noto Sans SC", source: "/fonts/NotoSansSC-Regular.ttf" }</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%7D)%3B">});</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="const%20blob%20%3D%20await%20viz.toBlob(imageBitmap%2C%20result)%3B">const blob = await viz.toBlob(imageBitmap, result);</span></span></div></div></pre>

PaddleOCR 仓库中提供了一个简单的 Demo 应用,用于快速体验 PaddleOCR.js 的效果:

开发者可以在 Demo 应用中先跑通体验,再逐步集成到自己的 Web 应用中。

二、支持多格式文档解析

大模型时代,数据的价值被重新审视。海量知识沉淀在 Word、Excel、PPT、PDF 等各类文档中,而大模型真正能消化的,是结构清晰的文本。​打通文档与大模型之间的通路​,成为这个时代最迫切的需求之一。

为此,PaddleOCR 3.5 在文档格式的输入与输出两端同时发力:

  • 输出侧​:支持将 PaddleOCR-VL 系列模型、PP-StructureV3 的预测结果直接导出为 ​Word 格式​,让识别结果开箱即用、便于人工流转;
  • 输入侧​:支持将 Word、Excel、PPT 等主流办公文档转换为 ​Markdown 格式​,结构清晰,易于后续的 LLM 接入与智能体调用。

以 PaddleOCR-VL 为例,将预测结果导出为 Word 文档只需几行代码:

<pre spellcheck="false" data-title="" data-lang="python" data-autowrap="true" data-indent="0" data-view="code" class="mp-block-code-wrapper language-python "><div class="mp-block-code-content mp-block-code-content-auto-wrap"><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="from%20paddleocr%20import%20PaddleOCRVL">from paddleocr import PaddleOCRVL</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=""></span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="pipeline%20%3D%20PaddleOCRVL()">pipeline = PaddleOCRVL()</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="output%20%3D%20pipeline.predict(%22.%2Fpaddleocr_vl_demo.png%22)">output = pipeline.predict("./paddleocr_vl_demo.png")</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="pages_res%20%3D%20%5B%5D">pages_res = []</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="for%20res%20in%20output%3A">for res in output:</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20res.save_to_word(save_path%3D%22output%22)%20%23%23%20%E4%BF%9D%E5%AD%98%E5%BD%93%E5%89%8D%E5%9B%BE%E5%83%8F%E7%9A%84Word%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%BB%93%E6%9E%9C"> res.save_to_word(save_path="output") ## 保存当前图像的Word格式的结果</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20pages_res.append(res)"> pages_res.append(res)</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20"> </span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="output%20%3D%20pipeline.restructure_pages(pages_res)">output = pipeline.restructure_pages(pages_res)</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="for%20res%20in%20output%3A">for res in output:</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20res.save_to_word(save_path%3D%22output%22)%20%23%23%20%E5%B0%86%E5%90%88%E5%B9%B6%E5%90%8E%E7%9A%84%E5%A4%9A%E9%A1%B5%E7%BB%93%E6%9E%9C%E4%BF%9D%E5%AD%98%E4%B8%BAWord%E6%A0%BC%E5%BC%8F"> res.save_to_word(save_path="output") ## 将合并后的多页结果保存为Word格式</span></span></div></div></pre>



对于办公文档转 Markdown 功能,只需一行命令即可高效完成:

<pre spellcheck="false" data-title="" data-lang="python" data-autowrap="true" data-indent="0" data-view="code" class="mp-block-code-wrapper language-python "><div class="mp-block-code-content mp-block-code-content-auto-wrap"><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%23%20%E8%BD%AC%E6%8D%A2%20Word%20%E6%96%87%E6%A1%A3%EF%BC%8C%E8%BE%93%E5%87%BA%E5%88%B0%E6%96%87%E4%BB%B6"># 转换 Word 文档,输出到文件</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="paddleocr%20doc2md%20-i%20report.docx%20-o%20output.md">paddleocr doc2md -i report.docx -o output.md</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=""></span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%23%20%E8%BD%AC%E6%8D%A2%20Excel%20%E8%A1%A8%E6%A0%BC%EF%BC%8C%E8%BE%93%E5%87%BA%E5%88%B0%E6%96%87%E4%BB%B6"># 转换 Excel 表格,输出到文件</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="paddleocr%20doc2md%20-i%20data.xlsx%20-o%20output.md">paddleocr doc2md -i data.xlsx -o output.md</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=""></span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%23%20%E8%BD%AC%E6%8D%A2%20PowerPoint%20%E6%BC%94%E7%A4%BA%E6%96%87%E7%A8%BF%EF%BC%8C%E8%BE%93%E5%87%BA%E5%88%B0%E6%96%87%E4%BB%B6"># 转换 PowerPoint 演示文稿,输出到文件</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="paddleocr%20doc2md%20-i%20slides.pptx%20-o%20output.md">paddleocr doc2md -i slides.pptx -o output.md</span></span></div></div></pre>









三、全面适配 Transformers 推理后端

PaddleOCR 3.5 将 Transformers 正式纳入统一推理引擎体系,支持通过统一的配置方式,让开发者可以用同一套接口切换不同底层后端。对需要融入 Hugging Face AI 开发生态的用户来说,这意味着在熟悉的 Transformers 环境中,也能更顺畅地接入 OCR 与文档解析能力,减少跨生态集成成本,并让原本分散的部署选择变得更加统一、清晰。

从使用门槛上看,这次适配也尽量保持了简单直接。开发者只需在环境中安装 5.4.0 或更高版本的 transformers 以及 3.5.0 版本的 paddleocr,即可通过统一接口完成调用。以文本检测模型为例:

<pre spellcheck="false" data-title="" data-lang="python" data-autowrap="true" data-indent="0" data-view="code" class="mp-block-code-wrapper language-python "><div class="mp-block-code-content mp-block-code-content-auto-wrap"><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="from%20paddleocr%20import%20TextDetection">from paddleocr import TextDetection</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=""></span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="model%20%3D%20TextDetection(">model = TextDetection(</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20model_name%3D%22PP-OCRv5_server_det%22%2C"> model_name="PP-OCRv5_server_det",</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20engine%3D%22transformers%22%2C"> engine="transformers",</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text=")">)</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="result%20%3D%20model.predict(%22general_ocr_001.png%22)">result = model.predict("general_ocr_001.png")</span></span></div></div></pre>

其中,engine 可以是 paddle_staticpaddle_dynamictransformers,分别对应飞桨静态图(Paddle Inference)、飞桨动态图和 Transformers 后端。

Transformers 提供高效简洁的单模型的加载、配置与推理能力,而 PaddleOCR 在模块封装与多模型编排能力有长期积累的优势。在底层,我们保留了面向单模型的灵活接入方式;在更高一层,PaddleOCR 仍然能够把检测、方向分类、识别等能力按业务需要串联组合起来,让开发者既能享受 Transformers 生态的便利,也能继续使用 PaddleOCR 已经成熟的产线化能力,实现更强的组合效果。例如,同样可以通过 engine 参数将 OCR pipeline 直接切换到对应后端:

<pre spellcheck="false" data-title="" data-lang="bash" data-autowrap="true" data-indent="0" data-view="code" class="mp-block-code-wrapper language-bash "><div class="mp-block-code-content mp-block-code-content-auto-wrap"><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="paddleocr%20ocr%20-i%20xxx.png%20%5C">paddleocr ocr -i xxx.png \</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20--use_doc_orientation_classify%20False%20%5C"> --use_doc_orientation_classify False \</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20--use_doc_unwarping%20False%20%5C"> --use_doc_unwarping False \</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20--use_textline_orientation%20False%20%5C"> --use_textline_orientation False \</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20--save_path%20.%2Foutput%20%5C"> --save_path ./output \</span></span></div><div class="mp-block-code-line" data-text-content=""><span class="mp-block-code-line-content"><span data-morpho-text="%20%20%20%20--engine%20transformers"> --engine transformers</span></span></div></div></pre>

执行结果与使用飞桨静态图完全对齐:

此外,PaddleOCR 3.5 还支持通过 engine_config 参数配置推理后端的初始化参数,进而实现更细粒度的设备选择、精度控制与推理行为调优,让统一接口之上也保留了足够的灵活性与可定制空间。

结语

从文档图像到结构化数据,PaddleOCR 始终致力于降低 AI 应用开发的数据门槛。PaddleOCR 3.5 版本的升级,不仅让 OCR 能力更广泛地融入 Hugging Face 生态与浏览器端,更将文档解析链路延伸至多格式办公文档的一键转换。这一切努力,归根结底是为了把“将文档图像转换为 JSON、Markdown 等 AI 友好数据”这件事做到极致,让 PaddleOCR 真正成为每一位 AI 开发者手边的“开局神器”——数据一键整理、适度清洗、格式就绪,让您的 AI 应用从第一步就走在高效的路上。

我们诚邀广大开发者、研究者及行业伙伴亲身体验这一全新版本,也期待大家持续给予宝贵的反馈与建议。每一条意见,都是我们前行的动力。让我们携手共建更开放、更强大的 OCR 生态,共同推动 OCR 技术走向更广阔的未来。

​开源地址:​https://github.com/PaddlePaddle/PaddleOCR

标签: none

添加新评论