AWS vs Google Vision(OCR 功能比较)
Dynamsoft Label Recognizer 有一项功能非常强大——从护照中提取 MRZ 信息、从车辆扫描 VIN 码以及从工业包装读取结构化标签——但它拒绝做任何其他事情。 这种狭窄的专业知识一旦您的应用程序需要通用文档 OCR 功能,就会变成预算问题,因为您需要为 MRZ 购买 Dynamsoft 标签识别器 的许可,为 QR 码购买 Dynamsoft Barcode Reader 的许可,为边缘检测购买 Dynamsoft Document Normalizer 的许可,并且还在寻找第四个库来处理整页文档。 IronOCR 将所有这些功能集中在一个 NuGet 包中,$999 永久。
了解 Dynamsoft 标签识别器
总部位于加拿大温哥华的 Dynamsoft 公司围绕一个特定的理念打造了其标签识别器产品:可靠地识别受限格式中的机器可读结构化文本。 产品的 NuGet 包是 Dynamsoft.DotNet.LabelRecognizer,其商业许可完全依赖于年度订阅——不存在永久选项。 联系Dynamsoft以获取当前定价。
该库的识别模型是基于模板的。 您可以通过 JSON 设置 API(AppendSettingsFromString)配置识别任务,随后可以针对图像文件调用 RecognizeFile 或 RecognizeByFile。 结果以包含原始文本字符串的行结果集合的形式返回。 将这些字符串解析成有意义的结构化数据——字段偏移量、日期转换、校验位验证——完全由您负责。
Dynamsoft 标签识别器的主要架构特点:
-基于模板的识别引擎: MRZ、VIN 和标签模式在识别前需要 JSON 模板配置。
- 仅输出原始文本:
RecognizeFile返回带有文本字符串的LineResult对象; 没有结构化字段解析 -仅支持图像输入:不支持原生 PDF; PDF文件需要先转换为图像才能进行处理。 - 年度订阅许可: 可用的每设备和每服务器层级; 联系Dynamsoft获取最新价格; no one-time purchase -每项功能对应一个单独的产品:条形码读取、文档规范化和相机优化都需要单独授权的产品。 -语言覆盖范围有限:主要针对拉丁字符 MRZ 格式; 缺乏广泛的多语言文档支持
JSON 运行时设置 API
每个 Dynamsoft 标签识别器工作流程都从模板配置步骤开始。例如,MRZ 识别需要加载一个 JSON 文档,该文档声明了识别参数、字符模型和区域引用,然后才能进行任何图像处理:
using Dynamsoft.DLR;
public class DynamsoftMrzService : IDisposable
{
private readonly LabelRecognizer _recognizer;
public DynamsoftMrzService(string licenseKey)
{
// Static license initialization — must precede instance creation
LabelRecognizer.InitLicense(licenseKey);
_recognizer = new LabelRecognizer();
// MRZ requires specific template configuration loaded as JSON
string mrzTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""MRZ"",
""ReferenceRegionNameArray"": [""FullImage""],
""CharacterModelName"": ""MRZ""
}]
}";
_recognizer.AppendSettingsFromString(mrzTemplate);
}
public string ExtractRawMrz(string passportImagePath)
{
var results = _recognizer.RecognizeFile(passportImagePath);
// Returns raw MRZ text lines only — no field parsing
var mrzLines = new StringBuilder();
foreach (var result in results)
{
foreach (var lineResult in result.LineResults)
{
mrzLines.AppendLine(lineResult.Text);
}
}
return mrzLines.ToString().Trim();
}
public void Dispose() => _recognizer?.Dispose();
}
using Dynamsoft.DLR;
public class DynamsoftMrzService : IDisposable
{
private readonly LabelRecognizer _recognizer;
public DynamsoftMrzService(string licenseKey)
{
// Static license initialization — must precede instance creation
LabelRecognizer.InitLicense(licenseKey);
_recognizer = new LabelRecognizer();
// MRZ requires specific template configuration loaded as JSON
string mrzTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""MRZ"",
""ReferenceRegionNameArray"": [""FullImage""],
""CharacterModelName"": ""MRZ""
}]
}";
_recognizer.AppendSettingsFromString(mrzTemplate);
}
public string ExtractRawMrz(string passportImagePath)
{
var results = _recognizer.RecognizeFile(passportImagePath);
// Returns raw MRZ text lines only — no field parsing
var mrzLines = new StringBuilder();
foreach (var result in results)
{
foreach (var lineResult in result.LineResults)
{
mrzLines.AppendLine(lineResult.Text);
}
}
return mrzLines.ToString().Trim();
}
public void Dispose() => _recognizer?.Dispose();
}
Imports Dynamsoft.DLR
Imports System.Text
Public Class DynamsoftMrzService
Implements IDisposable
Private ReadOnly _recognizer As LabelRecognizer
Public Sub New(licenseKey As String)
' Static license initialization — must precede instance creation
LabelRecognizer.InitLicense(licenseKey)
_recognizer = New LabelRecognizer()
' MRZ requires specific template configuration loaded as JSON
Dim mrzTemplate As String = "{
""LabelRecognizerParameterArray"": [{
""Name"": ""MRZ"",
""ReferenceRegionNameArray"": [""FullImage""],
""CharacterModelName"": ""MRZ""
}]
}"
_recognizer.AppendSettingsFromString(mrzTemplate)
End Sub
Public Function ExtractRawMrz(passportImagePath As String) As String
Dim results = _recognizer.RecognizeFile(passportImagePath)
' Returns raw MRZ text lines only — no field parsing
Dim mrzLines As New StringBuilder()
For Each result In results
For Each lineResult In result.LineResults
mrzLines.AppendLine(lineResult.Text)
Next
Next
Return mrzLines.ToString().Trim()
End Function
Public Sub Dispose() Implements IDisposable.Dispose
_recognizer?.Dispose()
End Sub
End Class
RecognizeFile 的输出是原始的 MRZ 文本,例如 P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<<。 要获取 DateOfBirth 和 ExpiryDate 作为类型化的属性,您需要自己实现一个 TD1/TD2/TD3 解析器。 该仓库中的 Dynamsoft 文档和源文件估计该解析器大约需要 150 行解析代码——处理字符偏移、<< 名称分隔符、两位数年份歧义和校验位验证——这些都不是 Dynamsoft 提供的。
了解IronOCR
IronOCR是一个商业.NET OCR 库,它基于优化的 Tesseract 5 引擎构建,并具有托管 API 层,可处理预处理、输入格式、结构化输出和专门的文档解析。 安装只需一个 NuGet 命令:dotnet add package IronOcr。 没有原生二进制管理,没有 tessdata 文件夹设置,没有模板配置文件。
主要特点:
-通用和专业功能:同一软件包即可处理整页文档 OCR、多页 PDF、扫描图像批量处理以及特殊格式(护照、条形码、车牌)。 -自动预处理流程:在低质量输入图像上,无需手动配置即可运行去斜、降噪、对比度调整、二值化和分辨率增强等步骤。 -原生 PDF 支持:直接读取扫描版和数字版 PDF 文件,包括受密码保护的文件,无需外部转换步骤 -结构化输出层级:结果显示页面、段落、行、单词和字符边界框,并附有置信度评分。
- 内置条码读取: 启用
ocr.Configuration.ReadBarCodes = true,条码将与文本在同一次扫描中提取。 - 125+ 个语言包:每种语言都作为单独的NuGet包安装; 无需管理 Tessdata 文件夹
- 永久许可: $999 Lite、$1,499 Plus、$2,999 Professional——一次性购买,涵盖所有平台和所有功能。 -跨平台部署: Windows、Linux、macOS、Docker、AWS 和 Azure 均可使用同一软件包,无需平台特定的配置。
功能对比
| 特征 | Dynamsoft 标签识别器 | IronOCR |
|---|---|---|
| 通用文档 OCR | 不支持 | 全面支持 |
| MRZ提取 | 专业版(原始文本) | 内置已解析字段 |
| 原生 PDF 输入 | 不支持 | 是 |
| 条形码读取 | 独立产品(Dynamsoft 条码阅读器) | 内置 (ReadBarCodes) |
| 可搜索的 PDF 输出 | 不支持 | 是 |
| 语言支持 | 有限公司(拉丁语 MRZ) | 125 种以上语言 |
| 许可模式 | 仅限年度订阅 | 永久使用权 + 订阅选项 |
| 全面覆盖所需的产品 | 3岁以上 | 1 |
详细功能对比
| 特征 | Dynamsoft 标签识别器 | IronOCR |
|---|---|---|
| 识别范围 | ||
| 通用文档 OCR | 不支持 | 是 |
| MRZ识别 | 专门 | 是 (ReadPassport) |
| 车辆识别码 (VIN) 识别 | 专门 | 是的(通过标准OCR识别) |
| 工业标签解读 | 专门 | 是 |
| 手写识别 | 不支持 | 是 |
| 表格提取 | 不支持 | 是 |
| 输入格式 | ||
| 图像文件(JPG、PNG、TIFF) | 是 | 是 |
| PDF(原生) | 不支持 | 是 |
| 受密码保护的PDF | 不支持 | 是 |
| 字节数组/流 | 是 | 是 |
| 多页文档 | 手动聚合 | 是的(母语) |
| 输出格式 | ||
| 纯文本 | 是的(原始数据) | 是 |
| 结构化字段(已解析) | 未提供 | 是的(页数、行数、字数) |
| 可搜索的PDF | 不支持 | 是 |
| hHOCR | 不支持 | 是 |
| 置信度评分 | 每行 | 按字、行和页 |
| 预处理 | ||
| 自动预处理 | 基本的 | 是的(智能管道) |
| 偏斜/旋转校正 | 有限的 | 是 |
| 降噪 | 有限的 | 是 |
| 对比度增强 | 有限的 | 是 |
| DPI标准化 | 未提供 | 是 |
| 集成能力 | ||
| 条形码读取 | 独立产品 | 内置 |
| 文档规范化 | 独立产品 | 不要求 |
| 基于区域的OCR | 是的(通过模板) | 是 (CropRectangle) |
| 线程安全的并行处理 | 是 | 是 |
| 平台和部署 | ||
| 视窗 | 是 | 是 |
| Linux | 是 | 是 |
| MacOS | 是 | 是 |
| 多克 | 是 | 是 |
| Azure/AWS | 是 | 是 |
| 物理隔离/离线 | 是 | 是 |
| 许可和成本 | ||
| 年度订购 | 是(联系Dynamsoft获取价格) | 可选项 |
| 永久许可证 | 不可用 | 是 ($999 一次性) |
| 一个软件包包含所有功能 | 否(3 件以上产品) | 是 |
| 免费试用 | 30天 | 是 |
专科医生与全科医生的职责范围
Dynamsoft 最重要的架构决策是打造一款专业型软件,而非通用型软件。这一决策对任何以 MRZ 或标签读取为起点,但最终需要更多功能的应用程序都具有直接影响。
Dynamsoft 方法
Dynamsoft 标签识别器只会处理其 JSON 模板中描述的内容,不会处理超出模板范围的内容。 基于 Dynamsoft 构建的护照处理应用程序需要三种产品才能处理实际的文档工作流程:
// Dynamsoft passport processing — MULTIPLE PRODUCTS REQUIRED
using Dynamsoft.DLR; // Label Recognizer — for MRZ (annual subscription)
using Dynamsoft.DBR; // Barcode Reader — for any barcodes (additional license)
// Plus: a separate OCR library — for full page text (more budget)
public class DynamsoftPassportProcessor : IDisposable
{
private readonly LabelRecognizer _mrzRecognizer;
private readonly BarcodeReader _barcodeReader;
// private readonly SomeOtherOcrLibrary _fullTextOcr; // third product
public DynamsoftPassportProcessor(
string mrzLicenseKey,
string barcodeLicenseKey)
{
// License each product independently
LabelRecognizer.InitLicense(mrzLicenseKey);
_mrzRecognizer = new LabelRecognizer();
// Configure MRZ template — JSON required before any recognition
string mrzTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""MRZ_Passport"",
""ReferenceRegionNameArray"": [""FullImage""],
""CharacterModelName"": ""MRZ""
}]
}";
_mrzRecognizer.AppendSettingsFromString(mrzTemplate);
// Second product, second license key
BarcodeReader.InitLicense(barcodeLicenseKey);
_barcodeReader = new BarcodeReader();
}
public PassportResult ProcessPassport(string imagePath)
{
// Step 1: MRZ提取 — raw text only, no field parsing
var mrzResults = _mrzRecognizer.RecognizeFile(imagePath);
var mrzText = new StringBuilder();
foreach (var r in mrzResults)
foreach (var line in r.LineResults)
mrzText.AppendLine(line.Text);
// Step 2: Parse MRZ manually — your 150-line TD3 parser here
var parsedMrz = ParseMrzManually(mrzText.ToString());
// Step 3: Barcodes — second product, second API
var barcodeResults = _barcodeReader.DecodeFile(imagePath);
// Step 4: Full page text — THIRD library, no Dynamsoft option
// var fullText = _fullTextOcr.ReadImage(imagePath);
return new PassportResult
{
ParsedMrz = parsedMrz,
Barcodes = barcodeResults.Select(b => b.BarcodeText).ToList(),
FullPageText = null // requires a fourth product
};
}
public void Dispose()
{
_mrzRecognizer?.Dispose();
_barcodeReader?.Dispose();
}
}
// Dynamsoft passport processing — MULTIPLE PRODUCTS REQUIRED
using Dynamsoft.DLR; // Label Recognizer — for MRZ (annual subscription)
using Dynamsoft.DBR; // Barcode Reader — for any barcodes (additional license)
// Plus: a separate OCR library — for full page text (more budget)
public class DynamsoftPassportProcessor : IDisposable
{
private readonly LabelRecognizer _mrzRecognizer;
private readonly BarcodeReader _barcodeReader;
// private readonly SomeOtherOcrLibrary _fullTextOcr; // third product
public DynamsoftPassportProcessor(
string mrzLicenseKey,
string barcodeLicenseKey)
{
// License each product independently
LabelRecognizer.InitLicense(mrzLicenseKey);
_mrzRecognizer = new LabelRecognizer();
// Configure MRZ template — JSON required before any recognition
string mrzTemplate = @"{
""LabelRecognizerParameterArray"": [{
""Name"": ""MRZ_Passport"",
""ReferenceRegionNameArray"": [""FullImage""],
""CharacterModelName"": ""MRZ""
}]
}";
_mrzRecognizer.AppendSettingsFromString(mrzTemplate);
// Second product, second license key
BarcodeReader.InitLicense(barcodeLicenseKey);
_barcodeReader = new BarcodeReader();
}
public PassportResult ProcessPassport(string imagePath)
{
// Step 1: MRZ提取 — raw text only, no field parsing
var mrzResults = _mrzRecognizer.RecognizeFile(imagePath);
var mrzText = new StringBuilder();
foreach (var r in mrzResults)
foreach (var line in r.LineResults)
mrzText.AppendLine(line.Text);
// Step 2: Parse MRZ manually — your 150-line TD3 parser here
var parsedMrz = ParseMrzManually(mrzText.ToString());
// Step 3: Barcodes — second product, second API
var barcodeResults = _barcodeReader.DecodeFile(imagePath);
// Step 4: Full page text — THIRD library, no Dynamsoft option
// var fullText = _fullTextOcr.ReadImage(imagePath);
return new PassportResult
{
ParsedMrz = parsedMrz,
Barcodes = barcodeResults.Select(b => b.BarcodeText).ToList(),
FullPageText = null // requires a fourth product
};
}
public void Dispose()
{
_mrzRecognizer?.Dispose();
_barcodeReader?.Dispose();
}
}
Imports Dynamsoft.DLR ' Label Recognizer — for MRZ (annual subscription)
Imports Dynamsoft.DBR ' Barcode Reader — for any barcodes (additional license)
' Plus: a separate OCR library — for full page text (more budget)
Public Class DynamsoftPassportProcessor
Implements IDisposable
Private ReadOnly _mrzRecognizer As LabelRecognizer
Private ReadOnly _barcodeReader As BarcodeReader
' Private ReadOnly _fullTextOcr As SomeOtherOcrLibrary ' third product
Public Sub New(mrzLicenseKey As String, barcodeLicenseKey As String)
' License each product independently
LabelRecognizer.InitLicense(mrzLicenseKey)
_mrzRecognizer = New LabelRecognizer()
' Configure MRZ template — JSON required before any recognition
Dim mrzTemplate As String = "{
""LabelRecognizerParameterArray"": [{
""Name"": ""MRZ_Passport"",
""ReferenceRegionNameArray"": [""FullImage""],
""CharacterModelName"": ""MRZ""
}]
}"
_mrzRecognizer.AppendSettingsFromString(mrzTemplate)
' Second product, second license key
BarcodeReader.InitLicense(barcodeLicenseKey)
_barcodeReader = New BarcodeReader()
End Sub
Public Function ProcessPassport(imagePath As String) As PassportResult
' Step 1: MRZ提取 — raw text only, no field parsing
Dim mrzResults = _mrzRecognizer.RecognizeFile(imagePath)
Dim mrzText = New StringBuilder()
For Each r In mrzResults
For Each line In r.LineResults
mrzText.AppendLine(line.Text)
Next
Next
' Step 2: Parse MRZ manually — your 150-line TD3 parser here
Dim parsedMrz = ParseMrzManually(mrzText.ToString())
' Step 3: Barcodes — second product, second API
Dim barcodeResults = _barcodeReader.DecodeFile(imagePath)
' Step 4: Full page text — THIRD library, no Dynamsoft option
' Dim fullText = _fullTextOcr.ReadImage(imagePath)
Return New PassportResult With {
.ParsedMrz = parsedMrz,
.Barcodes = barcodeResults.Select(Function(b) b.BarcodeText).ToList(),
.FullPageText = Nothing ' requires a fourth product
}
End Function
Public Sub Dispose() Implements IDisposable.Dispose
_mrzRecognizer?.Dispose()
_barcodeReader?.Dispose()
End Sub
End Class
上面的代码仍然无法处理 PDF 输入。 如果护照扫描件是 PDF 格式而不是 JPEG 格式,则需要在运行任何程序之前添加 PDF 渲染库。 实现真正的护照工作流程的全面集成:四种产品、四个许可证密钥、四个维护界面。
IronOCR方法
IronOCR能够在一个软件包中处理相同的护照工作流程——MRZ 解析、全页 OCR、条形码和 PDF 输入:
using IronOcr;
public class IronOcrPassportProcessor
{
private readonly IronTesseract _ocr;
public IronOcrPassportProcessor()
{
_ocr = new IronTesseract();
_ocr.Configuration.ReadBarCodes = true; // barcodes included
}
public CompletePassportResult ProcessPassport(string imagePath)
{
// Structured MRZ fields — no manual parsing required
var mrzData = _ocr.ReadPassport(imagePath);
// Full page OCR + barcodes in the same call
var fullResult = _ocr.Read(imagePath);
return new CompletePassportResult
{
// MRZ fields are already parsed properties
DocumentType = mrzData.DocumentType,
IssuingCountry = mrzData.IssuingCountry,
Surname = mrzData.Surname,
GivenNames = mrzData.GivenNames,
PassportNumber = mrzData.DocumentNumber,
Nationality = mrzData.Nationality,
DateOfBirth = mrzData.DateOfBirth,
ExpiryDate = mrzData.ExpiryDate,
RawMrz = mrzData.MRZ,
// Full page text from same package
FullPageText = fullResult.Text,
// Barcodes alongside text — no separate product
Barcodes = fullResult.Barcodes.Select(b => b.Value).ToList(),
Confidence = fullResult.Confidence
};
}
}
using IronOcr;
public class IronOcrPassportProcessor
{
private readonly IronTesseract _ocr;
public IronOcrPassportProcessor()
{
_ocr = new IronTesseract();
_ocr.Configuration.ReadBarCodes = true; // barcodes included
}
public CompletePassportResult ProcessPassport(string imagePath)
{
// Structured MRZ fields — no manual parsing required
var mrzData = _ocr.ReadPassport(imagePath);
// Full page OCR + barcodes in the same call
var fullResult = _ocr.Read(imagePath);
return new CompletePassportResult
{
// MRZ fields are already parsed properties
DocumentType = mrzData.DocumentType,
IssuingCountry = mrzData.IssuingCountry,
Surname = mrzData.Surname,
GivenNames = mrzData.GivenNames,
PassportNumber = mrzData.DocumentNumber,
Nationality = mrzData.Nationality,
DateOfBirth = mrzData.DateOfBirth,
ExpiryDate = mrzData.ExpiryDate,
RawMrz = mrzData.MRZ,
// Full page text from same package
FullPageText = fullResult.Text,
// Barcodes alongside text — no separate product
Barcodes = fullResult.Barcodes.Select(b => b.Value).ToList(),
Confidence = fullResult.Confidence
};
}
}
Imports IronOcr
Public Class IronOcrPassportProcessor
Private ReadOnly _ocr As IronTesseract
Public Sub New()
_ocr = New IronTesseract()
_ocr.Configuration.ReadBarCodes = True ' barcodes included
End Sub
Public Function ProcessPassport(imagePath As String) As CompletePassportResult
' Structured MRZ fields — no manual parsing required
Dim mrzData = _ocr.ReadPassport(imagePath)
' Full page OCR + barcodes in the same call
Dim fullResult = _ocr.Read(imagePath)
Return New CompletePassportResult With {
' MRZ fields are already parsed properties
.DocumentType = mrzData.DocumentType,
.IssuingCountry = mrzData.IssuingCountry,
.Surname = mrzData.Surname,
.GivenNames = mrzData.GivenNames,
.PassportNumber = mrzData.DocumentNumber,
.Nationality = mrzData.Nationality,
.DateOfBirth = mrzData.DateOfBirth,
.ExpiryDate = mrzData.ExpiryDate,
.RawMrz = mrzData.MRZ,
' Full page text from same package
.FullPageText = fullResult.Text,
' Barcodes alongside text — no separate product
.Barcodes = fullResult.Barcodes.Select(Function(b) b.Value).ToList(),
.Confidence = fullResult.Confidence
}
End Function
End Class
一个软件包,一个许可证密钥,一个API。 对于护照读取指南和条形码读取功能, IronOCR文档在同一产品上下文中涵盖了两者,因为它们是同一产品。
多产品成本和复杂性
构建仓库库存扫描仪最能清楚地说明成本模型的差异。 该系统需要读取产品标签(文本)、扫描条形码(QR/EAN)并处理附带的发货 PDF 文件。 Dynamsoft 提供的是三个独立授权的产品,每个产品都有独立的初始化模式。
Dynamsoft 方法
// Dynamsoft warehouse scanner — THREE products, THREE license keys
using Dynamsoft.DLR; // Label Recognizer — product labels
using Dynamsoft.DBR; // Barcode Reader — product barcodes
using Dynamsoft.DDN; // Document Normalizer — document edge detection
public class DynamsoftWarehouseScanner : IDisposable
{
private readonly LabelRecognizer _labelRecognizer;
private readonly BarcodeReader _barcodeReader;
private readonly DocumentNormalizer _documentNormalizer;
public DynamsoftWarehouseScanner(
string labelLicenseKey,
string barcodeLicenseKey,
string documentLicenseKey)
{
LabelRecognizer.InitLicense(labelLicenseKey);
_labelRecognizer = new LabelRecognizer();
BarcodeReader.InitLicense(barcodeLicenseKey);
_barcodeReader = new BarcodeReader();
DocumentNormalizer.InitLicense(documentLicenseKey);
_documentNormalizer = new DocumentNormalizer();
}
public WarehouseItemResult ScanItem(string imagePath)
{
// Three separate API calls, three result types to aggregate manually
var labelResults = _labelRecognizer.RecognizeFile(imagePath);
var barcodeResults = _barcodeReader.DecodeFile(imagePath);
var docResults = _documentNormalizer.Normalize(imagePath);
// Merge three result sets into one model — your code
return AggregateResults(labelResults, barcodeResults, docResults);
}
public void Dispose()
{
_labelRecognizer?.Dispose();
_barcodeReader?.Dispose();
_documentNormalizer?.Dispose();
}
}
// Dynamsoft warehouse scanner — THREE products, THREE license keys
using Dynamsoft.DLR; // Label Recognizer — product labels
using Dynamsoft.DBR; // Barcode Reader — product barcodes
using Dynamsoft.DDN; // Document Normalizer — document edge detection
public class DynamsoftWarehouseScanner : IDisposable
{
private readonly LabelRecognizer _labelRecognizer;
private readonly BarcodeReader _barcodeReader;
private readonly DocumentNormalizer _documentNormalizer;
public DynamsoftWarehouseScanner(
string labelLicenseKey,
string barcodeLicenseKey,
string documentLicenseKey)
{
LabelRecognizer.InitLicense(labelLicenseKey);
_labelRecognizer = new LabelRecognizer();
BarcodeReader.InitLicense(barcodeLicenseKey);
_barcodeReader = new BarcodeReader();
DocumentNormalizer.InitLicense(documentLicenseKey);
_documentNormalizer = new DocumentNormalizer();
}
public WarehouseItemResult ScanItem(string imagePath)
{
// Three separate API calls, three result types to aggregate manually
var labelResults = _labelRecognizer.RecognizeFile(imagePath);
var barcodeResults = _barcodeReader.DecodeFile(imagePath);
var docResults = _documentNormalizer.Normalize(imagePath);
// Merge three result sets into one model — your code
return AggregateResults(labelResults, barcodeResults, docResults);
}
public void Dispose()
{
_labelRecognizer?.Dispose();
_barcodeReader?.Dispose();
_documentNormalizer?.Dispose();
}
}
Imports Dynamsoft.DLR ' Label Recognizer — product labels
Imports Dynamsoft.DBR ' Barcode Reader — product barcodes
Imports Dynamsoft.DDN ' Document Normalizer — document edge detection
Public Class DynamsoftWarehouseScanner
Implements IDisposable
Private ReadOnly _labelRecognizer As LabelRecognizer
Private ReadOnly _barcodeReader As BarcodeReader
Private ReadOnly _documentNormalizer As DocumentNormalizer
Public Sub New(labelLicenseKey As String, barcodeLicenseKey As String, documentLicenseKey As String)
LabelRecognizer.InitLicense(labelLicenseKey)
_labelRecognizer = New LabelRecognizer()
BarcodeReader.InitLicense(barcodeLicenseKey)
_barcodeReader = New BarcodeReader()
DocumentNormalizer.InitLicense(documentLicenseKey)
_documentNormalizer = New DocumentNormalizer()
End Sub
Public Function ScanItem(imagePath As String) As WarehouseItemResult
' Three separate API calls, three result types to aggregate manually
Dim labelResults = _labelRecognizer.RecognizeFile(imagePath)
Dim barcodeResults = _barcodeReader.DecodeFile(imagePath)
Dim docResults = _documentNormalizer.Normalize(imagePath)
' Merge three result sets into one model — your code
Return AggregateResults(labelResults, barcodeResults, docResults)
End Function
Public Sub Dispose() Implements IDisposable.Dispose
_labelRecognizer?.Dispose()
_barcodeReader?.Dispose()
_documentNormalizer?.Dispose()
End Sub
End Class
发货 PDF 仍然需要第四款产品——Dynamsoft 没有原生 PDF OCR。 三款 Dynamsoft 产品的年度许可(按服务器级别):5,997 美元/年起。 添加一个 PDF 库,在编写任何业务逻辑代码之前,每年的费用就会超过 6300 美元。
IronOCR方法
using IronOcr;
public class IronOcrWarehouseScanner
{
private readonly IronTesseract _ocr;
public IronOcrWarehouseScanner()
{
_ocr = new IronTesseract();
_ocr.Configuration.ReadBarCodes = true; // barcodes in same pass
}
public WarehouseItemResult ScanItem(string imagePath)
{
// One call: text + barcodes + structured word positions
var result = _ocr.Read(imagePath);
return new WarehouseItemResult
{
AllText = result.Text,
Barcodes = result.Barcodes.Select(b => new BarcodeInfo
{ Format = b.Format.ToString(), Value = b.Value }).ToList(),
Confidence = result.Confidence
};
}
public string ScanLabelRegion(string imagePath, int x, int y, int width, int height)
{
// Target a specific label area — no template JSON required
var region = new CropRectangle(x, y, width, height);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
input.Deskew();
input.Contrast();
return _ocr.Read(input).Text;
}
public string ProcessShipmentPdf(string pdfPath)
{
// Native PDF — no external library, no page conversion loop
return _ocr.Read(pdfPath).Text;
}
}
using IronOcr;
public class IronOcrWarehouseScanner
{
private readonly IronTesseract _ocr;
public IronOcrWarehouseScanner()
{
_ocr = new IronTesseract();
_ocr.Configuration.ReadBarCodes = true; // barcodes in same pass
}
public WarehouseItemResult ScanItem(string imagePath)
{
// One call: text + barcodes + structured word positions
var result = _ocr.Read(imagePath);
return new WarehouseItemResult
{
AllText = result.Text,
Barcodes = result.Barcodes.Select(b => new BarcodeInfo
{ Format = b.Format.ToString(), Value = b.Value }).ToList(),
Confidence = result.Confidence
};
}
public string ScanLabelRegion(string imagePath, int x, int y, int width, int height)
{
// Target a specific label area — no template JSON required
var region = new CropRectangle(x, y, width, height);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
input.Deskew();
input.Contrast();
return _ocr.Read(input).Text;
}
public string ProcessShipmentPdf(string pdfPath)
{
// Native PDF — no external library, no page conversion loop
return _ocr.Read(pdfPath).Text;
}
}
Imports IronOcr
Public Class IronOcrWarehouseScanner
Private ReadOnly _ocr As IronTesseract
Public Sub New()
_ocr = New IronTesseract()
_ocr.Configuration.ReadBarCodes = True ' barcodes in same pass
End Sub
Public Function ScanItem(imagePath As String) As WarehouseItemResult
' One call: text + barcodes + structured word positions
Dim result = _ocr.Read(imagePath)
Return New WarehouseItemResult With {
.AllText = result.Text,
.Barcodes = result.Barcodes.Select(Function(b) New BarcodeInfo With {
.Format = b.Format.ToString(),
.Value = b.Value
}).ToList(),
.Confidence = result.Confidence
}
End Function
Public Function ScanLabelRegion(imagePath As String, x As Integer, y As Integer, width As Integer, height As Integer) As String
' Target a specific label area — no template JSON required
Dim region = New CropRectangle(x, y, width, height)
Using input As New OcrInput()
input.LoadImage(imagePath, region)
input.Deskew()
input.Contrast()
Return _ocr.Read(input).Text
End Using
End Function
Public Function ProcessShipmentPdf(pdfPath As String) As String
' Native PDF — no external library, no page conversion loop
Return _ocr.Read(pdfPath).Text
End Function
End Class
对于基于区域的 OCR 文档和PDF 输入指南, IronOCR无需任何其他产品即可涵盖两者。
部署模型
这两个图书馆都采用本地部署模式,不通过云端传输文档数据。 部署方面的主要区别在于初始化模式、配置文件管理以及每个库在其部署工件中捆绑的内容。
Dynamsoft 方法
Dynamsoft 要求在创建任何实例之前,对 SDK 类进行静态初始化调用。 每个产品都有自己的初始化模式,许可证密钥只能激活该特定产品。 模板配置文件——用于 MRZ、VIN 或自定义标签模式的 JSON 设置文档——必须存在并在运行时正确引用。一个包含标签识别器和条码读取器的部署管理两种激活流程、两组模板和两条 Dispose 链。
对于仓库或自助服务终端部署,配置文件依赖项除了二进制文件之外,还会添加一个部署工件。 JSON 模板是单独的文件,没有编译到软件包中。 在新服务器上错误配置模板路径,识别结果将静默返回空结果或在运行时的 AppendSettingsFromString 调用时报错。
IronOCR方法
IronOCR以单个NuGet包的形式部署。 许可证激活只需一行字符串赋值:
// Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
' Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
没有模板文件。 不支持原生二进制管理。 没有tessdata文件夹。 Docker 部署指南 仅需在Linux上 libgdiplus——在 Dockerfile 中一行 apt-get install。
FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN apt-get update && apt-get install -y libgdiplus
COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]
同一个软件包无需针对特定平台进行配置,即可支持Linux 、 AWS Lambda和Azure 应用服务。 对于运行 CI/CD 流水线的团队来说,没有模板文件可以单独进行版本控制或工件部署。
API 映射参考
| Dynamsoft 标签识别器 | IronOCR当量 |
|---|---|
LabelRecognizer.InitLicense(key) |
IronOcr.License.LicenseKey = key |
new LabelRecognizer() |
new IronTesseract() |
_recognizer.AppendSettingsFromString(json) |
无需设置——发动机自动配置 |
_recognizer.RecognizeFile(path) |
ocr.Read(path) |
_recognizer.RecognizeByFile(path, "") |
ocr.Read(path) |
result.LineResults[i].Text |
result.Lines[i].Text |
| 手动 TD3 MRZ 解析器(150 多行) | ocr.ReadPassport(path).Surname 等。 |
BarcodeReader.InitLicense(key) (单独的产品) |
ocr.Configuration.ReadBarCodes = true |
_barcodeReader.DecodeFile(path) |
result.Barcodes (与 OCR 相同的调用) |
barcode.BarcodeFormatString |
barcode.Format.ToString() |
barcode.BarcodeText |
barcode.Value |
DocumentNormalizer.InitLicense(key) (单独的产品) |
不要求 |
| 不支持 PDF | ocr.Read("document.pdf") |
| 没有可搜索的 PDF 输出 | result.SaveAsSearchablePdf(path) |
recognizer.Dispose() |
using var ocr = new IronTesseract() |
当团队考虑从 Dynamsoft 迁移到IronOCR时
应用范围扩展到 MRZ 或标签之外
大多数数据迁移都发生在项目初期目标明确(例如"仅读取护照MRZ"),但随后产品需求出现变化的情况下。客户希望将扫描的护照存档为可搜索的PDF文件。 合规团队希望对签证章进行光学字符识别(OCR)。 支持队列中存在一些关于 Dynamsoft 无法识别 PDF 文件的工单。目前,团队正在维护 Dynamsoft 的 MRZ 功能,Plus着一个用于识别其他所有类型文件的 OCR 库。 同一个代码库中包含两份许可协议、两种维护方案和两种 API 模式。IronOCR通过 ReadPassport() 处理原始 MRZ 需求,并通过相同的 IronTesseract 实例处理扩展需求。 从双库系统迁移到单包系统的团队通常会报告集成层代码减少了 30-40%。
年度订阅费用不可持续
多产品Dynamsoft许可费用逐年增加——联系Dynamsoft获取最新价格。 多年后,多种产品的年费合计可能远远超过IronOCR的 $999 一次性费用。永久许可模式对具有明确商业生命周期的产品最为重要——一个将运行七年的政府文件处理系统不希望在核心组件上依赖于专家供应商的年度续订。
需要输入PDF文件
Dynamsoft Label Recognizer 本身不支持 PDF 文件。 每个以 PDF 形式交付的文档都需要一个预处理步骤:将每一页渲染成图像,将图像传递给 Dynamsoft,收集并重新组装结果。 如果需要将识别结果与原始 PDF 几何图形关联起来,该流程会增加 PDF 渲染依赖性、页面迭代循环和坐标映射问题。IronOCR原生读取 PDF——ocr.Read("passport-scans.pdf") 处理每一页,result.Pages 给予您每页访问文本、单词和置信度分数的权限。 对于 20% 或以上的输入内容以 PDF 格式到达的团队来说,每次 PDF 渲染库更新时,Dynamsoft 的解决方法都会增加大量的维护负担。
多产品整合税过高
每个额外的 Dynamsoft 产品都是一个单独的静态初始化调用,一个单独的 Dispose 链,以及一个需要管理的单独的 JSON 配置文件。 已经集成了三个 Dynamsoft 产品的团队表示,集成界面是主要的维护成本,而不是识别质量。 许可证密钥轮换、SDK 版本升级和模板文件部署必须在所有三个产品中同时协调进行。IronOCR的单一软件包模型意味着无论应用程序使用多少 OCR 功能,都只需升级一个版本、轮换一个许可证密钥和维护一个 API 接口。
需要国际文件类型
Dynamsoft 标签识别器基于 ICAO Doc 9303 规定的拉丁字符 MRZ 格式构建。处理 CJK 语言身份证件、阿拉伯语护照或多语言货运标签的应用程序很快就会达到语言覆盖范围的限制。 IronOCR提供 125 多个语言包,以单独的NuGet包形式提供——包括阿拉伯语、简体中文、繁体中文、日语、韩语等。 每个通过 dotnet add package IronOcr.Languages.Arabic 安装,而不改变识别代码。 多语言指南介绍了如何通过几行配置实现同时识别多种语言。
常见迁移注意事项
替换 MRZ 解析器
最直接的迁移步骤是用 ReadPassport 替换 Dynamsoft RecognizeFile + 手动 TD3 解析器组合。 Dynamsoft 提取路径返回原始文本类似 P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<< 需要超过 150 行处理 TD3 格式的字符偏移解析。 IronOCR的替代品:
// Before: Dynamsoft raw extraction + manual 150-line parser
var results = _recognizer.RecognizeFile(imagePath);
var rawMrz = string.Join("\n", results.SelectMany(r => r.LineResults).Select(l => l.Text));
var parsed = MyTd3Parser.Parse(rawMrz); // delete this file
// After:IronOCRparsed output directly
var passportData = new IronTesseract().ReadPassport(imagePath);
string surname = passportData.Surname;
string docNum = passportData.DocumentNumber;
DateTime? dob = passportData.DateOfBirth;
// Before: Dynamsoft raw extraction + manual 150-line parser
var results = _recognizer.RecognizeFile(imagePath);
var rawMrz = string.Join("\n", results.SelectMany(r => r.LineResults).Select(l => l.Text));
var parsed = MyTd3Parser.Parse(rawMrz); // delete this file
// After:IronOCRparsed output directly
var passportData = new IronTesseract().ReadPassport(imagePath);
string surname = passportData.Surname;
string docNum = passportData.DocumentNumber;
DateTime? dob = passportData.DateOfBirth;
Imports System
Imports System.Linq
' Before: Dynamsoft raw extraction + manual 150-line parser
Dim results = _recognizer.RecognizeFile(imagePath)
Dim rawMrz = String.Join(vbCrLf, results.SelectMany(Function(r) r.LineResults).Select(Function(l) l.Text))
Dim parsed = MyTd3Parser.Parse(rawMrz) ' delete this file
' After: IronOCR parsed output directly
Dim passportData = New IronTesseract().ReadPassport(imagePath)
Dim surname As String = passportData.Surname
Dim docNum As String = passportData.DocumentNumber
Dim dob As DateTime? = passportData.DateOfBirth
手动解析器已完全删除。 TD1(身份证)、TD2(签证)和 TD3(护照)格式检测在 ReadPassport 内是自动的。 护照阅读指南文件记录了所有返回的字段。
整合多产品初始化
Dynamsoft 多产品应用程序在启动时进行多次静态 InitLicense 调用,每个调用都需要自己的密钥。 将这些合并为一个IronOCR许可证,并删除每个产品的初始化块:
// Before: three static initializations
LabelRecognizer.InitLicense(mrzKey);
BarcodeReader.InitLicense(barcodeKey);
DocumentNormalizer.InitLicense(documentKey);
// After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true; // barcodes included automatically
// Before: three static initializations
LabelRecognizer.InitLicense(mrzKey);
BarcodeReader.InitLicense(barcodeKey);
DocumentNormalizer.InitLicense(documentKey);
// After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true; // barcodes included automatically
Imports System
' Before: three static initializations
LabelRecognizer.InitLicense(mrzKey)
BarcodeReader.InitLicense(barcodeKey)
DocumentNormalizer.InitLicense(documentKey)
' After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
Dim ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True ' barcodes included automatically
服务类中现有的 Dynamsoft Dispose 调用应被标准 using 块替换,用在 IronTesseract 实例上,或者在 DI 容器中注册一个单次重用的实例。 IronTesseract 设置指南涵盖了这两种模式。
添加 PDF 支持
团队在迁移过程中最常获得的新功能是原生 PDF 输入——这是 Dynamsoft 从未提供过的功能。 移除 PDF 到图像的转换循环后,原生 PDF 读取除了输入路径之外,无需进行任何代码更改:
// Before: PDF rendering loop (50+ lines with external library)
var pdfDoc = PdfDocument.Load(pdfPath);
foreach (var page in pdfDoc.Pages)
{
var bitmap = page.RenderAsBitmap(150);
var results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap));
// aggregate...
}
// After: native PDF — no loop, no external library
var result = new IronTesseract().Read(pdfPath);
string fullText = result.Text;
result.SaveAsSearchablePdf("searchable-output.pdf");
// Before: PDF rendering loop (50+ lines with external library)
var pdfDoc = PdfDocument.Load(pdfPath);
foreach (var page in pdfDoc.Pages)
{
var bitmap = page.RenderAsBitmap(150);
var results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap));
// aggregate...
}
// After: native PDF — no loop, no external library
var result = new IronTesseract().Read(pdfPath);
string fullText = result.Text;
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr
' Before: PDF rendering loop (50+ lines with external library)
Dim pdfDoc = PdfDocument.Load(pdfPath)
For Each page In pdfDoc.Pages
Dim bitmap = page.RenderAsBitmap(150)
Dim results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap))
' aggregate...
Next
' After: native PDF — no loop, no external library
Dim result = New IronTesseract().Read(pdfPath)
Dim fullText As String = result.Text
result.SaveAsSearchablePdf("searchable-output.pdf")
对于需要从扫描输入中生成可搜索 PDF 存档的团队,SaveAsSearchablePdf 是一个方法调用。 这份可搜索的 PDF 操作指南详细介绍了输出选项。
工业标签质量预处理
Dynamsoft 的模板引擎针对受控标签条件进行了优化。 对于图像质量下降的情况——例如标签磨损、包装对比度低、工业扫描图像倾斜——IronOCR 的预处理流程可以弥补这一不足。图像质量校正指南涵盖了每个滤镜的使用方法。 对于特定于标签的工作流,Deskew 和 Contrast 是最有用的:
using var input = new OcrInput();
input.LoadImage(labelImagePath);
input.Deskew(); // correct rotation from handheld scanner
input.Contrast(); // recover faded label text
input.DeNoise(); // remove packaging texture interference
var labelText = new IronTesseract().Read(input).Text;
Console.WriteLine($"Confidence: {new IronTesseract().Read(input).Confidence}%");
using var input = new OcrInput();
input.LoadImage(labelImagePath);
input.Deskew(); // correct rotation from handheld scanner
input.Contrast(); // recover faded label text
input.DeNoise(); // remove packaging texture interference
var labelText = new IronTesseract().Read(input).Text;
Console.WriteLine($"Confidence: {new IronTesseract().Read(input).Confidence}%");
Imports IronOcr
Using input As New OcrInput()
input.LoadImage(labelImagePath)
input.Deskew() ' correct rotation from handheld scanner
input.Contrast() ' recover faded label text
input.DeNoise() ' remove packaging texture interference
Dim labelText = New IronTesseract().Read(input).Text
Console.WriteLine($"Confidence: {New IronTesseract().Read(input).Confidence}%")
End Using
其他IronOCR功能
以上章节未涵盖但团队在迁移后经常使用的功能:
-手写识别:能够处理手写笔记和注释以及印刷文本——这是 Dynamsoft 不具备的功能。 -扫描文档处理:多页扫描PDF文件,每页自动预处理 -表格数据提取:从发票、清单和数据表中检测并提取表格数据
.NET兼容性和未来准备情况
IronOCR以.NET 8 和.NET 9 为主要支持的运行时环境,并完全向后兼容.NET Framework 4.6.2 和.NET Core 3.1。该库以单个NuGet包的形式发布,可通过 NuGet 的运行时标识符图自动解析适用于视窗x64、Windows x86、Linux x64、macOS x64 和MacOSARM 的正确平台二进制文件——无需条件包引用,也无需特定于平台的项目文件。 Dynamsoft 标签识别器 同样支持现代.NET运行时,但其多产品模式意味着每个产品的.NET兼容性都必须单独验证和更新。IronOCR积极的开发节奏保证了NuGet包的更新与每个.NET发布周期保持一致,而单包模型意味着预计在 2026 年底推出的.NET 10 兼容性将统一应用于所有功能,而无需针对每个产品进行跟踪。
结论
Dynamsoft 标签识别器是一款技术强大的专业工具。对于仅处理护照 MRZ 的自助服务终端,或仅读取车辆识别码 (VIN) 的装配线工作站,其基于模板的识别引擎能够可靠地完成特定任务。 问题在于,实际应用很少会局限于特定领域。 护照需要进行全页数据识别。 发货标签以PDF格式发送。 库存系统需要在同一次扫描中同时输入条形码和文本。 每次扩展范围都会触发另一个 Dynamsoft 产品、另一个年度许可证和另一个需要维护的 API 接口。
成本模型使这一点变得具体。 使用Dynamsoft年度订阅模型的开发团队,MRZ加条码读取的多年总费用显著上升。IronOCR覆盖了这两种功能——以及原生 PDF、可搜索的 PDF 输出、完整文档 OCR、125+ 种语言和预处理——以 $999 一次性价格。迁移本身主要是机械性操作:用 ocr.Read 替换 RecognizeFile,删除手动 TD3 MRZ 解析器,启用 ReadBarCodes = true,并移除外部 PDF 渲染循环。
架构上的差异不仅仅体现在成本上。Dynamsoft 的设计理念迫使团队从产品而非功能的角度思考问题——在编写任何代码之前,都要先问自己"哪个 Dynamsoft 产品可以处理这个问题?"IronOCR的设计则相反:无论文档包含什么内容,都只有一个实例、一个配置、一个结果对象。 随着项目需求的增长,这种差异会在项目生命周期内不断扩大。
对于需要 MRZ 识别、条形码读取、通用文档 OCR 或 PDF 处理的全新应用程序的团队而言,IronOCR 的一体化模型从一开始就消除了多产品协调问题。 对于目前运行多个 Dynamsoft 产品以及独立 OCR 库的团队,迁移路径会将这些接口整合到一个单一的依赖项中。 IronOCR文档中心涵盖了这里讨论的所有功能,并提供了可运行的代码示例和部署指南。
常见问题解答
Dynamsoft OCR SDK是什么?
Dynamsoft OCR SDK 是一款 OCR 解决方案,开发者和企业可使用它从图像和文档中提取文本。它是与 IronOCR 一起评估的几种适用于 .NET 应用程序开发的 OCR 方案之一。
IronOCR 与 Dynamsoft OCR SDK 适用于 .NET developers 相比如何?
IronOCR 是一个基于 NuGet 的 .NET OCR 库,它使用 IronTesseract 作为核心引擎。与 Dynamsoft OCR SDK 相比,它提供更简单的部署方式(无需 SDK 安装程序)、统一的定价模式以及简洁的 C# API,无需 COM 互操作或云依赖。
IronOCR 比 Dynamsoft OCR SDK 更容易设置吗?
IronOCR 通过单个 NuGet 包进行安装。无需 SDK 安装程序、复制许可证文件、注册 COM 组件或管理单独的运行时二进制文件。整个 OCR 引擎都打包在包中。
Dynamsoft OCR SDK 和 IronOCR 在准确率方面存在哪些差异?
IronOCR 对标准商务文档、发票、收据和扫描表格的识别准确率很高。对于严重损坏的文档或不常见的文字,识别准确率会因源文件质量而异。IronOCR 包含图像预处理滤镜,可提高低质量输入文件的识别率。
IronOCR是否支持PDF文本提取?
是的。IronOCR只需一次调用即可从原生PDF和扫描的PDF图像中提取文本。它还支持多页TIFF文件、图像和流。对于扫描的PDF,OCR逐页进行处理,并为每个页面生成一个结果对象。
Dynamsoft OCR SDK 的许可方式与 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 安装程序。
与 Dynamsoft OCR 不同,IronOCR 是否适用于 Docker 和容器化部署?
是的。IronOCR 通过 NuGet 包在 Docker 容器中运行。许可证密钥通过环境变量设置。OCR 引擎本身不需要任何许可证文件、SDK 路径或卷挂载。
我可以在购买前试用 IronOCR,并将其与 Dynamsoft OCR 进行比较吗?
是的。IronOCR 试用模式可以处理文档,并在输出结果上添加水印,从而生成 OCR 结果。您可以在购买许可证之前,先在自己的文档上验证其准确性。
IronOCR是否支持条形码读取和文本提取?
IronOCR专注于文本提取和OCR识别。对于条形码读取,Iron Software提供了配套库IronBarcode。两者都可单独购买,也可作为Iron Suite套装的一部分购买。
从 Dynamsoft OCR SDK 迁移到 IronOCR 容易吗?
从 Dynamsoft OCR SDK 迁移到 IronOCR 通常涉及将初始化序列替换为 IronTesseract 实例化、移除 COM 生命周期管理以及更新 API 调用。大多数迁移都能显著降低代码复杂度。

