Paddle OCR vs Tesseract:详细 OCR 比较
PaddleOCR 提供最先进的中文字符识别功能——但在.NET应用程序中处理单个图像需要五个NuGet包、一个连接到中国百度服务器的异步模型下载(约 100MB)、每次加载图像都需要 OpenCvSharp 依赖项,并且首次运行时需要 3-5 秒的冷启动时间。 这就是在.NET项目中使用 Python 优先的深度学习系统所要付出的代价。 对于以中日韩文字体量较大的工作负载,如果中文文本的准确性是硬性要求,并且GPU基础设施已经存在,那么付出这样的代价是值得的。 至于其他方面,都是项目原本不需要的额外开销。
了解 PaddleOCR
PaddleOCR 是百度基于其自主研发的深度学习框架 PaddlePaddle 构建的开源 OCR 系统。 该项目从头开始为Python开发人员设计,并且.NET社区通过由GitHub上的周杰(sdcb)维护的社区包装器Sdcb.PaddleOCR访问它。
识别流程将三个神经网络按顺序连接起来:一个使用可微二值化 (DB) 的文本检测模型,用于识别文本区域边界框;一个方向分类器,用于确定文本方向;以及一个使用卷积循环神经网络 (CRNN) 的识别模型,用于将检测到的区域像素转换为字符串。 每个网络都是一个单独的模型文件,必须先将其保存在磁盘上才能开始任何推理。
主要架构特征:
- 多包安装:核心包(
Sdcb.PaddleOCR.Models.Online),以及用于图像加载的OpenCvSharp——至少四个包,如果您分离OpenCvSharp运行时,则需要五个包。 -必须下载模型:模型未打包。 首次使用调用bj.bcebos.com)下载,并将~100MB添加到部署工件中。 -每个图像都依赖于 OpenCV:没有从文件路径直接进行推理的路径。 图像在传递给ocr.Run(mat)之前必须作为OpenCvSharpMat对象加载。 GPU 加速需要 CUDA/cuDNN 配置:要达到宣传的性能指标,需要 NVIDIA 驱动程序、CUDA Toolkit 11.8、cuDNN 8.6+ 以及单独的 GPU 运行时NuGet包——每个环境的配置时间约为 2-8 小时。 - Python优先发布节奏: PaddleOCR模型的新版本首先以Python版本发布; .NET封装库的更新则在数周或数月后推出。 -支持14种语言:简体中文、繁体中文、英语、法语、德语、韩语、日语、意大利语、西班牙语、葡萄牙语、俄语、阿拉伯语、印地语和泰米尔语——上限极高
NuGet包的下载量约为 20 万次。 较小的规模意味着 Stack Overflow 上的答案更少,经过实战检验的生产报告更少,以及能够根据经验回答问题的开发人员数量更少。
三模型流程的实践
每次 PaddleOCR 推理调用都会连续运行三个神经网络。 以下代码展示了开发者在返回任何文本之前所遇到的完整设置路径:
// Five packages required before this compiles:
// dotnet add package Sdcb.PaddleOCR
// dotnet add package Sdcb.PaddleOCR.Models.Online
// dotnet add package Sdcb.PaddleInference.runtime.win64.mkl
// dotnet add package OpenCvSharp4
// dotnet add package OpenCvSharp4.runtime.win
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Async download from Baidu servers — blocks first run for 10-30 seconds
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// PaddleOcrAll bundles detection, classification, and recognition
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
// OpenCV required — no file path shortcut
using Mat mat = Cv2.ImRead("document.png");
if (mat.Empty())
{
throw new FileNotFoundException("Could not load image");
}
// Three neural networks fire in sequence
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine(result.Text);
// Five packages required before this compiles:
// dotnet add package Sdcb.PaddleOCR
// dotnet add package Sdcb.PaddleOCR.Models.Online
// dotnet add package Sdcb.PaddleInference.runtime.win64.mkl
// dotnet add package OpenCvSharp4
// dotnet add package OpenCvSharp4.runtime.win
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Async download from Baidu servers — blocks first run for 10-30 seconds
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// PaddleOcrAll bundles detection, classification, and recognition
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
// OpenCV required — no file path shortcut
using Mat mat = Cv2.ImRead("document.png");
if (mat.Empty())
{
throw new FileNotFoundException("Could not load image");
}
// Three neural networks fire in sequence
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine(result.Text);
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp
' Five packages required before this compiles:
' dotnet add package Sdcb.PaddleOCR
' dotnet add package Sdcb.PaddleOCR.Models.Online
' dotnet add package Sdcb.PaddleInference.runtime.win64.mkl
' dotnet add package OpenCvSharp4
' dotnet add package OpenCvSharp4.runtime.win
' Async download from Baidu servers — blocks first run for 10-30 seconds
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
' PaddleOcrAll bundles detection, classification, and recognition
Using ocr As New PaddleOcrAll(models) With {
.AllowRotateDetection = True,
.Enable180Classification = True
}
' OpenCV required — no file path shortcut
Using mat As Mat = Cv2.ImRead("document.png")
If mat.Empty() Then
Throw New FileNotFoundException("Could not load image")
End If
' Three neural networks fire in sequence
Dim result As PaddleOcrResult = ocr.Run(mat)
Console.WriteLine(result.Text)
End Using
End Using
Rect边界框。 要按置信度过滤:result.Regions.Where(r => r.Score > 0.8)。 区域排序是空间性的,而非阅读顺序保证,因此按region.Rect.Center.X排序是一种常见模式。
了解IronOCR
IronOCR是一个面向.NET的商业 OCR 库,它基于优化的 Tesseract 5 LSTM 引擎构建,旨在消除原始 Tesseract 所需的配置和预处理工作。 一个NuGet包即可安装完整的运行时、语言模型、本地二进制文件和预处理管道。
主要特点:
- 单包部署:
dotnet add package IronOcr安装一切。 无需额外的运行时包、模型下载或本地库配置 -自动预处理:对质量较差的输入图像自动应用去斜、降噪、对比度调整、二值化和分辨率增强; 需要时可进行显式控制。 - 原生PDF支持:扫描的PDF通过
input.LoadPdf()直接加载,无需第三方转换步骤。 - 通过NuGet提供的125+种语言:每个语言包都是标准的NuGet依赖项——
dotnet add package IronOcr.Languages.ChineseSimplified——无模型目录管理。 -线程安全,CPU 优化:内置并行化功能,无需 CUDA 或 GPU 硬件支持 -商业支持及服务水平协议 (SLA):总部位于美国的Iron Software提供商业支持; 该产品并非社区附属项目。 - 永久许可:$999 Lite / $1,499 Plus / $2,999 Professional——一次性付款,无限期运行,无需按页收费。
功能对比
| 特征 | PaddleOCR(Sdcb) | IronOCR |
|---|---|---|
| 需要NuGet包 | 4-5 | 1 |
| 需要下载模型 | 是的(约100MB,百度服务器) | 否(捆绑式) |
| 设置时间 | 30-60分钟 | 5分钟 |
| 中日韩准确率 | 优秀(95%以上) | 良好(85-90%) |
| 英语/拉丁语准确性 | 良好(92-95%) | 优秀(97-99%) |
| GPU 支持 | 是的(复杂的 CUDA 配置) | CPU优化 |
| 原生 PDF 支持 | 否 | 是 |
| 支持的语言 | 14 | 125+ |
| 许可证 | Apache 2.0(免费) | 商用($999+) |
| 公司起源 | 中国(百度) | 美国(Iron Software) |
详细功能对比
| 类别/功能 | PaddleOCR(Sdcb) | IronOCR |
|---|---|---|
| 设置 | ||
| NuGet包 | 4-5 | 1 |
| 安装时下载模型 | 要求 | 包括 |
| 首次冷启动 | 3-5秒 | 不到 1 秒 |
| 安装时间 | 30-60分钟 | 不到5分钟 |
| OpenCV依赖项 | 要求 | None |
| 语言支持 | ||
| 支持的语言 | 14 | 125+ |
| 语言安装方法 | 模型下载 | NuGet 软件包 |
| 多语言同步 | 顺序模型切换 | 是(AddSecondaryLanguage) |
| 中日韩准确率 | 出色的 | 良好 |
| 拉丁语/英语准确性 | 良好 | 出色的 |
| 输入处理 | ||
| 图像文件输入 | 通过 OpenCVSharp Mat | 文件直接路径 |
| 原生 PDF 输入 | 否 | 是 |
| 受密码保护的PDF | 否 | 是 |
| 流输入 | 间接 | 是 |
| 字节数组输入 | 间接 | 是 |
| 预处理 | ||
| 自动预处理 | 否 | 是 |
| 德斯丘 | 手册 | 内置 |
| 降噪 | 手册 | 内置 |
| 对比度增强 | 手册 | 内置 |
| 分辨率缩放 | 手册 | EnhanceResolution(300) |
| 输出 | ||
| 完整文本字符串 | 是 | 是 |
| 按地区/词语搜索结果 | result.Regions |
result.Words, result.Lines |
| 置信度评分 | 每个区域(region.Score) |
每个词(word.Confidence) |
| 边界框 | region.Rect |
word.X, word.Y, word.Width, word.Height |
| 可搜索的 PDF 输出 | 否 | 是 |
| hOCR导出 | 否 | 是 |
| 性能 | ||
| 每张图像的 CPU | 300-500毫秒 | 150-300 毫秒 |
| 每个图像都配备一个GPU | 50-100毫秒(需要CUDA) | 不适用(CPU优化) |
| 内存使用 | 500MB-1GB | 100-200MB |
| 部署规模 | 300-500MB | 约80MB |
| 部署 | ||
| Docker 基础镜像大小 | 约 1.5GB(基于 CUDA) | 约400MB |
| 跨平台 | Windows/Linux(部分) | Windows、Linux、macOS |
| 气隙部署 | 是的(预下载模型) | 是的(无需下载) |
| 支持和许可 | ||
| 许可证类型 | Apache 2.0(免费) | 持续不断的商业活动 |
| 商业支持 | 社区/ GitHub | 是的,有服务水平协议 (SLA) |
| 公司/维护者 | 百度/社区包装器 | Iron Software (美国) |
| NuGet下载 | 约20万 | ~5.3M |
CJK 准确度与设置成本
CJK 准确率是 PaddleOCR 的真正优势。 对于简体中文文档,深度学习 CRNN 架构的准确率达到 95% 以上——在密集的中文字符网格、中英文混合布局和垂直文本块上,始终领先于基于 Tesseract 的引擎。 如果一个项目的主要工作是处理中文发票、普通话合同或日语产品目录,那么这种准确性优势是真实存在的。
桨板OCR方法
中国模型流程表现良好,是因为检测和识别网络是在百度的大规模中文文档数据集上训练的,而百度的核心业务就是大规模处理中文网络内容。
// Chinese model: highest accuracy for CJK documents
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("chinese-invoice.png");
PaddleOcrResult result = ocr.Run(mat);
// Filter low-confidence regions for cleaner output
var highConfidence = result.Regions
.Where(r => r.Score >= 0.8)
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X);
foreach (var region in highConfidence)
{
Console.WriteLine($"{region.Text} ({region.Score:P0})");
}
// Chinese model: highest accuracy for CJK documents
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("chinese-invoice.png");
PaddleOcrResult result = ocr.Run(mat);
// Filter low-confidence regions for cleaner output
var highConfidence = result.Regions
.Where(r => r.Score >= 0.8)
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X);
foreach (var region in highConfidence)
{
Console.WriteLine($"{region.Text} ({region.Score:P0})");
}
Imports System
Imports System.Linq
Imports OpenCvSharp
' Chinese model: highest accuracy for CJK documents
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models) With {
.AllowRotateDetection = True,
.Enable180Classification = True
}
Using mat As Mat = Cv2.ImRead("chinese-invoice.png")
Dim result As PaddleOcrResult = ocr.Run(mat)
' Filter low-confidence regions for cleaner output
Dim highConfidence = result.Regions _
.Where(Function(r) r.Score >= 0.8) _
.OrderBy(Function(r) r.Rect.Center.Y) _
.ThenBy(Function(r) r.Rect.Center.X)
For Each region In highConfidence
Console.WriteLine($"{region.Text} ({region.Score:P0})")
Next
End Using
End Using
置信度过滤模式(r.Score >= 0.8)是重要的,因为深度学习检测步骤有时会将非文本区域标记为文本。 如果不进行滤波,输出结果中会出现噪声区域。 按Rect.Center.X排序可以近似阅读顺序,但不能保证复杂多栏布局的顺序。
IronOCR方法
IronOCR 的简体中文支持以NuGet包的形式安装,无需模型管理。 中文文档的识别准确率在 85-90% 之间,低于 PaddleOCR 对相同材料的 95% 以上,但对于许多生产应用场景来说已经足够了,尤其是在文档格式一致的情况下。
// dotnet add package IronOcr.Languages.ChineseSimplified
using IronOcr;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
using var input = new OcrInput();
input.LoadImage("chinese-invoice.png");
// Preprocessing handles rotation, noise, and contrast automatically
input.Deskew();
input.DeNoise();
var result = ocr.Read(input);
// Word-level results with coordinates
foreach (var word in result.Words)
{
Console.WriteLine($"{word.Text} at ({word.X},{word.Y}) — {word.Confidence}%");
}
// dotnet add package IronOcr.Languages.ChineseSimplified
using IronOcr;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
using var input = new OcrInput();
input.LoadImage("chinese-invoice.png");
// Preprocessing handles rotation, noise, and contrast automatically
input.Deskew();
input.DeNoise();
var result = ocr.Read(input);
// Word-level results with coordinates
foreach (var word in result.Words)
{
Console.WriteLine($"{word.Text} at ({word.X},{word.Y}) — {word.Confidence}%");
}
Imports IronOcr
' dotnet add package IronOcr.Languages.ChineseSimplified
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
Using input As New OcrInput()
input.LoadImage("chinese-invoice.png")
' Preprocessing handles rotation, noise, and contrast automatically
input.Deskew()
input.DeNoise()
Dim result = ocr.Read(input)
' Word-level results with coordinates
For Each word In result.Words
Console.WriteLine($"{word.Text} at ({word.X},{word.Y}) — {word.Confidence}%")
Next
End Using
对于需要同时使用多种语言的团队——例如中英文混合文档——IronOCR通过AddSecondaryLanguage处理这种组合。 PaddleOCR 需要在不同语言之间切换模型集,这意味着需要单独的下载调用和单独的引擎实例。
权衡取舍是具体的:PaddleOCR 在纯粹的 CJK 准确率上胜出。 IronOCR在英语/拉丁语准确率(97-99% 对 92-95%)、低质量扫描的预处理以及无需管理模型文件的操作简便性方面胜出。 对于处理多种语言文档,或主要处理欧洲语言文档(偶尔包含中日韩内容)的团队来说,IronOCR 的准确率概况总体上更有用。 请访问IronOCR教程中心,查看多语言和预处理示例。
模型下载与管理
PaddleOCR 和IronOCR在模型管理上的差异是日常运营中最显著的区别。 它会影响首次设置、CI/CD 流水线、Docker 镜像和物理隔离部署。
桨板OCR方法
PaddleOCR 将模型与NuGet包分开提供。 完整的 OCR 流程需要三个模型目录,每种获取模型目录的方法都有不同的优缺点:
// Option A: Online download — simplest, but requires Baidu server access
// This runs on application startup; first run blocks for 10-30 seconds
FullOcrModel onlineModels = await OnlineFullModels.ChineseV4.DownloadAsync();
// Option B: Pre-downloaded local models — for air-gapped or compliance environments
// Developer must manually download and maintain three directories:
// models/ch_PP-OCRv4_det_infer/
// models/ch_ppocr_mobile_v2.0_cls_infer/
// models/ch_PP-OCRv4_rec_infer/
FullOcrModel localModels = new FullOcrModel(
LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"),
LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"),
LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer")
);
// Option C: Embedded model package — adds 100MB to NuGet restore, simplest deployment
// dotnet add package Sdcb.PaddleOCR.Models.LocalV4
// Japanese and Korean require separate model downloads:
FullOcrModel japaneseModels = await OnlineFullModels.JapanV4.DownloadAsync();
FullOcrModel koreanModels = await OnlineFullModels.KoreanV4.DownloadAsync();
// Option A: Online download — simplest, but requires Baidu server access
// This runs on application startup; first run blocks for 10-30 seconds
FullOcrModel onlineModels = await OnlineFullModels.ChineseV4.DownloadAsync();
// Option B: Pre-downloaded local models — for air-gapped or compliance environments
// Developer must manually download and maintain three directories:
// models/ch_PP-OCRv4_det_infer/
// models/ch_ppocr_mobile_v2.0_cls_infer/
// models/ch_PP-OCRv4_rec_infer/
FullOcrModel localModels = new FullOcrModel(
LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"),
LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"),
LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer")
);
// Option C: Embedded model package — adds 100MB to NuGet restore, simplest deployment
// dotnet add package Sdcb.PaddleOCR.Models.LocalV4
// Japanese and Korean require separate model downloads:
FullOcrModel japaneseModels = await OnlineFullModels.JapanV4.DownloadAsync();
FullOcrModel koreanModels = await OnlineFullModels.KoreanV4.DownloadAsync();
模型版本必须与封装版本一致。 当Sdcb.PaddleOCR更新时,可能需要重新下载以前版本的预下载模型。 缓存NuGet还原步骤的 CI/CD 管道还必须单独管理模型文件缓存或在容器构建阶段触发模型下载。 Docker 镜像对比显示了结果:PaddleOCR 容器的大小约为 1.5GB; 一个约 400MB 的IronOCR容器。
IronOCR方法
IronOCR语言模型是标准的NuGet包。 无需下载调用,无需模型目录管理,无需版本同步。 IronOCR的NuGet包包含英文模型; 附加语言包的安装方式与其他依赖项完全相同。
// dotnet add package IronOcr
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.Japanese
using IronOcr;
// 否 async initialization, no model path, no version matching
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.Japanese);
using var input = new OcrInput();
input.LoadImage("mixed-cjk-document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
// dotnet add package IronOcr
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.Japanese
using IronOcr;
// 否 async initialization, no model path, no version matching
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.Japanese);
using var input = new OcrInput();
input.LoadImage("mixed-cjk-document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
' 否 async initialization, no model path, no version matching
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
ocr.AddSecondaryLanguage(OcrLanguage.Japanese)
Using input As New OcrInput()
input.LoadImage("mixed-cjk-document.png")
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
语言包作为dotnet restore的一部分恢复。 复制apt-get install libopencv-dev,并添加CUDA基础镜像,只是在IronOCR容器中不存在。 对于使用Docker 部署或Azure 部署的团队来说,容器构建的复杂性差异很大。
GPU 和 CUDA 依赖性
PaddleOCR 的 GPU 性能数据——每张图像 50-100 毫秒,而 CPU 处理则需要 300-500 毫秒——是真实可靠的。深度学习模型能够显著受益于 GPU 并行处理,而基于 Tesseract 的引擎则无法做到这一点。 对于每天处理数万张图像的工作负载而言,5-10 倍的吞吐量提升将改变基础设施的格局。
桨板OCR方法
GPU 推理需要一个完全独立于NuGet的软件栈。 环境先决条件非常明确,并且版本锁定:
// Prerequisites (must be installed before this compiles correctly):
// 1. NVIDIA GPU with CUDA capability 3.5+
// 2. NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
// 3. CUDA Toolkit 11.8 — exact version, not 12.x
// 4. cuDNN 8.6.0+ for CUDA 11.x
// 5. dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference;
using OpenCvSharp;
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// GPU device 0, 1000MB GPU memory pool
using PaddleOcrAll ocr = new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead(imagePath);
PaddleOcrResult result = ocr.Run(mat);
// Prerequisites (must be installed before this compiles correctly):
// 1. NVIDIA GPU with CUDA capability 3.5+
// 2. NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
// 3. CUDA Toolkit 11.8 — exact version, not 12.x
// 4. cuDNN 8.6.0+ for CUDA 11.x
// 5. dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference;
using OpenCvSharp;
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// GPU device 0, 1000MB GPU memory pool
using PaddleOcrAll ocr = new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead(imagePath);
PaddleOcrResult result = ocr.Run(mat);
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports Sdcb.PaddleInference
Imports OpenCvSharp
' Prerequisites (must be installed before this compiles correctly):
' 1. NVIDIA GPU with CUDA capability 3.5+
' 2. NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
' 3. CUDA Toolkit 11.8 — exact version, not 12.x
' 4. cuDNN 8.6.0+ for CUDA 11.x
' 5. dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
' GPU device 0, 1000MB GPU memory pool
Using ocr As New PaddleOcrAll(models, PaddleDevice.Gpu(deviceId:=0)) With {
.AllowRotateDetection = True,
.Enable180Classification = True
}
Using mat As Mat = Cv2.ImRead(imagePath)
Dim result As PaddleOcrResult = ocr.Run(mat)
End Using
End Using
如果CUDA_PATH未设置,匹配的cuDNN DLL缺失在预期路径中,或运行时包版本与安装的CUDA工具包不匹配,则调用将抛出本机库加载异常。 诊断该故障需要检查多个目录中的驱动程序版本、PATH 条目和 DLL 文件是否存在。 在Docker中,GPU支持需要nvidia-container-toolkit,这给镜像构建及容器运行时配置增加了复杂性。
对于仅使用 CPU 的部署,PaddleOCR 默认使用 MKL 加速运行时:每张图像约 300-500 毫秒,模型加载冷启动时间为 3-5 秒。
IronOCR方法
IronOCR专为 CPU 推理而设计。 它在标准硬件上每张图像的处理时间为 150-300 毫秒,不依赖 GPU,没有 CUDA 堆栈,也不用担心驱动程序版本问题。 由于模型在初始化时是打包的而不是从磁盘加载的,因此引擎启动时间不到一秒。
using IronOcr;
// 否 GPU setup, no CUDA, no driver checks
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
// Preprocessing built-in — improves accuracy on poor scans without extra code
using var input = new OcrInput();
input.LoadImage("document.png");
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);
var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
using IronOcr;
// 否 GPU setup, no CUDA, no driver checks
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
// Preprocessing built-in — improves accuracy on poor scans without extra code
using var input = new OcrInput();
input.LoadImage("document.png");
input.Deskew();
input.DeNoise();
input.EnhanceResolution(300);
var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
' 否 GPU setup, no CUDA, no driver checks
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim ocr As New IronTesseract()
' Preprocessing built-in — improves accuracy on poor scans without extra code
Using input As New OcrInput()
input.LoadImage("document.png")
input.Deskew()
input.DeNoise()
input.EnhanceResolution(300)
Dim result = ocr.Read(input)
Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
对于没有GPU硬件的大规模吞吐量,IronOCR的线程安全设计允许在批处理图像中使用单独的Parallel.ForEach——每个实例独立处理,无需锁定。 多线程示例展示了这种模式。 在 4 核 CPU 上,每张图像的处理时间为 150-300 毫秒,使用并行处理,一批 100 张图像的处理时间为 20-40 秒——CPU 吞吐量使得在大多数 Web API 和文档管道场景中无需投资 GPU。
图像质量校正指南详细介绍了自动预处理需要调整时的预处理配置。
PDF处理
PaddleOCR 本身不支持 PDF。 通过 PaddleOCR 处理的每个 PDF 都需要一个外部库先将页面转换为图像,在转换和推理之间进行临时文件管理,以及清理逻辑。
桨板OCR方法
// Requires additional package: PdfiumViewer or similar
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using PdfiumViewer;
using System.Drawing.Imaging;
using System.Text;
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
var results = new StringBuilder();
// 手册 PDF-to-image conversion, page by page
using PdfDocument pdf = PdfDocument.Load("document.pdf");
for (int i = 0; i < pdf.PageCount; i++)
{
// Render page to bitmap — 200 DPI
using var pageImage = pdf.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
// Save to temp file — OpenCvSharp cannot read from memory easily
string tempPath = Path.GetTempFileName() + ".png";
pageImage.Save(tempPath, ImageFormat.Png);
try
{
using Mat mat = Cv2.ImRead(tempPath);
var result = ocr.Run(mat);
results.AppendLine($"--- Page {i + 1} ---");
results.AppendLine(result.Text);
}
finally
{
File.Delete(tempPath); // Must clean up temp files
}
}
return results.ToString();
// Requires additional package: PdfiumViewer or similar
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using PdfiumViewer;
using System.Drawing.Imaging;
using System.Text;
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
var results = new StringBuilder();
// 手册 PDF-to-image conversion, page by page
using PdfDocument pdf = PdfDocument.Load("document.pdf");
for (int i = 0; i < pdf.PageCount; i++)
{
// Render page to bitmap — 200 DPI
using var pageImage = pdf.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
// Save to temp file — OpenCvSharp cannot read from memory easily
string tempPath = Path.GetTempFileName() + ".png";
pageImage.Save(tempPath, ImageFormat.Png);
try
{
using Mat mat = Cv2.ImRead(tempPath);
var result = ocr.Run(mat);
results.AppendLine($"--- Page {i + 1} ---");
results.AppendLine(result.Text);
}
finally
{
File.Delete(tempPath); // Must clean up temp files
}
}
return results.ToString();
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp
Imports PdfiumViewer
Imports System.Drawing.Imaging
Imports System.Text
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models)
Dim results As New StringBuilder()
' 手册 PDF-to-image conversion, page by page
Using pdf As PdfDocument = PdfDocument.Load("document.pdf")
For i As Integer = 0 To pdf.PageCount - 1
' Render page to bitmap — 200 DPI
Using pageImage = pdf.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi)
' Save to temp file — OpenCvSharp cannot read from memory easily
Dim tempPath As String = Path.GetTempFileName() & ".png"
pageImage.Save(tempPath, ImageFormat.Png)
Try
Using mat As Mat = Cv2.ImRead(tempPath)
Dim result = ocr.Run(mat)
results.AppendLine($"--- Page {i + 1} ---")
results.AppendLine(result.Text)
End Using
Finally
File.Delete(tempPath) ' Must clean up temp files
End Try
End Using
Next
End Using
Return results.ToString()
End Using
一个PDF文件就有30多行。 在 PaddleOCR 本身启动之前,会执行以下操作:添加另一个NuGet依赖项 (PdfiumViewer)、以选定的 DPI 手动渲染页面、创建和删除临时文件以及迭代累积结果。 DPI 设置过低会降低精度; 过高会增加处理时间。这由开发者决定。
IronOCR方法
IronOCR可以直接读取 PDF 文件。 没有转换库,没有临时文件,调用点没有逐页循环:
using IronOcr;
var ocr = new IronTesseract();
// 原生 PDF 输入 — no external library needed
using var input = new OcrInput();
input.LoadPdf("document.pdf");
var result = ocr.Read(input);
// Per-page access available if needed
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} chars");
}
// Produce a searchable PDF in one additional line
result.SaveAsSearchablePdf("searchable-output.pdf");
using IronOcr;
var ocr = new IronTesseract();
// 原生 PDF 输入 — no external library needed
using var input = new OcrInput();
input.LoadPdf("document.pdf");
var result = ocr.Read(input);
// Per-page access available if needed
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} chars");
}
// Produce a searchable PDF in one additional line
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr
Dim ocr As New IronTesseract()
' 原生 PDF 输入 — no external library needed
Using input As New OcrInput()
input.LoadPdf("document.pdf")
Dim result = ocr.Read(input)
' Per-page access available if needed
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} chars")
Next
' Produce a searchable PDF in one additional line
result.SaveAsSearchablePdf("searchable-output.pdf")
End Using
使用相同的Password参数处理受密码保护的PDF。 PDF 输入指南和可搜索 PDF 指南详细介绍了多页和输出选项。 对于将扫描文档档案数字化的组织而言(每个文件都是 PDF 格式),这种差异可以省去一层重要的集成代码。
API 映射参考
| PaddleOCR(Sdcb) | IronOCR当量 | 备注 |
|---|---|---|
Sdcb.PaddleOCR |
IronOcr |
名称空间 |
PaddleOcrAll |
IronTesseract |
主OCR编排类 |
FullOcrModel |
不适用 | 没有等效产品——捆绑式模型 |
OnlineFullModels.ChineseV4.DownloadAsync() |
dotnet add package IronOcr.Languages.ChineseSimplified |
模型采集 |
LocalDetectionModel.FromDirectory(path) |
不适用 | 无模型路径管理 |
LocalClassificationModel.FromDirectory(path) |
不适用 | 无模型路径管理 |
LocalRecognitionModel.FromDirectory(path) |
不适用 | 无模型路径管理 |
new PaddleOcrAll(models) |
new IronTesseract() |
引擎实例化 |
new PaddleOcrAll(models, PaddleDevice.Gpu(0)) |
不适用(CPU优化) | GPU设备选择 |
Cv2.ImRead(imagePath)(OpenCvSharp) |
new OcrInput(imagePath) 或 input.LoadImage(path) |
图片加载中 |
ocr.Run(mat) |
ocr.Read(input) |
执行OCR |
result.Text |
result.Text |
完整文档文本 |
result.Regions |
result.Words / result.Lines |
结构化文本区域 |
region.Text |
word.Text |
来自某个地区的文本 |
region.Score |
word.Confidence |
置信度值(0-1 vs 0-100) |
region.Rect.Center.X / .Center.Y |
word.X / word.Y |
边界框位置 |
region.Rect.Size.Width / .Height |
word.Width / word.Height |
边界框尺寸 |
AllowRotateDetection = true |
input.Deskew() |
旋转处理 |
Enable180Classification = true |
自动翻译 | 倒置文本检测 |
| 不适用 | input.DeNoise() |
降噪 |
| 不适用 | input.Contrast() |
对比度增强 |
| 不适用 | input.EnhanceResolution(300) |
DPI缩放 |
| 不适用 | input.LoadPdf(path) |
原生 PDF 输入 |
| 不适用 | result.SaveAsSearchablePdf(path) |
可搜索的 PDF 输出 |
| 不适用 | ocr.AddSecondaryLanguage(lang) |
同时支持多种语言 |
当队伍考虑从桨板障碍赛 (PaddleOCR) 转向IronOCR)时
当语言要求超过 14 种时
一个项目开始处理中文发票——PaddleOCR 处理得很好。 然后客户群扩大,文件以波兰语、荷兰语、希腊语、越南语和土耳其语寄来。 PaddleOCR 支持的 14 种语言中不包含这些语言。 由于该工具无法随着使用场景的变化而扩展,因此迁移势在必行。 在IronOCR中添加波兰语支持只需添加一个NuGet包并更改一行配置即可。 如果团队将项目范围界定为"最初以中文为主,但最终扩展到多个地区",则需要预先决定是否要使用无需重写即可扩展语言覆盖范围的工具。
当启动成本超过问题预算时
PaddleOCR 文档估计首次设置需要 30-60 分钟(CPU)和 2-8 小时(GPU)。 开发人员每小时收费 100 美元,这意味着在处理第一个生产映像之前,第一次 GPU 配置尝试的成本为 200-800 美元。IronOCR的安装只需一条安装命令和四行代码示例——不到五分钟即可完成。 对于内部工具、原型或项目而言,OCR 是次要功能而不是核心产品,这种时间差决定了 OCR 功能是在当前迭代中发布还是被降低优先级。 与配置 CUDA 环境相比, IronOCR的入门所需时间更短。
当 PDF 工作流程占据主导地位时
对于将扫描文档档案数字化、处理传真到 PDF 的流程或从 PDF 格式的发票和合同中提取数据的组织而言,PaddleOCR 存在一个结构性问题:每个 PDF 都需要额外的库、手动页面渲染、临时文件管理和 DPI 选择逻辑,PaddleOCR 才能对其进行处理。 这不是偶然的复杂性,而是永久性的维护。 在最初集成 PaddleOCR 后,如果团队发现他们的工作负载 80% 以上是基于 PDF 的,那么当 PDF 转换层出现错误而不是 PaddleOCR 本身出现故障时,他们通常会进行迁移。
当合规性审查发现百度来源时
政府、国防、医疗保健和金融服务机构的Enterprise安全团队越来越多地将审查标准应用于源自与中国政府有关联的公司的组件。 PaddleOCR是百度旗下的一个项目; 模型下载默认连接到百度云存储; PaddlePaddle框架是百度旗下的产品。 代码在本地运行,文档不会传输,但模型工件源自百度基础设施。 对于 FedRAMP、ITAR 或 CMMC 环境,这种来源信息会触发合规性审查,从而可能阻碍采用。 IronOCR是美国公司Iron Software的产品,它在本地处理所有内容,不进行任何外部连接,也不需要从任何第三方服务器下载模型。
当GPU基础设施尚未到位时
CPU 上的 PaddleOCR(每张图像 300-500 毫秒,冷启动 3-5 秒,500MB-1GB 内存)比 CPU 上的IronOCR (每张图像 150-300 毫秒,冷启动不到 1 秒,100-200MB 内存)速度更慢,资源占用更高。 PaddleOCR 的 GPU 优势只有在 CUDA/cuDNN 设置之后才能体现出来,而且这种优势只有在高容量的情况下才能证明其操作复杂性的合理性。 运行没有 GPU 实例的标准云基础设施(例如没有 GPU 的 EC2、Azure 应用服务、AWS Lambda)的团队,需要支付 PaddleOCR 的设置成本,却无法获得与其成本相符的性能优势。
常见迁移注意事项
软件包和命名空间替换
软件包替换移除了五个依赖项,并添加了一个。 从OpenCvSharp4.runtime.win。 添加IronOcr。 对于之前使用下载模型集的任何非英语语言,请添加NuGet包形式的语言包。
using IronOcr。 input.LoadImage(path)。 ocr.Read(input)。 对于使用图像输入API的项目,System.Drawing.Bitmap——OpenCvSharp中介完全消失。
结果结构重映射
PaddleOCR返回w.Confidence >= 80。 边界框访问从region.Rect.Center.X / word.X / word.Width。 结构化结果指南涵盖页码、段落、行数和单词。
IronOCR通常不需要空间排序(先按 Y 轴排序再按 X 轴排序以近似阅读顺序),因为 Tesseract 布局引擎会在页面分割步骤中执行阅读顺序分析。对于 PaddleOCR 需要显式排序逻辑的文档,在移植排序代码之前,请先测试IronOCR的默认输出顺序是否已满足要求。
预处理转换
PaddleOCR 的深度学习检测模型能够容忍一定程度的图像质量下降——与 Tesseract 的传统分割流程相比,该神经网络能够更可靠地处理噪声和倾斜。迁移到IronOCR时,对于之前无需预处理即可成功处理的文档,需要添加显式预处理:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("low-quality-scan.png");
// These filters recover the accuracy that PaddleOCR provided automatically
// on noisy or skewed inputs
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);
var result = ocr.Read(input);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("low-quality-scan.png");
// These filters recover the accuracy that PaddleOCR provided automatically
// on noisy or skewed inputs
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);
var result = ocr.Read(input);
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("low-quality-scan.png")
' These filters recover the accuracy that PaddleOCR provided automatically
' on noisy or skewed inputs
input.Deskew()
input.DeNoise()
input.Contrast()
input.Binarize()
input.EnhanceResolution(300)
Dim result = ocr.Read(input)
End Using
对于以非标准角度或存在背景噪声的扫描文档,这四种滤镜可以弥补大部分精度差距。图像方向校正指南和图像颜色校正指南详细说明了每种滤镜对常见扫描伪影的影响。 在最终完成迁移之前,通过两个管道运行代表性文档,以验证准确性是否符合实际文档集的要求。
部署清理
迁移后,部署工件显著缩小。 删除opencv_world*.dll文件(总计约50MB)。 从Dockerfile和模型复制步骤中删除apt-get install libopencv-dev行。删除任何预下载模型或缓存模型目录的CI/CD步骤。 Docker 镜像大小从约 1.5GB 降至约 400MB。
其他IronOCR功能
除了上述比较点之外, IronOCR还提供了一些功能,使 OCR 的功能不仅限于文本提取:
- 在OCR过程中读取条形码:设置
ocr.Configuration.ReadBarCodes = true,同一文档上的条形码与文本一起在一次传递中解码——无需单独的条形码库。 - 基于区域的OCR:使用
CropRectangle定向特定文档区域(发票编号字段、标题行、签名区),无需处理整个页面。 -异步 OCR :完全支持ASP.NET控制器和后台服务中的Async/Await非阻塞集成 -置信度评分:文档级和词级置信度评分可实现质量把关——拒绝或标记置信度低的结果以供人工审核。 - hOCR 导出:为下游文档管理系统生成 hOCR 输出,这些系统使用位置 HTML -手写识别:不仅限于打印文档的OCR识别,还包括手写表格和笔记。 -表格数据提取:从发票、账单和表单中结构化提取表格数据。 -进度跟踪:报告用户界面中长时间多页批量操作的 OCR 进度
.NET兼容性和未来准备情况
IronOCR可兼容 Windows x64、Windows x86、Linux x64 和 macOS 上的.NET 6、7、8 和 9。 它可在 Azure 应用服务、AWS Lambda、Docker 容器和物理隔离的本地环境中运行——所有这些都来自同一个NuGet包。 该库会定期收到Iron Software的更新,与每个.NET版本周期保持一致,包括计划在发布时与.NET 10 兼容。 PaddleOCR 的.NET封装器是一个由社区维护的项目; 与新版.NET 的兼容性取决于单个维护者的能力。 该封装程序的发布时间表以及新的 PaddleOCR Python 模型版本在.NET上发布需要 3 个月的时间,这表明它依赖于社区的可用性,而不是商业发布承诺。
结论
PaddleOCR 的 CJK 准确率优势是真实且具体的。 对于一个主要工作负载是简体中文文档,且团队拥有深度学习专业知识和现有 GPU 基础设施的项目来说,多软件包设置成本和 CUDA 配置复杂性是合理的,因为 Tesseract 引擎目前在密集中文字符识别方面无法达到如此高的准确率。
问题在于,这种特定场景只描述了.NET OCR 用例中的一小部分。 大多数商业应用程序处理的是英语和欧洲语言文档,IronOCR 的准确率达到 97-99%,超过了 PaddleOCR 的准确率 92-95%。 大多数开发团队没有预先配置 CUDA 基础设施。 大多数文档处理流程都会接收 PDF 文件,而 PaddleOCR 在没有额外库的情况下无法处理 PDF 文件。 大多数从事.NET项目的开发人员都希望单个软件包的安装就能完成整个安装步骤,而不是先安装五个软件包,然后下载异步模型,最后安装 OpenCV 依赖项。
对于需要大规模 GPU 吞吐量的团队来说,PaddleOCR 的 CPU 性能(300-500 毫秒)已经落后于IronOCR 的CPU 性能(150-300 毫秒)——这意味着 PaddleOCR 的性能优势只有在 CUDA 基础设施已经运行的情况下才成立。 仅从 GPU 配置时间来看,IronOCR 的永久许可成本通常在第一周内即可收回。
首先要问的问题是,95% 以上的汉字准确率是否足以证明实现这一目标所需的整套技术栈是合理的。 对于以中国为主要业务的工作负载,以及拥有 GPU 基础设施和百度原创软件合规性许可的环境,答案是肯定的。 对于其他所有情况, IronOCR可在五分钟内开始工作,并涵盖大多数.NET OCR 项目实际遇到的语言、预处理和 PDF 要求。
常见问题解答
什么是 PaddleOCR?
PaddleOCR 是一款 OCR 解决方案,开发者和企业使用它从图像和文档中提取文本。它是与 IronOCR 一起评估的几种用于 .NET 应用程序开发的 OCR 方案之一。
对于 .NET 开发人员来说,IronOCR 与 PaddleOCR 相比有何不同?
IronOCR 是一个基于 NuGet 的 .NET OCR 库,它使用 IronTesseract 作为核心引擎。与 PaddleOCR 相比,它提供更简单的部署方式(无需 SDK 安装程序)、统一的定价模式以及简洁的 C# API,无需 COM 互操作或云依赖。
IronOCR 比 PaddleOCR 更容易设置吗?
IronOCR 通过单个 NuGet 包进行安装。无需 SDK 安装程序、复制许可证文件、注册 COM 组件或管理单独的运行时二进制文件。整个 OCR 引擎都打包在包中。
PaddleOCR 和 IronOCR 在精度方面存在哪些差异?
IronOCR 对标准商务文档、发票、收据和扫描表格的识别准确率很高。对于严重损坏的文档或不常见的文字,识别准确率会因源文件质量而异。IronOCR 包含图像预处理滤镜,可提高低质量输入文件的识别率。
IronOCR是否支持PDF文本提取?
是的。IronOCR只需一次调用即可从原生PDF和扫描的PDF图像中提取文本。它还支持多页TIFF文件、图像和流。对于扫描的PDF,OCR逐页进行处理,并为每个页面生成一个结果对象。
PaddleOCR 的授权许可与 IronOCR 相比有何不同?
IronOCR采用永久统一费率许可,不按页或扫描次数收费。处理大量文档的机构无论处理量多少,都只需支付相同的许可费用。详情及批量定价请访问IronOCR许可页面。
IronOCR支持哪些语言?
IronOCR 通过独立的 NuGet 语言包支持 127 种语言。添加语言只需一条命令“dotnet add package IronOcr.Languages.{Language}”。无需手动放置文件或配置路径。
如何在.NET项目中安装IronOCR ?
通过 NuGet 安装:在程序包管理器控制台中运行“Install-Package IronOcr”命令,或在命令行界面 (CLI) 中运行“dotnet add package IronOcr”命令。其他语言包的安装方式相同。无需使用原生 SDK 安装程序。
与 PaddleOCR 不同,IronOCR 是否适用于 Docker 和容器化部署?
是的。IronOCR 通过 NuGet 包在 Docker 容器中运行。许可证密钥通过环境变量设置。OCR 引擎本身不需要任何许可证文件、SDK 路径或卷挂载。
我可以在购买前试用 IronOCR,并将其与 PaddleOCR 进行比较吗?
是的。IronOCR 试用模式可以处理文档,并在输出结果上添加水印,从而生成 OCR 结果。您可以在购买许可证之前,先在自己的文档上验证其准确性。
IronOCR是否支持条形码读取和文本提取?
IronOCR专注于文本提取和OCR识别。对于条形码读取,Iron Software提供了配套库IronBarcode。两者都可单独购买,也可作为Iron Suite套装的一部分购买。
从 PaddleOCR 迁移到 IronOCR 容易吗?
从 PaddleOCR 迁移到 IronOCR 通常涉及将初始化序列替换为 IronTesseract 实例化、移除 COM 生命周期管理以及更新 API 调用。大多数迁移都能显著降低代码复杂度。

