为什么 OCR 突然又火了?
如果你关注 GitHub Trending,会发现一个有趣的现象:PaddlePaddle/PaddleOCR 已经连续多周稳居热门榜。
一个「老派」的 OCR 工具,在 2026 年 AI 满天飞的时代凭什么这么火?
原因很简单——LLM 的输入是文本,但现实世界的数据是图片和 PDF。
你想想看:
- 你的合同扫描件是 PDF
- 客户的报销单是照片
- 工厂的质检报告是扫描图
- 医院的化验单是打印件
没有 OCR,这些东西对 AI 来说就是「天书」。PaddleOCR 就是那个把现实世界的数据「翻译」成 AI 能理解的文本的工具。
PaddleOCR 有多强?
PaddleOCR 是百度飞桨(PaddlePaddle)生态下的开源 OCR 工具包,核心能力包括:
- 文本检测:从图片中找到文字的位置
- 文本识别:识别出文字的内容
- 表格识别:识别图片中的表格结构
- 版面分析:理解文档的段落/标题/页眉页脚结构
- 关键信息抽取:直接提取发票、身份证中的结构化字段
支持 100+ 语言,包括中文、英文、日文、韩文、阿拉伯文等。
五分钟上手
安装
# pip 安装pip install paddlepaddle paddleocr
# 如果要用 GPU 加速pip install paddlepaddle-gpu paddleocr最简单的用法——一行代码识别图片文字
from paddleocr import PaddleOCR
# 初始化 OCR 引擎ocr = PaddleOCR(use_angle_cls=True, lang='ch')
# 识别图片中的文字result = ocr.ocr('invoice.jpg', cls=True)
# 输出结果for line in result[0]: print(f"{line[1][0]} (置信度: {line[1][1]:.2%})")输出:
增值税普通发票 (置信度: 99.82%)发票代码: 3100234567 (置信度: 98.95%)发票号码: 98765432 (置信度: 99.10%)开票日期: 2026年06月05日 (置信度: 98.73%)购买方名称: 晨哥科技有限公司 (置信度: 97.56%)金额: ¥12,800.00 (置信度: 99.45%)进阶:表格识别
表格识别是 OCR 中最难的问题之一——传统方法很难同时保留文字内容和行列关系。PaddleOCR 的表格识别模型专门针对这个问题做了优化:
from paddleocr import PPStructureimport json
# 初始化版面分析引擎engine = PPStructure(show_log=True)
# 识别 PDF 文件(支持直接输入 PDF 路径)result = engine('report.pdf')
for item in result: if item['type'] == 'table': # 输出 HTML 格式的表格 html_table = item['res']['html'] print(html_table)
# 也可以导出为 Markdown print(f"检测到表格,共 {item['res']['cell_count']} 个单元格")<!-- PaddleOCR 自动生成的表格 HTML --><table> <tr> <th>项目名称</th> <th>2026 Q1</th> <th>2026 Q2</th> <th>增长率</th> </tr> <tr> <td>API 调用量</td> <td>1,234,567</td> <td>2,345,678</td> <td>+90%</td> </tr> <tr> <td>活跃用户</td> <td>45,321</td> <td>78,912</td> <td>+74%</td> </tr> <tr> <td>收入(万元)</td> <td>89.5</td> <td>156.3</td> <td>+75%</td> </tr></table>不需要手动调整列宽、不需要处理合并单元格——模型自动搞定。
实战:从扫描件到 RAG 知识库
这是 2026 年 OCR 最热门的应用场景:把纸质文档扫描件接入 LLM 知识库。
import osfrom paddleocr import PaddleOCR, PPStructurefrom langchain.text_splitter import CharacterTextSplitterfrom langchain_community.vectorstores import Chromafrom langchain_community.embeddings import HuggingFaceEmbeddings
# 第一步:OCR 识别 PDFengine = PPStructure(table=False, ocr=True)ocr_results = engine("annual_report_2026.pdf")
# 第二步:提取文本并分块full_text = ""for item in ocr_results: if item['type'] == 'text': for block in item['res']: full_text += block['text'] + "\n" elif item['type'] == 'table': full_text += item['res']['html'] + "\n"
print(f"成功提取 {len(full_text)} 字符")
# 第三步:文本分块text_splitter = CharacterTextSplitter( chunk_size=500, chunk_overlap=50, separator="\n")chunks = text_splitter.split_text(full_text)
# 第四步:存入向量数据库embeddings = HuggingFaceEmbeddings( model_name="BAAI/bge-large-zh-v1.5")vectorstore = Chroma.from_texts( texts=chunks, embedding=embeddings, persist_directory="./rag_db")vectorstore.persist()
print(f"知识库构建完成,共 {len(chunks)} 个文档块")做完这一步,你的 LLM 就可以「读懂」纸质文档了:
# 查询知识库query = "2026年上半年的API调用量增长趋势如何?"docs = vectorstore.similarity_search(query, k=3)
context = "\n".join([doc.page_content for doc in docs])prompt = f"""基于以下文档内容回答问题:
{context}
问题:{query}"""
# 发给任意 LLM# response = llm.invoke(prompt)在服务器上部署 OCR 服务
PaddleOCR 支持作为 REST API 部署,方便集成到现有系统:
# 启动 OCR 服务(基于 FastAPI)pip install paddlehubhub serving start -m paddle_ocr --port 8866然后通过 HTTP 调用:
# 调用 OCR APIcurl -X POST http://localhost:8866/predict/paddle_ocr \ -H "Content-Type: application/json" \ -d '{ "images": ["base64_encoded_image_string"], "use_angle_cls": true, "lang": "ch" }'对于高并发场景,PaddleOCR 支持 Triton Inference Server 部署,单卡 A100 可以做到 2000+ QPS。
性能对比
| 特性 | PaddleOCR | Tesseract | EasyOCR | Google Vision |
|---|---|---|---|---|
| 中文识别 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 表格识别 | ⭐⭐⭐⭐⭐ | ❌ | ❌ | ⭐⭐⭐ |
| 版面分析 | ⭐⭐⭐⭐⭐ | ❌ | ❌ | ⭐⭐ |
| GPU 加速 | ✅ | ❌ | ✅ | N/A |
| 离线运行 | ✅ | ✅ | ✅ | ❌ |
| 开源协议 | Apache 2.0 | Apache 2.0 | Apache 2.0 | 闭源付费 |
| 部署难度 | 低 | 低 | 低 | 无需部署 |
实用技巧
提高识别精度
# 针对不同场景优化参数ocr = PaddleOCR( use_angle_cls=True, # 启用文字方向分类(处理旋转的图片) lang='ch', det_db_thresh=0.3, # 降低检测阈值,捕获更多文字 rec_batch_num=6, # 批量识别的图片数量 use_gpu=True, # 启用 GPU 加速 max_text_length=100 # 提高单行文字长度限制)这些参数在实际项目中的调优经验:
- 对于清晰扫描件(300dpi 以上),
det_db_thresh可以保持默认值 0.3,识别率已经很理想 - 对于手机拍摄的文档,重点调
use_angle_cls=True来自动矫正拍摄角度,效果提升非常明显 - 对于手写体识别,推荐使用 PaddleOCR 的手写体专用模型
ch_ppocr_mobile_v2.0_rec,配合rec_batch_num=1逐字识别 - 对于多语言混合文档(比如中英混杂的论文),设置
lang='ch'即可自动识别中英文,不需要额外配置
处理超大 PDF
当遇到几百页的 PDF 文件时,一次性全部加载到内存中可能会导致 OOM(内存溢出)。正确的做法是分页处理:
# 分页处理,避免 OOMfrom pdf2image import convert_from_path
images = convert_from_path('huge_report.pdf', dpi=300)ocr = PaddleOCR(use_angle_cls=True, lang='ch')
all_text = []for i, img in enumerate(images): # 逐页识别 result = ocr.ocr(img, cls=True) page_text = "\n".join([line[1][0] for line in result[0]]) all_text.append(f"--- 第 {i+1} 页 ---\n{page_text}") print(f"第 {i+1}/{len(images)} 页完成,当前进度 {((i+1)/len(images)*100):.1f}%")
final_text = "\n\n".join(all_text)除了分页处理,还有一些针对大规模 OCR 任务的优化技巧:
- 降采样:对于超高分辨率的扫描件(600dpi 以上),可以适当降低分辨率到 300dpi 而不影响识别精度,文件大小减少 75%
- 并行处理:可以用 Python 的
multiprocessing库并行处理多个页面,吞吐量提升 3-4 倍 - 缓存机制:已经识别过的页面保存为 JSON,下次直接加载,避免重复计算
与 LLM 结合的高级模式
PaddleOCR 最强大的用法是和 LLM 结合,形成「视觉输入 → OCR → LLM 理解 → 结构化输出」的 pipeline:
import jsonfrom paddleocr import PaddleOCRfrom openai import OpenAI
# 步骤 1: OCR 识别ocr = PaddleOCR(use_angle_cls=True, lang='ch')result = ocr.ocr("contract_page_3.jpg", cls=True)
# 步骤 2: 提取结构化文本ocr_text = ""for line in result[0]: position = line[0] # 位置信息(左上、右上、右下、左下坐标) text = line[1][0] # 识别文本 confidence = line[1][1] # 置信度 ocr_text += f"{text}\n"
# 步骤 3: 让 LLM 理解并提取关键信息client = OpenAI( base_url="https://api.openai.com/v1", api_key="sk-xxxx")
response = client.chat.completions.create( model="gpt-4o", messages=[ { "role": "system", "content": "你是一个合同审查助手。从 OCR 识别的合同文本中提取关键条款。" }, { "role": "user", "content": f"""以下是某合同的 OCR 识别结果,请提取以下信息并以 JSON 格式返回:1. 合同双方名称2. 合同金额3. 签约日期4. 违约责任条款摘要5. 争议解决方式
OCR 结果:{ocr_text}""" } ], response_format={"type": "json_object"})
contract_info = json.loads(response.choices[0].message.content)print(json.dumps(contract_info, indent=2, ensure_ascii=False))这种 OCR + LLM 的组合方案在 2026 年的企业应用中非常流行,广泛应用于发票报销、合同审核、单据录入等场景。
总结
在 2026 年 AI 全面落地的浪潮中,PaddleOCR 扮演着一个「不起眼但不可或缺」的角色——它把物理世界的文档数字化,让 AI 不再只活在纯文本的世界里。
想想看,现在的 AI 技术已经足够成熟,能写代码、能画图、能分析数据、能写论文。但所有这些能力都依赖于一个前提:数据必须是数字化的、结构化的文本。如果数据还停留在纸质文档、图片扫描件、PDF 文件里,再强大的 AI 也无能为力。PaddleOCR 就是那个「拆墙」的工具——它把物理世界和数字世界之间的壁垒打穿,让 AI 能看到纸上的字、读懂表格里的数据、理解文档的结构。
不管你是要做发票识别、文档数字化、还是构建企业 RAG 知识库,PaddleOCR 都是目前开源社区里最成熟的选择。它不需要昂贵的商业许可证,不需要专业的 AI 团队来训练和维护,一个 pip install 就能上手。而且百度飞桨团队一直在持续维护,每两三个月就会发布新版本,社区贡献者也超过 500 人——这在 OCR 领域是非常罕见的生态活力。
我自己的使用体验是:PaddleOCR 的中文识别准确率在 98% 以上,对于清晰扫描件几乎能做到零错误。即使是手机拍摄的、有些歪斜的文档照片,经过角度校正后识别准确率也能保持在 95% 以上。这对于日常的文档数字化需求来说已经完全够用了。
如果你正在做一个需要从文档中提取信息的项目,不妨试试 PaddleOCR。先从一张发票或者一份合同开始,感受一下「图片瞬间变文本」的魔力。等熟悉了基本用法之后,再尝试和 LLM 结合,搭建一套完整的从扫描件到知识库的自动化 pipeline。我敢说,一旦用上了 OCR+RAG 的组合,你就再也不想手动整理文档了——那种「拍照 → 识别 → 自动归档 → 随时问答」的流畅体验,用过就回不去了。
AI 知道一切——但它需要你先告诉它纸上的字写了什么。PaddleOCR 就是那个「翻译官」。