AWS対Google Vision(OCR機能の比較)
Dynamsoft Label Recognizerは、パスポートからのMRZ抽出、車両からのVINスキャン、工業用パッケージからの構造化ラベル読み取りという、極めて優れた機能を持つ1つのことだけを行い、それ以外のことは一切行わない。 その狭い専門知識は、アプリケーションに汎用的な文書OCR機能が必要になった途端、予算上の問題へと変わります。なぜなら、MRZ用のDynamsoft Label Recognizer、QRコード用のDynamsoft Barcode Reader、エッジ検出用のDynamsoft Document Normalizerのライセンスを取得する必要があり、さらにページ全体の文書を処理するための4つ目のライブラリを探し続けなければならないからです。 IronOCRはそれらの機能をすべて単一のNuGetパッケージで$999永続的にカバーします。
Dynamsoft Label Recognizerについて
カナダのバンクーバーに本社を置くDynamsoft Corporationは、ラベル認識製品を"制約のあるフォーマットで機械可読な構造化テキストを確実に認識する"という特定のコンセプトに基づいて開発した。 製品のNuGetパッケージはDynamsoft.DotNet.LabelRecognizerであり、その商用ライセンスは年会費制でのみ運用されており、永続オプションはありません。 現在の価格はDynamsoftにお問い合わせください。
このライブラリの認識モデルはテンプレート駆動型です。 JSON設定API(RecognizeByFileを呼び出します。 結果は、生のテキスト文字列を含む行結果の集合として返されます。 それらの文字列を意味のある構造化データに解析する(フィールドオフセット、日付変換、チェックデジット検証など)のは、すべてあなたの責任です。
Dynamsoft Label Recognizerの主なアーキテクチャ特性:
-テンプレートベースの認識エンジン: MRZ、VIN、およびラベルパターンは、認識前にJSONテンプレートの設定が必要です。
- 生テキスト出力のみ:
LineResultオブジェクトを返します; 構造化フィールドの解析なし -画像のみの入力:ネイティブのPDFサポートはありません。 PDFファイルは処理前に外部で画像に変換する必要があります。 - 年間サブスクリプションライセンス: デバイスごとおよびサーバーごとのティアが利用可能です; 現在の価格はDynamsoftにお問い合わせください; no one-time purchase -機能ごとに個別の製品:バーコード読み取り、文書正規化、カメラ最適化にはそれぞれ個別のライセンス製品が必要です -対応言語が限定的:ラテン文字のMRZ形式に特化。 幅広い多言語ドキュメントのサポートが必要
JSONランタイム設定API
Dynamsoft Label Recognizerのすべてのワークフローは、テンプレート構成ステップから始まります。たとえば、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
P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<<のような生のMRZテキストです。 ExpiryDateを型付プロパティとして取得するには、TD1/TD2/TD3パーサーを自分で実装します。 このリポジトリのDynamsoftドキュメントとソースファイルは、そのパーサーを約150行のパースコードと見積もっています — 文字オフセット、<<名前セパレータ、二桁の年の曖昧さ回避、およびチェックディジットの検証を処理 — いずれもDynamsoftは提供していません。
IronOCRを理解する
IronOCRは、最適化されたTesseract 5エンジンをベースに構築された商用.NET OCRライブラリであり、前処理、入力フォーマット、構造化出力、および特殊なドキュメント解析を処理するマネージドAPIレイヤーを備えています。 インストールは単一のNuGetコマンドです: dotnet add package IronOcr。 ネイティブなバイナリ管理機能はなく、tessdataフォルダの設定も不要で、テンプレート設定ファイルもありません。
主な特徴:
-汎用および専門用途:全ページ文書のOCR、複数ページPDF、スキャン画像のバッチ処理、および特殊フォーマット(パスポート、バーコード、ナンバープレート)を同一パッケージで処理します。 -自動前処理パイプライン:デスク調整、ノイズ除去、コントラスト調整、二値化、解像度向上は、低品質の入力に対して手動設定なしで実行されます。 -ネイティブ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 | サポートされていません | はい |
| hOCR | サポートされていません | はい |
| 信頼度スコア | 行ごと | 単語ごと、行ごと、ページごと |
| 前処理 | ||
| 自動前処理 | 基本 | はい(インテリジェントパイプライン) |
| 傾き/回転補正 | 制限的 | はい |
| ノイズ除去 | 制限的 | はい |
| コントラスト強調 | 制限的 | はい |
| DPI正規化 | 提供されていません | はい |
| 統合機能 | ||
| バーコード読み取り | 別製品 | 内蔵 |
| 文書の正規化 | 別製品 | 不要 |
| 地域ベースのOCR | はい(テンプレート経由) | はい (CropRectangle) |
| スレッドセーフな並列処理 | はい | はい |
| プラットフォームと展開 | ||
| ウィンドウズ | はい | はい |
| Linux | はい | はい |
| macOS | はい | はい |
| Docker | はい | はい |
| Azure / AWS | はい | はい |
| エアギャップ/オフライン | はい | はい |
| ライセンスと費用 | ||
| 年間サブスクリプション | はい (価格についてはDynamsoftにお問い合わせください) | オプション |
| 永久ライセンス | 不可 | はい ($999 一度きり) |
| すべての機能を1つのパッケージで提供 | いいえ(3個以上の商品) | はい |
| 無料トライアル | 30日間 | はい |
スペシャリストとジェネラリストの業務範囲
Dynamsoftが下した最も重要な設計上の決定は、汎用型ではなく専門型の開発を目指したことだ。この決定は、MRZやラベル読み取りから始まり、最終的にそれ以上の機能を必要とするあらゆるアプリケーションに直接的な影響を与える。
Dynamsoftのアプローチ
Dynamsoft Label Recognizerは、JSONテンプレートに記述されている内容のみを処理し、それ以外の処理は一切行いません。 Dynamsoftを基盤としたパスポート処理アプリケーションが、実際の文書ワークフローを処理するには、以下の3つの製品が必要です。
// 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入力はまだ処理できません。 パスポートのスキャンデータがJPEGではなくPDF形式で届いた場合は、これらの処理を実行する前にPDFレンダリングライブラリを追加する必要があります。 実際のパスポートワークフローのための完全な統合:4つの製品、4つのライセンスキー、4つのメンテナンス画面。
IronOCRのアプローチ
IronOCRは、MRZ解析、ページ全体のOCR処理、バーコード処理、PDF入力といったパスポート関連のワークフローを、すべて1つのパッケージで処理します。
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
パッケージは1つ、ライセンスキーも1つ、APIも1つ。 パスポート読み取りガイドとバーコード読み取り機能については、 IronOCRのドキュメントで両方とも同じ製品コンテキストで説明されています。これは、これらが同一製品であるためです。
複数製品のコストと複雑性
倉庫在庫スキャナーを構築することは、コストモデルの相違を最も明確に示す事例となる。 システムは、製品ラベル(テキスト)を読み取り、バーコード(QR/EAN)をスキャンし、添付された出荷PDFを処理する必要があります。 Dynamsoftの場合、それはそれぞれ独立したライセンスを持つ3つの製品であり、それぞれ異なる初期化パターンが用いられます。
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には依然として4つ目の製品が必要となる。DynamsoftにはネイティブのPDF OCR機能がないからだ。 Dynamsoft製品3種類の年間ライセンス料(サーバー単位):年間5,997ドル以上。 PDFライブラリを追加すると、ビジネスロジックを一行も記述する前から年間6,300ドル以上かかることになる。
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設定文書 — は実行時に存在し、正しく参照されている必要があります。Label RecognizerおよびBarcode Readerを含むデプロイメントは、2つのアクティベーションフロー、2つのテンプレートセット、および2つのDisposeチェーンを管理します。
倉庫やキオスクへの展開の場合、構成ファイルの依存関係により、バイナリファイルに加えて展開アーティファクトが追加されます。 JSONテンプレートは別ファイルであり、パッケージにはコンパイルされません。 新しいサーバーでテンプレートパスを誤設定すると、認識は静かに空の結果を返すか、実行時にAppendSettingsFromStringコール中にスローされます。
IronOCRのアプローチ
IronOCRは単一のNuGetパッケージとしてデプロイされます。 ライセンス認証は、1行の文字列による割り当てです。
// 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の1つの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 App Serviceをサポートします。 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に関するチケットが寄せられています。その場合、チームはMRZ用のDynamsoftにPlus、それ以外のすべてのファイルに対応する別のOCRライブラリを維持管理します。 同じコードベース内に、2つのライセンス契約、2つのメンテナンス手順、2つのAPIパターンが存在する。 IronOCRは元のMRZ要件をIronTesseractインスタンスを通じて扱います。 2つのライブラリシステムから1つのパッケージに移行したチームは、通常、統合レイヤーのコードが30~40%削減されたと報告している。
年間購読料は持続可能ではない
複数製品のDynamsoftライセンスコストは毎年累積されます — 現在の価格はDynamsoftにお問い合わせください。 複数年にわたり、複数製品の年間サブスクリプション料金の合計がIronOCRの$999一度きりのコストを大幅に超えることがあります。永続ライセンシングモデルは商用製品寿命が定義された製品にとって最も重要です — 7年間動作する政府の文書処理システムは、コアコンポーネント用の専門ベンダーへの年次更新依存性を望んでいません。
PDF入力は必須です
Dynamsoft Label Recognizerは、PDFをネイティブでサポートしていません。 PDF形式で配信されるすべての文書には、前処理ステップが必要です。各ページを画像にレンダリングし、その画像をDynamsoftに通し、結果を収集して再構成します。 そのパイプラインでは、PDFレンダリングへの依存関係、ページ反復ループ、そして認識結果を元のPDFジオメトリに関連付ける必要がある場合は座標マッピングの問題が発生します。 IronOCRはPDFをネイティブに読み取り — result.Pagesがページごとのテキスト、単語、信頼スコアへのアクセスを提供します。 入力データの20%以上がPDFファイルであるチームにとって、Dynamsoftの回避策は、PDFレンダリングライブラリが更新されるたびに、かなりのメンテナンス負担を追加することになります。
複数製品統合税が高すぎる
追加のDynamsoft製品ごとに、管理する独立した静的初期化コール、独立したDisposeチェーン、そして独立したJSON設定ファイルがあります。 Dynamsoftの3つの製品を統合したチームは、統合に伴う主なメンテナンスコストは認識品質ではなく、統合面にあると報告している。 ライセンスキーのローテーション、SDKバージョンのアップグレード、およびテンプレートファイルの展開は、3つの製品すべてにおいて同時に調整する必要があります。 IronOCRのシングルパッケージモデルは、アプリケーションが使用するOCR機能の数に関係なく、アップグレードするバージョンは1つ、ローテーションするライセンスキーは1つ、維持管理するAPIインターフェースも1つで済むことを意味します。
国際文書の種類が必要です
Dynamsoft Label Recognizerは、ICAO Doc 9303に準拠したラテン文字のMRZフォーマットに基づいて構築されています。そのため、CJK言語の身分証明書、アラビア文字のパスポート、または多言語の出荷ラベルを処理するアプリケーションは、すぐに言語対応の限界に達してしまいます。 IronOCRは、アラビア語、中国語(簡体字)、中国語(繁体字)、日本語、韓国語など、125以上の言語パックを個別のNuGetパッケージとして提供しています。 それぞれdotnet add package IronOcr.Languages.Arabicを通じて認識コードを変更せずにインストールされます。 多言語対応ガイドでは、数行の設定で同時多言語認識を実現する方法を解説しています。
一般的な移行の考慮事項
MRZパーサーの置き換え
最も直接的な移行手順は、DynamsoftのReadPassportに置き換えることです。 Dynamsoftの抽出経路はP<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<のような生テキストを返し、TD3形式のために150行以上の文字オフセットパースが必要です。 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: IronOCR parsed 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: IronOCR parsed 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(IDカード)、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
サービスクラス内の既存のDynamsoftIronTesseractブロック、またはDIコンテナに登録された1つの再利用されるインスタンスで置き換えるべきです。 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の前処理パイプラインがそのギャップを埋めます。画像品質補正ガイドでは、各フィルターについて詳しく説明しています。 ラベル固有のワークフローにおいて、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スキャンをページごとに自動前処理 -テーブル抽出:請求書、マニフェスト、データシートから表形式データを検出して抽出します。
- hOCRエクスポート:認識結果をHTML形式でエクスポートし、後続のレイアウト分析のために境界ボックス座標を含める。 -非同期OCR : ASP.NETおよび高スループットのサーバーアプリケーション向けの非ブロッキング認識 -進捗状況の追跡:進捗コールバックを使用して、複数ページのバッチジョブを監視します。
- 125以上の言語インデックス:非ラテン文字を含む、サポートされている言語NuGetパックの完全なリスト
- MICR/小切手読み取り:金融文書処理のための磁気インク文字認識 — 1つのパッケージで処理されるもう1つの専門的なユースケース -単語ごとの信頼度スコア:自動文書レビューパイプラインのためのきめ細かな品質シグナル
.NETの互換性と将来の準備
IronOCRは、 .NET 8および.NET 9を主要なサポート対象ランタイムとして指定し、 .NET Framework 4.6.2および.NET Core 3.1との完全な下位互換性を備えています。このライブラリは単一のNuGetパッケージとして提供され、NuGetのランタイム識別子グラフを通じて、Windows x64、Windows x86、Linux x64、macOS x64、およびmacOS ARM用の適切なプラットフォームバイナリを自動的に解決します。条件付きパッケージ参照やプラットフォーム固有のプロジェクトファイルは不要です。 Dynamsoft Label Recognizerも同様に最新 for .NETランタイムをサポートしていますが、マルチプロダクトモデルを採用しているため、各製品 for .NET互換性は個別に検証および更新する必要があります。 IronOCRの活発な開発サイクルにより、 NuGetパッケージの更新は各.NETリリースサイクルに合わせて行われ、シングルパッケージモデルを採用しているため、2026年後半に予定されている.NET 10との互換性は、製品ごとの追跡なしにすべての機能に一律に適用されます。
結論
Dynamsoft Label Recognizerは、技術的に優れた専門ツールです。パスポートのMRZのみを処理するキオスク端末や、VINコードのみを読み取る組立ラインのステーションなど、特定の用途向けに、テンプレート駆動型の認識エンジンが信頼性の高い処理を実現します。 問題は、実際の応用例は狭い範囲にとどまることはほとんどないということだ。 パスポートは、データページ全体をOCR処理する必要があります。 配送ラベルはPDFファイルで届きます。 在庫管理システムでは、バーコードとテキストを同じ処理で取得する必要があります。 事業範囲を拡大するたびに、新たなDynamsoft製品、新たな年間ライセンス、そして新たなAPIインターフェースの保守が必要になります。
コストモデルはこれを具体的に示す。 Dynamsoftの年間サブスクリプションモデルを使用する開発チームによるMRZとバーコード読み取りの複数年の合計は、かなりの額になります。 IronOCRは両方の機能をカバーしており、ネイティブPDF、検索可能なPDF出力、完全なドキュメントOCR、125以上の言語、および前処理も含まれます — ocr.Readに置き換え、手動のTD3 MRZパーサーを削除し、ReadBarCodes = trueを有効にし、外部PDFレンダリングループを削除します。
アーキテクチャ上の違いはコストだけではありません。Dynamsoftの設計では、チームは機能ではなく製品という観点から考えることを強いられます。つまり、コードを書く前に"どのDynamsoft製品がこれを処理できるのか?"と自問自答する必要があるのです。 IronOCRの設計はそれを逆転させています。文書の内容に関係なく、インスタンスは1つ、設定も1つ、結果オブジェクトも1つです。 その差は、プロジェクトの進行に伴い要件が増えるにつれて、ますます大きくなる。
MRZ認識、バーコード読み取り、一般的な文書OCR、またはPDF処理のいずれかの組み合わせを必要とする新規アプリケーションを開発するチームにとって、IronOCRのオールインワンモデルは、最初から複数製品間の連携問題を解消します。 現在、複数のDynamsoft製品と別途OCRライブラリを併用しているチームにとって、この移行パスは、それらの依存関係を単一のものに統合するものです。 IronOCRのドキュメントハブには、ここで説明したすべての機能が、動作するコード例と導入ガイドとともに網羅されています。
よくある質問
Dynamsoft OCR SDKとは何ですか?
Dynamsoft OCR SDKは、画像や文書からテキストを抽出するために開発者や企業によって使用されるOCRソリューションです。これは、.NETアプリケーション開発のためのIronOCRとともに評価されるいくつかのOCRオプションの一つです。
IronOCRは.NET開発者向けDynamsoft OCR SDKと比較してどうですか?
IronOCRはNuGetネイティブ for .NET OCRライブラリで、そのコアエンジンとしてIronTesseractを使用しています。Dynamsoft OCR SDKと比較して、よりシンプルなデプロイメント(SDKインストーラーなし)、定額価格、COMインターオプやクラウド依存のないクリーンなC# APIを提供します。
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インストーラーは必要ありません。
IronOCR はDynamsoft OCRと違い、Dockerやコンテナでのデプロイメントに適していますか?
IronOCRはNuGetパッケージによってDockerコンテナで動作します。ライセンスキーは環境変数で設定します。OCRエンジン自体にはライセンスファイル、SDKパス、ボリュームマウントは必要ありません。
Dynamsoft OCRと比較して、購入前にIronOCRを試すことはできますか?
IronOCRのトライアルモードでは、ドキュメントを処理し、出力に透かしをオーバーレイしたOCR結果を返します。ライセンスを購入する前に、ご自身の文書で精度を確認することができます。
IronOCRはテキスト抽出とバーコード読み取りをサポートしていますか?
IronOCRはテキスト抽出とOCRに重点を置いています。バーコード読み取りについては、Iron SoftwareはIronBarcodeをコンパニオンライブラリとして提供しています。どちらも個別に、あるいはIron Suiteのバンドルとして提供されています。
Dynamsoft OCR SDKからIronOCRへの移行は簡単ですか?
Dynamsoft OCR SDKからIronOCRへの移行は通常、初期化シーケンスをIronTesseractのインスタンス化に置き換え、COMライフサイクル管理を削除し、APIコールを更新することを含みます。ほとんどの移行はコードの複雑さを大幅に軽減します。

