对于图片、PDF 转文字这件事,之前一直用的方案是:
要么付费软件,每个月固定成本,有些场景还不方便;要么 AI 转换,截图发给大模型,等它回复,再复制出来。一两张还行,遇到一二十张的时候就麻烦了——来回折腾的时间比手工录入还多。
直到实测了一下 PaddleOCR,效果出乎意料。然后用 OpenCode 开发了一个网页小工具,上传图片/PDF,一键识别,结果直接复制,或者下载成 .md 文件。最小闭环跑通了,后续在项目里需要 OCR 的地方可以直接复用,不用再调用付费服务了。
光看名字容易误以为它只是个 OCR 引擎,实际上它已经是文档 AI 基础设施了。
来看核心数据(来源:GitHub API,2026-05-24):
| 指标 | 数值 |
|---|---|
| GitHub Stars | 78,428 |
| Forks | 10,473 |
| 最新版本 | v3.5.0(2026-04-21) |
| License | Apache-2.0 |
| 支持语言 | 100+ |
| 被使用仓库数 | 6,000+ |
维护者是百度飞桨团队,GitHub 主页 paddlepaddle/PaddleOCR。
PaddleOCR 已经不是单纯的"文字识别"工具了,而是智能文档解析全家桶:
通用文字识别(PP-OCRv5)
- 支持 100+ 语言,中英日韩俄阿泰等全覆盖
- 移动端/服务端都高效,支持 CPU/GPU/NPU 多硬件
- v5 版本比上一代提升 13% 准确率
文档结构解析(PP-StructureV3)
- 直接输出 Markdown 或 JSON
- 表格识别、公式识别、版面分析
- PDF 转 Markdown,一键搞定
视觉语言大模型(PaddleOCR-VL-1.5)
- 0.9B 参数的 VLM 模型
- 在 OmniDocBench 达到 94.5% 准确率
- 专门应对弯曲、扫描、屏幕拍照、光照不均、倾斜等复杂场景
- 输出格式为 Markdown 或 JSON,天然适配 RAG 应用
官方口号已经变成 "Turn any PDF or image document into structured data for your AI",定位很清晰——给 LLM 喂数据的工具。
这是一个很好的问题。现代多模态大模型(如 GPT-4V、Claude Vision)确实能够理解图片中的文字,但 OCR 开源项目在以下场景仍有不可替代的价值:
场景一:需要提取结构化文本
大模型输出:
"这张图片包含一段关于人工智能的描述..."
OCR 输出:
"人工智能(Artificial Intelligence)...
是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的新兴技术科学。"
大模型给出的是理解性描述,OCR 给出的是逐字提取的原始文本,可以直接复制、搜索、编辑。
场景二:大规模文档处理
| 处理方式 | 速度 | 成本 | 隐私 |
|---|---|---|---|
| API 调用(商业大模型) | 快 | 按量付费,大批量成本高 | 数据需上传第三方 |
| OCR 本地处理 | 快 | 仅需硬件资源 | 完全本地,数据不外传 |
| 商业 OCR API | 快 | 适中 | 数据需上传 |
对于企业内部的敏感文档(合同、财务报表、医疗记录),本地 OCR 是唯一合规选择。
场景三:批量自动化流水线
# OCR 可以无缝接入现有自动化流程
for pdf_file in pdf_list:
text = ocr_process(pdf_file)
save_to_database(text) # 存入数据库
send_to_translation_api(text) # 触发翻译
index_to_search_engine(text) # 索引搜索引擎
场景四:离线与边缘部署
- 嵌入式设备、物联网终端
- 内网隔离的政务系统
- 完全没有网络连接的环境
核心价值总结:
✓ 精确文本提取 - 不是"理解图片",而是"复制文字"
✓ 完全隐私保护 - 数据不出本地服务器
✓ 批量自动化处理 - 大规模文档数字化的基础设施
✓ 零边际成本 - 一次部署,无限次使用
✓ 可定制训练 - 根据业务场景优化识别效果
这是两个最主流的开源 OCR 方案放在一起对比:
| 对比项 | PaddleOCR | Tesseract |
|---|---|---|
| Stars | 78,428 | 74,242 |
| 中文识别 | ⭐⭐⭐⭐⭐ 极强 | 一般 |
| 模型体积 | 约 100MB | 较小 |
| 部署复杂度 | 中等(需要 PaddlePaddle) | 低 |
| 文档结构化 | ✅ 原生支持表格/印章/公式 | ❌ 纯文字 |
| 多语言 | 111 种 | 100+ 种 |
| 隐私性 | ⭐⭐⭐⭐⭐ 完全本地 | ⭐⭐⭐⭐⭐ 完全本地 |
| 定制能力 | ⭐⭐⭐⭐⭐ 可微调训练 | ⭐⭐⭐ 可训练 |
| 免配置 | ⭐⭐⭐⭐ 开箱即用 | ❌ 需配置 |
| OpenCode 集成 | ✅ MCP 可接,代码生成顺畅 | ✅ MCP 可接但 WIP 项目 |
简单结论:
- 纯文字提取 + 快速上手 → Tesseract(装完就能用)
- 复杂文档(表格、印章、多语言混合、中文为主)→ PaddleOCR
- 想让 OpenCode 帮你写代码 → 两者都行,PaddleOCR 中文场景更强
PaddleOCR 本身很强大,但实际用起来有几个绕不开的问题:
这些问题对于会写 Python 的人不算难,但:
OpenCode 解决的问题是:这些它都能帮你写,你只需要描述需求。
OpenCode 接到需求后会按 5 个步骤处理:
1. 需求分析 → 确定技术栈(Flask + PaddleOCR)
2. 设计架构 → 前端上传 → 后端 API → OCR 引擎 → 返回结果
3. 编写代码 → 生成 paddleocr_api.py、index.html
4. 解决难点 → PDF 跨平台处理方案(pypdf + PIL 而非 pdf2image)
5. 整理文档 → README、技术解读
你不需要写一行代码,只需要描述需求和确认方向。
┌──────────────────────────────────────────────────────────────┐
│ OpenCode │
│ (AI 编程助手) │
│ │
│ 开发者 ──→ OpenCode ──→ 生成 OCR 代码 │
│ │ (paddleocr_api.py) │
│ │ │
│ └──→ 分析代码 ──→ 调试 ──→ 完成 │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ DocuScan 应用 │
│ │
│ 前端(浏览器) ←→ Flask API ←→ PaddleOCR 引擎 │
│ │
│ index.html ←→ paddleocr_api.py ←→ 文字识别 │
└──────────────────────────────────────────────────────────────┘
用户上传图片 (PNG/JPG)
│
▼
┌─────────────────┐
│ Flask 接收文件 │ ← multipart/form-data 上传
└────────┬────────┘
│
▼
┌─────────────────┐
│ 保存到临时目录 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ PaddleOCR 识别 │ ← ocr = PaddleOCR(lang="ch")
│ 返回文字列表 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 构建 Markdown │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 返回 JSON 响应 │ ← {"success": true, "text": "...", "stats": {...}}
└─────────────────┘
PDF 处理比图片复杂一点,因为 PDF 里的内容可能是文本层(直接可提取),也可能是嵌入图片(需要先 OCR)。
OpenCode 生成的方案用了 pypdf + PIL,而不是 pdf2image——原因是 pdf2image 需要安装 poppler 依赖,在 Windows 上需要手动配置环境变量,对普通用户不够友好。pypdf + PIL 是纯 Python 方案,跨平台兼容更好。
用户上传 PDF
│
▼
┌─────────────────┐
│ pypdf 读取 PDF │ ← PdfReader(pdf_path)
└────────┬────────┘
│
▼
┌─────────────────┐
│ 尝试提取文本层 │ ← page.extract_text()
└────────┴────────┘
│
有文本?
├─ 是 → 直接使用文本
└─ 否 → 提取嵌入图片
│
▼
┌─────────────────┐
│ 提取 XObject │ ← 遍历 page["/XObject"]
│ 中的嵌入图片 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ PIL 转换为 PNG │ ← Image.open(io.BytesIO(img_data))
└────────┬────────┘
│
▼
┌─────────────────┐
│ PaddleOCR 识别 │ ← ocr_image(temp_img_path)
│ 临时图片文件 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 返回 Markdown │
└─────────────────┘
这套方案的关键决策点是 OpenCode 帮你做的——它权衡了跨平台兼容性和实现复杂度,最终选了 pypdf + PIL。这个决策本身就有价值,省去了你自己踩坑的时间。
这里演示用 OpenCode 开发的网页工具识别一张 DeepSeek 降价信息图的效果:
(截图:网页界面,上传 DeepSeek 降价信息图后返回 Markdown 格式的识别结果,可复制或下载)
操作步骤:
1. 打开网页工具
2. 上传 DeepSeek 降价信息图(截图、PPT 导出图片等均可)
3. 点击识别,等待几秒
4. 结果直接显示在网页上,可一键复制,也可下载为 .md 文件
场景一:发票、合同等固定格式文档
- 推荐:PP-StructureV3
- 理由:直接输出表格结构,字段位置相对固定
- 参数:table=True, use_doc_analysis=True
场景二:身份证、营业执照等证件
- 推荐:PP-OCRv5 + 关键字段检测
- 理由:文字区域明确,适合单字段定位
- 参数:det_model_dir 指定检测模型
场景三:复杂排版的合同、协议
- 推荐:PaddleOCR-VL-1.5
- 理由:VLM 模型理解版面结构,Markdown 输出
- 参数:rec_model 选择 PaddleOCR-VL 系列
| 场景 | 实现方式 |
|---|---|
| 文档数字化 | 上传扫描件 PDF → OCR 识别 → 存入数据库 |
| 发票处理 | 批量识别发票 → 提取结构化数据 → 财务系统对接 |
| 名片管理 | 拍照识别名片 → 自动填入联系人数据库 |
| 档案电子化 | 历史档案扫描 → OCR → 可搜索的数字档案库 |
| 辅助盲人 | 图片转文字 → 语音合成朗读 |
# 创建虚拟环境(推荐)
python -m venv paddle_ocr_env
source paddle_ocr_env/bin/activate # Linux/Mac
# paddle_ocr_env\Scripts\activate # Windows
# 安装 PaddlePaddle(CPU 版本)
pip install paddlepaddle
# 安装 PaddleOCR
pip install "paddleocr>=2.7.0"
GPU 加速版本(需要 NVIDIA 显卡):
pip install paddlepaddle-gpu
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
result = ocr.ocr('invoice.png')
for line in result[0]:
print(line)
from pathlib import Path
from paddleocr import PaddleOCR
import json
def batch_ocr(image_dir, output_file):
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
image_files = list(Path(image_dir).glob("*.png")) + \
list(Path(image_dir).glob("*.jpg"))
all_results = []
for img_path in image_files:
result = ocr.ocr(str(img_path))
all_results.append({
"file": str(img_path),
"text": [line[1][0] for line in result[0]]
})
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(all_results, f, ensure_ascii=False, indent=2)
batch_ocr('./images', 'ocr_results.json')
# 中文(默认)
ocr = PaddleOCR(lang="ch")
# 英文
ocr = PaddleOCR(lang="en")
# 日文
ocr = PaddleOCR(lang="jp")
# 韩文
ocr = PaddleOCR(lang="ko")
# 法文
ocr = PaddleOCR(lang="fr")
# 德文
ocr = PaddleOCR(lang="de")
| 扩展方向 | 实现方式 |
|---|---|
| 多语言支持 | 修改 lang 参数(en, jp, ko 等) |
| 表格识别 | 使用 PaddleOCR table 模块 |
| 手写识别 | 使用 PP-OCRv5 手写模型 |
| 批量处理 | 增加队列机制(Celery/RQ) |
| 结果高亮 | 基于 bbox 坐标在前端渲染文字位置 |
用 OpenCode + PaddleOCR 做文档识别流水线,本质上是让 AI 帮你写胶水代码。
PaddleOCR 本身已经把 OCR 的事情做到了 90 分——100+ 语言支持、表格/公式/版面分析、GPU 加速。剩下 10 分就是把它跟你的业务接起来:文件读取、批量处理、结果清洗、格式转换。
这 10 分以前要花不少时间查文档、写调试,现在告诉 OpenCode 你的需求就行。
你在用 PaddleOCR 吗?遇到过什么坑?评论区聊聊。
💬 评论区