跳至页脚内容
与其他组件比较

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)配置识别任务,随后可以针对图像文件调用 RecognizeFileRecognizeByFile。 结果以包含原始文本字符串的行结果集合的形式返回。 将这些字符串解析成有意义的结构化数据——字段偏移量、日期转换、校验位验证——完全由您负责。

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
$vbLabelText   $csharpLabel

RecognizeFile 的输出是原始的 MRZ 文本,例如 P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<<。 要获取 DateOfBirthExpiryDate 作为类型化的属性,您需要自己实现一个 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
$vbLabelText   $csharpLabel

上面的代码仍然无法处理 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
$vbLabelText   $csharpLabel

一个软件包,一个许可证密钥,一个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
$vbLabelText   $csharpLabel

发货 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
$vbLabelText   $csharpLabel

对于基于区域的 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")
$vbLabelText   $csharpLabel

没有模板文件。 不支持原生二进制管理。 没有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"]

同一个软件包无需针对特定平台进行配置,即可支持LinuxAWS LambdaAzure 应用服务。 对于运行 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
$vbLabelText   $csharpLabel

手动解析器已完全删除。 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
$vbLabelText   $csharpLabel

服务类中现有的 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")
$vbLabelText   $csharpLabel

对于需要从扫描输入中生成可搜索 PDF 存档的团队,SaveAsSearchablePdf 是一个方法调用。 这份可搜索的 PDF 操作指南详细介绍了输出选项。

工业标签质量预处理

Dynamsoft 的模板引擎针对受控标签条件进行了优化。 对于图像质量下降的情况——例如标签磨损、包装对比度低、工业扫描图像倾斜——IronOCR 的预处理流程可以弥补这一不足。图像质量校正指南涵盖了每个滤镜的使用方法。 对于特定于标签的工作流,DeskewContrast 是最有用的:

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
$vbLabelText   $csharpLabel

其他IronOCR功能

以上章节未涵盖但团队在迁移后经常使用的功能:

-手写识别能够处理手写笔记和注释以及印刷文本——这是 Dynamsoft 不具备的功能。 -扫描文档处理多页扫描PDF文件,每页自动预处理 -表格数据提取从发票、清单和数据表中检测并提取表格数据

  • hOCR 导出将识别结果导出为 HTML 格式,并包含边界框坐标,以便进行后续布局分析。 -异步 OCR适用于ASP.NET和高吞吐量服务器应用程序的非阻塞识别 -进度跟踪监控多页面批处理作业的进度回调
  • 125+ 种语言索引支持的语言NuGet包的完整列表,包括非拉丁文字
  • MICR/支票读取磁墨字符识别技术用于金融文件处理——另一个专业应用案例,所有功能均集成在一个软件包中。 -每个词的置信度得分用于自动化文档审查流程的细粒度质量信号

.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和Tesseract是其各自所有者的注册商标。 此网站与Dynamsoft或Google没有关联,也未获得支持或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

常见问题解答

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 调用。大多数迁移都能显著降低代码复杂度。

Kannaopat Udonpant
软件工程师
在成为软件工程师之前,Kannapat 在日本北海道大学完成了环境资源博士学位。在攻读学位期间,Kannapat 还成为了车辆机器人实验室的成员,隶属于生物生产工程系。2022 年,他利用自己的 C# 技能加入 Iron Software 的工程团队,专注于 IronPDF。Kannapat 珍视他的工作,因为他可以直接从编写大多数 IronPDF 代码的开发者那里学习。除了同行学习外,Kannapat 还喜欢在 Iron Software 工作的社交方面。不撰写代码或文档时,Kannapat 通常可以在他的 PS5 上玩游戏或重温《最后生还者》。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我