2446 字
12 分钟
PaddleOCR:让 PDF 和图片秒变结构化数据,打通 AI 落地的「最后一公里」

为什么 OCR 突然又火了?#

如果你关注 GitHub Trending,会发现一个有趣的现象:PaddlePaddle/PaddleOCR 已经连续多周稳居热门榜。

一个「老派」的 OCR 工具,在 2026 年 AI 满天飞的时代凭什么这么火?

原因很简单——LLM 的输入是文本,但现实世界的数据是图片和 PDF

你想想看:

  • 你的合同扫描件是 PDF
  • 客户的报销单是照片
  • 工厂的质检报告是扫描图
  • 医院的化验单是打印件

没有 OCR,这些东西对 AI 来说就是「天书」。PaddleOCR 就是那个把现实世界的数据「翻译」成 AI 能理解的文本的工具。

PaddleOCR 有多强?#

PaddleOCR 是百度飞桨(PaddlePaddle)生态下的开源 OCR 工具包,核心能力包括:

  • 文本检测:从图片中找到文字的位置
  • 文本识别:识别出文字的内容
  • 表格识别:识别图片中的表格结构
  • 版面分析:理解文档的段落/标题/页眉页脚结构
  • 关键信息抽取:直接提取发票、身份证中的结构化字段

支持 100+ 语言,包括中文、英文、日文、韩文、阿拉伯文等。

五分钟上手#

安装#

Terminal window
# 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 PPStructure
import 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 os
from paddleocr import PaddleOCR, PPStructure
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
# 第一步:OCR 识别 PDF
engine = 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 部署,方便集成到现有系统:

Terminal window
# 启动 OCR 服务(基于 FastAPI)
pip install paddlehub
hub serving start -m paddle_ocr --port 8866

然后通过 HTTP 调用:

Terminal window
# 调用 OCR API
curl -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

性能对比#

特性PaddleOCRTesseractEasyOCRGoogle Vision
中文识别⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
表格识别⭐⭐⭐⭐⭐⭐⭐⭐
版面分析⭐⭐⭐⭐⭐⭐⭐
GPU 加速N/A
离线运行
开源协议Apache 2.0Apache 2.0Apache 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(内存溢出)。正确的做法是分页处理:

# 分页处理,避免 OOM
from 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 任务的优化技巧:

  1. 降采样:对于超高分辨率的扫描件(600dpi 以上),可以适当降低分辨率到 300dpi 而不影响识别精度,文件大小减少 75%
  2. 并行处理:可以用 Python 的 multiprocessing 库并行处理多个页面,吞吐量提升 3-4 倍
  3. 缓存机制:已经识别过的页面保存为 JSON,下次直接加载,避免重复计算

与 LLM 结合的高级模式#

PaddleOCR 最强大的用法是和 LLM 结合,形成「视觉输入 → OCR → LLM 理解 → 结构化输出」的 pipeline:

import json
from paddleocr import PaddleOCR
from 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 就是那个「翻译官」。

PaddleOCR:让 PDF 和图片秒变结构化数据,打通 AI 落地的「最后一公里」
https://www.oferry.com/posts/a142/
作者
晨平安
发布于
2026-06-05
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00