フッターコンテンツにスキップ
他のコンポーネントと比較する

どのTesseract OCRライブラリを選ぶべきか?開発者によるトップ3オプションの比較

Veryfiはあなたの銀行口座番号、ルーティング番号、取引額、取引先関係を、_client.ProcessDocumentAsync(bytes)を呼び出すたびにサードパーティのクラウドサーバーに送信します。 それが、Veryfiの評価全体を決定づけるアーキテクチャ上の現実です。構造化されたJSONデータが1行返ってくる前に、組織内で最も機密性の高い財務データの一部を含む経費精算書は、すでにインフラストラクチャから送信されてしまうのです。 多くのチームにとって、それが評価の終わりとなる。

Veryfiを理解する

Veryfiは、経費および財務文書専用に構築されたクラウドベースの文書インテリジェンスAPIです。この製品の核となる特長は、構造化された出力です。OCRで処理された生のテキストを後処理で解析するのではなく、Veryfi API呼び出しによって、ベンダー名、合計金額、明細項目、税金、支払いカードの下4桁、請求書の場合は銀行口座番号とルーティング番号といった、あらかじめ抽出されたフィールドが返されます。 これらのモデルは大量の財務文書で事前学習されており、対応する文書カテゴリにおいて99%以上の精度を謳っている。

アーキテクチャは完全にクラウドベースです。 すべてのドキュメントは、アプリケーションからHTTPS経由でVeryfiのサーバーに送信され、VeryfiのAI/MLパイプラインを経由して、JSON形式で戻ってきます。 オンプレミス展開オプションはなく、エアギャップモードもなく、外部に送信せずにドキュメントを処理する方法もありません。

主な建築上の特徴:

  • クラウドのみの処理: すべての文書は、ローカル処理経路なしでapi.veryfi.comにアップロードされます
  • 四つの認証情報: apiKeyが必要です——四つの秘密情報を管理し、安全に保管し、回転させます
  • ドキュメントごとの価格設定: ドキュメントタイプおよびボリューム階層に基づく現在の料金については、Veryfiにお問い合わせください
  • 非同期専用API: ProcessDocumentAsyncは主要なメソッドです; 同期パスはありません -専門文書の範囲:領収書、請求書、小切手、銀行取引明細書、源泉徴収票(W-2)、名刺。 一般文書、医療記録、契約書、技術図面は信頼できる補償範囲外です。 -独自の JSON スキーマ: ベリーフィ の応答形式は ベリーフィ 固有のものです。 ベンダーを変更する場合、抽出ロジックの書き換えが必要 -レート制限:大量処理では、HTTP 429 レスポンスを処理するためにバックオフと再試行ロジックが必要です

Veryfiの領収書処理

Veryfi SDKは、文書処理のための主要なメソッドを1つだけ提供しています。

using Veryfi;

public class VeryfiReceiptService
{
    private readonly VeryfiClient _client;

    public VeryfiReceiptService(string clientId, string clientSecret,
                                string username, string apiKey)
    {
        // Four credentials required — four secrets to manage
        _client = new VeryfiClient(clientId, clientSecret, username, apiKey);
    }

    public async Task<ReceiptData> ProcessReceiptAsync(string imagePath)
    {
        // Receipt image leaves your infrastructure here

        var imageBytes = File.ReadAllBytes(imagePath);
        var base64Image = Convert.ToBase64String(imageBytes);

        var response = await _client.ProcessDocumentAsync(
            fileData: base64Image,
            fileName: Path.GetFileName(imagePath)
        );

        return new ReceiptData
        {
            VendorName   = response.Vendor?.Name,
            Total        = response.Total,
            Date         = response.Date,
            Tax          = response.Tax,
            PaymentType  = response.Payment?.Type,
            CardLastFour = response.Payment?.Last4,
            LineItems    = response.LineItems?.Select(li => new LineItem
            {
                Description = li.Description,
                Quantity    = li.Quantity,
                UnitPrice   = li.UnitPrice,
                Total       = li.Total
            }).ToList()
        };
    }
}
using Veryfi;

public class VeryfiReceiptService
{
    private readonly VeryfiClient _client;

    public VeryfiReceiptService(string clientId, string clientSecret,
                                string username, string apiKey)
    {
        // Four credentials required — four secrets to manage
        _client = new VeryfiClient(clientId, clientSecret, username, apiKey);
    }

    public async Task<ReceiptData> ProcessReceiptAsync(string imagePath)
    {
        // Receipt image leaves your infrastructure here

        var imageBytes = File.ReadAllBytes(imagePath);
        var base64Image = Convert.ToBase64String(imageBytes);

        var response = await _client.ProcessDocumentAsync(
            fileData: base64Image,
            fileName: Path.GetFileName(imagePath)
        );

        return new ReceiptData
        {
            VendorName   = response.Vendor?.Name,
            Total        = response.Total,
            Date         = response.Date,
            Tax          = response.Tax,
            PaymentType  = response.Payment?.Type,
            CardLastFour = response.Payment?.Last4,
            LineItems    = response.LineItems?.Select(li => new LineItem
            {
                Description = li.Description,
                Quantity    = li.Quantity,
                UnitPrice   = li.UnitPrice,
                Total       = li.Total
            }).ToList()
        };
    }
}
Imports Veryfi
Imports System.IO
Imports System.Threading.Tasks

Public Class VeryfiReceiptService
    Private ReadOnly _client As VeryfiClient

    Public Sub New(clientId As String, clientSecret As String, username As String, apiKey As String)
        ' Four credentials required — four secrets to manage
        _client = New VeryfiClient(clientId, clientSecret, username, apiKey)
    End Sub

    Public Async Function ProcessReceiptAsync(imagePath As String) As Task(Of ReceiptData)
        ' Receipt image leaves your infrastructure here

        Dim imageBytes = File.ReadAllBytes(imagePath)
        Dim base64Image = Convert.ToBase64String(imageBytes)

        Dim response = Await _client.ProcessDocumentAsync(
            fileData:=base64Image,
            fileName:=Path.GetFileName(imagePath)
        )

        Return New ReceiptData With {
            .VendorName = response.Vendor?.Name,
            .Total = response.Total,
            .Date = response.Date,
            .Tax = response.Tax,
            .PaymentType = response.Payment?.Type,
            .CardLastFour = response.Payment?.Last4,
            .LineItems = response.LineItems?.Select(Function(li) New LineItem With {
                .Description = li.Description,
                .Quantity = li.Quantity,
                .UnitPrice = li.UnitPrice,
                .Total = li.Total
            }).ToList()
        }
    End Function
End Class
$vbLabelText   $csharpLabel

請求書は事態の深刻さを増幅させる。 同じProcessDocumentAsyncパターンは、銀行口座番号、ルーティング番号、取引先の税ID、支払い条件を頻繁に含む文書を送信します:

public async Task<InvoiceData> ProcessInvoiceAsync(string pdfPath)
{
    var pdfBytes = File.ReadAllBytes(pdfPath);

    // Invoice uploaded to ベリーフィ — banking details included
    var response = await _client.ProcessDocumentAsync(
        fileData: pdfBytes,
        fileName: Path.GetFileName(pdfPath),
        categories: new[] { "invoices" }
    );

    return new InvoiceData
    {
        InvoiceNumber    = response.InvoiceNumber,
        VendorName       = response.Vendor?.Name,
        VendorTaxId      = response.Vendor?.TaxId,       // transmitted
        Total            = response.Total,
        DueDate          = response.DueDate,
        PaymentTerms     = response.PaymentTerms,
        BankAccountNumber = response.BankAccount?.AccountNumber, // transmitted
        BankRoutingNumber = response.BankAccount?.RoutingNumber  // transmitted
    };
}
public async Task<InvoiceData> ProcessInvoiceAsync(string pdfPath)
{
    var pdfBytes = File.ReadAllBytes(pdfPath);

    // Invoice uploaded to ベリーフィ — banking details included
    var response = await _client.ProcessDocumentAsync(
        fileData: pdfBytes,
        fileName: Path.GetFileName(pdfPath),
        categories: new[] { "invoices" }
    );

    return new InvoiceData
    {
        InvoiceNumber    = response.InvoiceNumber,
        VendorName       = response.Vendor?.Name,
        VendorTaxId      = response.Vendor?.TaxId,       // transmitted
        Total            = response.Total,
        DueDate          = response.DueDate,
        PaymentTerms     = response.PaymentTerms,
        BankAccountNumber = response.BankAccount?.AccountNumber, // transmitted
        BankRoutingNumber = response.BankAccount?.RoutingNumber  // transmitted
    };
}
Imports System.IO
Imports System.Threading.Tasks

Public Async Function ProcessInvoiceAsync(pdfPath As String) As Task(Of InvoiceData)
    Dim pdfBytes = File.ReadAllBytes(pdfPath)

    ' Invoice uploaded to ベリーフィ — banking details included
    Dim response = Await _client.ProcessDocumentAsync(
        fileData:=pdfBytes,
        fileName:=Path.GetFileName(pdfPath),
        categories:=New String() {"invoices"}
    )

    Return New InvoiceData With {
        .InvoiceNumber = response.InvoiceNumber,
        .VendorName = response.Vendor?.Name,
        .VendorTaxId = response.Vendor?.TaxId,       ' transmitted
        .Total = response.Total,
        .DueDate = response.DueDate,
        .PaymentTerms = response.PaymentTerms,
        .BankAccountNumber = response.BankAccount?.AccountNumber, ' transmitted
        .BankRoutingNumber = response.BankAccount?.RoutingNumber  ' transmitted
    }
End Function
$vbLabelText   $csharpLabel

銀行明細書のエンドポイントは最も機密性が高いです。categories: new[] { "bank_statements" }を呼び出すと、完全な口座番号、ルーティング番号、全取引履歴、開始と終了の残高、及び電信送金の詳細をVeryfiのインフラストラクチャに送信します。

IronOCRを理解する

IronOCRは、 .NET向けの商用オンプレミスOCRライブラリであり、すべてのドキュメントをローカルで処理します。 お客様のインフラストラクチャからドキュメントデータが外部に送信されることはありません。 このライブラリは、最適化されたTesseract 5エンジンをラップし、自動前処理、ネイティブPDFサポート、125以上の言語パックを備えています。これらすべてが、永続ライセンス付きの単一のNuGetパッケージとして提供されます。

主な特徴:

-オンプレミス設計:すべての処理はお客様のハードウェア上で行われます。 OCR用のネットワーク呼び出しはありません -自動前処理:デスクウ、ノイズ除去、コントラスト調整、バイナリ化、解像度向上は、明示的な設定なしで自動的に適用されます。

  • ネイティブPDF入力: LoadPdf()を介してスキャン済みまたはデジタルPDFを直接読み取ります——別途PDFライブラリは必要ありません
  • 永続ライセンス: $999 Lite / $1,499 Plus / $2,999 Professional / $5,999 Unlimited——一度支払い、無制限に文書を処理できます -構造化された結果アクセス:単語、行、段落、ページごとに、X/Y座標と単語ごとの信頼度スコアが表示されます。
  • スレッドセーフで並列化可能: IronTesseract のインスタンスは、追加の同期なしでスレッド間で使用できます
  • 125以上の言語に対応: NuGetパッケージとしてインストールされ、tessdataフォルダの管理は不要です。 -クロスプラットフォーム: Windows、Linux、macOS、Docker、AWS、Azure - 1つのパッケージですべてのターゲットに対応

機能比較

フィーチャー ベリーフィ IronOCR
データの場所 Veryfiクラウドサーバー インフラストラクチャ
展開モデル クラウドAPIのみ オンプレミス
価格設定モデル ドキュメントごと(価格についてはVeryfiにお問い合わせください) 永続ライセンス ($5,999)
オフラインサポート なし はい
文書の範囲 経費関連書類のみ あらゆる文書タイプ
セットアップ 4つのAPI認証情報 ライセンスキー1つ

詳細な機能比較

フィーチャー ベリーフィ IronOCR
データプライバシー
文書がインフラから離れる はい(すべての通話で) 一度もない
エアギャップ展開 不可 完全サポート
オンプレミス処理 不可 デフォルトの動作
HIPAA準拠(BAA不要) いいえ(BAAは不要です) はい
ITAR/CMMC準拠 複雑 はい
ドキュメントサポート
領収書処理 はい(専門分野) はい(OCR+抽出による)
請求書処理 はい(専門分野) はい(OCR+抽出による)
銀行取引明細書の処理 はい(専門分野) はい(OCR+抽出による)
一般的なビジネス文書 結果が芳しくない はい
医療記録 サポートされていません はい
法的契約 制限的 はい
カスタム/任意の文書タイプ 有給研修あり あらゆるタイプ
複数ページのPDFファイル はい はい
テクニカル
インターネット接続が必要です はい(すべての文書) なし
同期APIが利用可能です なし はい
画像前処理 自動(クラウド) 自動(ローカル)
PDF入力(ネイティブ) はい はい
検索可能なPDF出力 なし はい
バーコード読み取り なし はい
地域ベースのOCR なし はい
信頼度スコア フィールドごと 単語ごとおよび全体
開発分野
管理するための認証情報 4 (clientId、clientSecret、username、apiKey) 1(ライセンスキー)
単体テストの複雑さ HTTPのモックが必要です 直接的な現地検査
エラー処理 HTTPステータスコード + VeryfiApiException ローカル.NET例外
言語サポート 制限的 125以上の言語
費用
コスト上限 契約上の上限がないものはない ライセンス価格
大量購入時のコスト 線形にスケーリングする フラット

金融文書のデータプライバシー

Veryfiが処理する財務文書には、あらゆる組織において最も機密性の高いデータカテゴリーが含まれています。 これは理論的な懸念ではなく、製品の仕組みに関する具体的な建築上の事実である。

Veryfiのアプローチ

すべてのVeryfi API呼び出しは、文書バイトをHTTPSを介してapi.veryfi.comに送信します。 これらの文書から抽出されたデータ(口座番号、ルーティング番号、取引履歴、ベンダーの納税者番号、決済カードの詳細、支出パターンなど)は、Veryfiのインフラストラクチャによって処理されます。 データの所在地、保持ポリシー、サブプロセッサーチェーン、および侵害対応手順はすべて、お客様の規約ではなく、Veryfiの規約によって規定されます。

// 銀行取引明細書の処理 — critical sensitivity
public async Task<BankStatementData> ProcessBankStatementAsync(string pdfPath)
{
    var pdfBytes = File.ReadAllBytes(pdfPath);

    // AT THIS POINT: full financial history leaves your infrastructure
    // Account numbers, transaction history, balances — all transmitted
    var response = await _client.ProcessDocumentAsync(
        fileData: pdfBytes,
        categories: new[] { "bank_statements" }
    );

    return new BankStatementData
    {
        AccountNumber  = response.AccountNumber,  // critical — transmitted
        RoutingNumber  = response.RoutingNumber,  // critical — transmitted
        OpeningBalance = response.OpeningBalance,
        ClosingBalance = response.ClosingBalance,
        Transactions   = response.Transactions?.Select(t => new Transaction
        {
            Date        = t.Date,
            Description = t.Description,
            Amount      = t.Amount,
            Balance     = t.RunningBalance
        }).ToList()
    };
}
// 銀行取引明細書の処理 — critical sensitivity
public async Task<BankStatementData> ProcessBankStatementAsync(string pdfPath)
{
    var pdfBytes = File.ReadAllBytes(pdfPath);

    // AT THIS POINT: full financial history leaves your infrastructure
    // Account numbers, transaction history, balances — all transmitted
    var response = await _client.ProcessDocumentAsync(
        fileData: pdfBytes,
        categories: new[] { "bank_statements" }
    );

    return new BankStatementData
    {
        AccountNumber  = response.AccountNumber,  // critical — transmitted
        RoutingNumber  = response.RoutingNumber,  // critical — transmitted
        OpeningBalance = response.OpeningBalance,
        ClosingBalance = response.ClosingBalance,
        Transactions   = response.Transactions?.Select(t => new Transaction
        {
            Date        = t.Date,
            Description = t.Description,
            Amount      = t.Amount,
            Balance     = t.RunningBalance
        }).ToList()
    };
}
Imports System.IO
Imports System.Threading.Tasks

' 銀行取引明細書の処理 — critical sensitivity
Public Async Function ProcessBankStatementAsync(pdfPath As String) As Task(Of BankStatementData)
    Dim pdfBytes = File.ReadAllBytes(pdfPath)

    ' AT THIS POINT: full financial history leaves your infrastructure
    ' Account numbers, transaction history, balances — all transmitted
    Dim response = Await _client.ProcessDocumentAsync(
        fileData:=pdfBytes,
        categories:=New String() {"bank_statements"}
    )

    Return New BankStatementData With {
        .AccountNumber = response.AccountNumber,  ' critical — transmitted
        .RoutingNumber = response.RoutingNumber,  ' critical — transmitted
        .OpeningBalance = response.OpeningBalance,
        .ClosingBalance = response.ClosingBalance,
        .Transactions = If(response.Transactions?.Select(Function(t) New Transaction With {
            .Date = t.Date,
            .Description = t.Description,
            .Amount = t.Amount,
            .Balance = t.RunningBalance
        }).ToList(), Nothing)
    }
End Function
$vbLabelText   $csharpLabel

Veryfiは、SOC 2 Type II、GDPR、およびHIPAA(事業提携契約に基づく)の認証を取得しています。 これらの認証は、Veryfiが公表しているセキュリティ対策を遵守していることを証明するものです。 これらは、あなたのデータがあなたの管理下に置かれること、あなたがデータの所在地を管理できること、またはVeryfiのサブプロセッサーがデータにアクセスできないことを意味するものではありません。 CMMCレベル2以上、ITAR、SOX、またはGLBAの適用を受ける組織にとって、Veryfiをデータ処理業者として追加することは、法的審査と継続的な監視を必要とするコンプライアンス範囲の拡大につながります。

IronOCRのアプローチ

IronOCRは、ネットワーク通信を一切使用せずに文書を処理します。 OCRエンジンは、お使いのハードウェア上で動作します。 銀行取引明細書、ルーティング番号が記載された請求書、口座番号が記載された小切手は、決してサーバーから外部に持ち出されません。

using IronOcr;
using System.Text.RegularExpressions;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

public class LocalFinancialDocumentProcessor
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public BankStatementResult ProcessBankStatement(string pdfPath)
    {
        // All processing on your infrastructure
        // なし network calls — no external access
        using var input = new OcrInput();
        input.LoadPdf(pdfPath);

        var result = _ocr.Read(input);
        var text   = result.Text;

        // Account numbers stay on your server
        return new BankStatementResult
        {
            AccountNumber = ExtractAccountNumber(text),
            Balance       = ExtractBalance(text),
            RawText       = text,
            Confidence    = result.Confidence
        };
    }

    private string ExtractAccountNumber(string text)
    {
        var match = Regex.Match(text,
            @"Account\s*#?\s*:?\s*(\d{4,})",
            RegexOptions.IgnoreCase);
        return match.Success ? match.Groups[1].Value : null;
    }

    private decimal? ExtractBalance(string text)
    {
        var match = Regex.Match(text,
            @"Balance:?\s*\$?([\d,]+\.?\d*)",
            RegexOptions.IgnoreCase);
        if (match.Success && decimal.TryParse(
            match.Groups[1].Value.Replace(",", ""), out var bal))
            return bal;
        return null;
    }
}
using IronOcr;
using System.Text.RegularExpressions;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

public class LocalFinancialDocumentProcessor
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public BankStatementResult ProcessBankStatement(string pdfPath)
    {
        // All processing on your infrastructure
        // なし network calls — no external access
        using var input = new OcrInput();
        input.LoadPdf(pdfPath);

        var result = _ocr.Read(input);
        var text   = result.Text;

        // Account numbers stay on your server
        return new BankStatementResult
        {
            AccountNumber = ExtractAccountNumber(text),
            Balance       = ExtractBalance(text),
            RawText       = text,
            Confidence    = result.Confidence
        };
    }

    private string ExtractAccountNumber(string text)
    {
        var match = Regex.Match(text,
            @"Account\s*#?\s*:?\s*(\d{4,})",
            RegexOptions.IgnoreCase);
        return match.Success ? match.Groups[1].Value : null;
    }

    private decimal? ExtractBalance(string text)
    {
        var match = Regex.Match(text,
            @"Balance:?\s*\$?([\d,]+\.?\d*)",
            RegexOptions.IgnoreCase);
        if (match.Success && decimal.TryParse(
            match.Groups[1].Value.Replace(",", ""), out var bal))
            return bal;
        return null;
    }
}
Imports IronOcr
Imports System.Text.RegularExpressions

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Public Class LocalFinancialDocumentProcessor
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ProcessBankStatement(pdfPath As String) As BankStatementResult
        ' All processing on your infrastructure
        ' なし network calls — no external access
        Using input As New OcrInput()
            input.LoadPdf(pdfPath)

            Dim result = _ocr.Read(input)
            Dim text = result.Text

            ' Account numbers stay on your server
            Return New BankStatementResult With {
                .AccountNumber = ExtractAccountNumber(text),
                .Balance = ExtractBalance(text),
                .RawText = text,
                .Confidence = result.Confidence
            }
        End Using
    End Function

    Private Function ExtractAccountNumber(text As String) As String
        Dim match = Regex.Match(text,
            "Account\s*#?\s*:?\s*(\d{4,})",
            RegexOptions.IgnoreCase)
        Return If(match.Success, match.Groups(1).Value, Nothing)
    End Function

    Private Function ExtractBalance(text As String) As Decimal?
        Dim match = Regex.Match(text,
            "Balance:?\s*\$?([\d,]+\.?\d*)",
            RegexOptions.IgnoreCase)
        If match.Success AndAlso Decimal.TryParse(
            match.Groups(1).Value.Replace(",", ""), bal) Then
            Return bal
        End If
        Return Nothing
    End Function
End Class
$vbLabelText   $csharpLabel

コンプライアンスが重視される環境では、ローカル処理によって第三者による監査の範囲を完全に排除できます。 IronOCRにはBAAは不要です。 サブプロセッサーに関する開示はありません。 データ所在地に関する質問はありません。 Windows、Linux、Docker、およびエアギャップ環境におけるデプロイメント構成については、 IronTesseractのセットアップガイドを参照してください。

専門分野別OCRと一般分野別OCR

Veryfiの文書に特化している点は、最大の強みであると同時に、最大の弱点でもある。 事前学習済みのモデルは、それぞれが対象とする特定の文書タイプに対して、真に高速で構造化された結果を提供します。 問題は、組織がそのリストにないOCR機能を必要とする瞬間に発生します。

Veryfiのアプローチ

Veryfiは自社の得意分野において優れた成果を上げている。 領収書の画像を送信すると、レスポンスには販売者、合計金額、税金、支払い方法、明細項目が含まれます。お客様側で正規表現を使用する必要はありません。 しかし、その範囲は経費と財務書類の境界で終わる。 READMEファイルには、この点が明確に記載されています。一般的なビジネス文書、医療記録、技術図面、多言語文書、および学習済みデータセットに含まれていないカスタムフォームタイプは、結果が不良となるか、有料のカスタムモデル学習が必要になります。

実際の組織では、処理する文書の種類が1つだけということはほとんどありません。 人事部は従業員の入社手続き書類を処理する。 法務チームには契約書の文面が必要です。 オペレーションチームは、出荷書類や物流関連の書類を取り扱います。 Veryfiの対象外となる各カテゴリは、スタックに2つ目のソリューションを強制的に組み込むことになります。

// Veryfi: works for invoices, fails for shipping manifests
var invoiceResponse = await _client.ProcessDocumentAsync(
    fileData: invoiceBytes,
    categories: new[] { "invoices" }
);

// For anything outside the supported list, you need a second tool
// Contracts: limited support
// Medical forms: not supported
// Shipping documents: not supported
// Custom forms: paid training required
// Veryfi: works for invoices, fails for shipping manifests
var invoiceResponse = await _client.ProcessDocumentAsync(
    fileData: invoiceBytes,
    categories: new[] { "invoices" }
);

// For anything outside the supported list, you need a second tool
// Contracts: limited support
// Medical forms: not supported
// Shipping documents: not supported
// Custom forms: paid training required
Imports System.Threading.Tasks

' Veryfi: works for invoices, fails for shipping manifests
Dim invoiceResponse = Await _client.ProcessDocumentAsync(
    fileData:=invoiceBytes,
    categories:=New String() {"invoices"}
)

' For anything outside the supported list, you need a second tool
' Contracts: limited support
' Medical forms: not supported
' Shipping documents: not supported
' Custom forms: paid training required
$vbLabelText   $csharpLabel

IronOCRのアプローチ

IronOCRはあらゆる種類の文書を処理します。 抽出ロジックはユーザー自身が記述できるため、事前に学習されたモデルがすべての経費文書に共通するフィールドを推測するのではなく、文書に含まれるフィールドを正確に処理します。 同じIronTesseractインスタンスは、レシート、契約書、医療フォーム、出荷文書、カスタム内部フォームを処理します:

using IronOcr;

var ocr = new IronTesseract();

// Receipts
var receiptResult = ocr.Read("receipt.jpg");
var receiptTotal  = ExtractTotal(receiptResult.Text);

// Contracts — not in Veryfi's scope
using var contractInput = new OcrInput();
contractInput.LoadPdf("contract.pdf");
var contractResult = ocr.Read(contractInput);
var parties        = ExtractContractParties(contractResult.Text);

// Medical forms — requires HIPAA BAA with Veryfi; stays local with IronOCR
var medicalResult = ocr.Read("patient-intake-form.jpg");
var patientName   = medicalResult.Lines.FirstOrDefault()?.Text;

// Shipping documents
var shipResult    = ocr.Read("bill-of-lading.jpg");
var trackingNum   = ExtractPattern(shipResult.Text, @"Tracking\s*#?\s*:?\s*(\w+)");
using IronOcr;

var ocr = new IronTesseract();

// Receipts
var receiptResult = ocr.Read("receipt.jpg");
var receiptTotal  = ExtractTotal(receiptResult.Text);

// Contracts — not in Veryfi's scope
using var contractInput = new OcrInput();
contractInput.LoadPdf("contract.pdf");
var contractResult = ocr.Read(contractInput);
var parties        = ExtractContractParties(contractResult.Text);

// Medical forms — requires HIPAA BAA with Veryfi; stays local with IronOCR
var medicalResult = ocr.Read("patient-intake-form.jpg");
var patientName   = medicalResult.Lines.FirstOrDefault()?.Text;

// Shipping documents
var shipResult    = ocr.Read("bill-of-lading.jpg");
var trackingNum   = ExtractPattern(shipResult.Text, @"Tracking\s*#?\s*:?\s*(\w+)");
Imports IronOcr

Dim ocr As New IronTesseract()

' Receipts
Dim receiptResult = ocr.Read("receipt.jpg")
Dim receiptTotal = ExtractTotal(receiptResult.Text)

' Contracts — not in Veryfi's scope
Using contractInput As New OcrInput()
    contractInput.LoadPdf("contract.pdf")
    Dim contractResult = ocr.Read(contractInput)
    Dim parties = ExtractContractParties(contractResult.Text)
End Using

' Medical forms — requires HIPAA BAA with Veryfi; stays local with IronOCR
Dim medicalResult = ocr.Read("patient-intake-form.jpg")
Dim patientName = medicalResult.Lines.FirstOrDefault()?.Text

' Shipping documents
Dim shipResult = ocr.Read("bill-of-lading.jpg")
Dim trackingNum = ExtractPattern(shipResult.Text, "Tracking\s*#?\s*:?\s*(\w+)")
$vbLabelText   $csharpLabel

一貫したパターンに従う請求書とレシートのフィールドに対して、IronOCRの構造化データ抽出は、抽出ロジックを正確にする単語レベルの配置を提供します。Y位置で順序付けられたresult.Linesコレクションは、レシートのヘッダから取引先名を確実に浮き彫りにします。 画像品質補正フィルターは、実際の経費処理ワークフローで発生する、しわくちゃになったり、色あせたり、撮影された領収書などの問題を補正します。

ドキュメントごとのクラウド料金と永久ライセンスの比較

VeryfiとIronOCRのコスト差は、処理される文書ごとに計算されます。 Veryfiのドキュメント単位の料金体系では、契約で上限を設定しない限り、料金はドキュメント数に比例して増加し、上限はありません。

Veryfiのアプローチ

Veryfiは書類ごとに料金を請求します。 料金はドキュメントタイプおよびボリューム階層によって異なります。現在の料金についてはVeryfiにお問い合わせください。 コストは契約上交渉しない限り、ボリュームと直接比例して増加し、どれだけ長く顧客であったかに関わらず、次年度に削減はありません。

// This method call costs money — every time
// Costs accumulate with every document processed
var response = await _client.ProcessDocumentAsync(bytes);
// This method call costs money — every time
// Costs accumulate with every document processed
var response = await _client.ProcessDocumentAsync(bytes);
' This method call costs money — every time
' Costs accumulate with every document processed
Dim response = Await _client.ProcessDocumentAsync(bytes)
$vbLabelText   $csharpLabel

隠れたコストが総コストを増大させる:HTTP 429 でのレート制限により再試行ロジックが強制される。 APIのバージョン変更にはSDKのアップデートが必要です。 データ処理契約のセキュリティ審査には法務上の時間が必要となり、季節的なデータ量が計画の予測を超過した場合は超過料金が発生します。

IronOCRのアプローチ

IronOCRのライセンスは一度購入すれば終わりです。 $2,999でのProfessionalライセンスは10人の開発者をカバーし、月ごとの無制限の文書処理を行い、処理を継続するための更新は不要です。 2年目の処理費用は無料です。 5年目の処理費用は無料です。

// Configure once at startup — no per-call cost
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();

// This processes 50,000 documents/month at $0 marginal cost
foreach (var documentPath in documentBatch)
{
    var result = ocr.Read(documentPath);
    ProcessExtractedData(result.Text, result.Lines);
}
// Configure once at startup — no per-call cost
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();

// This processes 50,000 documents/month at $0 marginal cost
foreach (var documentPath in documentBatch)
{
    var result = ocr.Read(documentPath);
    ProcessExtractedData(result.Text, result.Lines);
}
Imports IronOcr

' Configure once at startup — no per-call cost
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim ocr As New IronTesseract()

' This processes 50,000 documents/month at $0 marginal cost
For Each documentPath In documentBatch
    Dim result = ocr.Read(documentPath)
    ProcessExtractedData(result.Text, result.Lines)
Next
$vbLabelText   $csharpLabel

高文書量の3年間の比較:IronOCRの合計は$2,999および抽出パターンを構築するための推定8〜16時間の開発時間であり、一方Veryfiは処理される文書ごとに費用が積み重なります。 通常、ブレークイーブンは使用開始後数ヶ月以内に発生し、ボリュームによって異なります。

現在クラウドOCRに費用をかけているチーム向けに、 IronOCRのライセンスページにはティアの詳細と、年間請求を希望するチーム向けのSaaSサブスクリプションオプションが掲載されています。

Webhookと非同期処理 vs. 同期ローカル結果

Veryfiのクラウドアーキテクチャは、非同期処理のみのモデルを前提としている。 ドキュメントはリモートサーバーに送信され、リモートパイプラインで処理された後、ネットワークの往復を経て応答が届きます。大量のバッチ処理の場合、VeryfiはポーリングではなくWebhookベースの通知を推奨しています。 IronOCRはデフォルトでは同期的に処理を行い、ループ内でネットワークに依存しません。

Veryfiのアプローチ

Veryfiの処理はすべてクラウドベースであるため、非同期で行われます。 ProcessDocumentAsyncメソッドはHTTP呼び出しを開始し、Veryfiのパイプラインの完了を待ち、結果を返します。 総遅延時間には、ネットワーク伝送、Veryfiのインフラストラクチャにおけるキュー時間、モデル推論、および応答伝送が含まれます。

// ベリーフィ error categories reflect cloud dependencies
public async Task<ReceiptData> ProcessWithHandlingAsync(string path)
{
    try
    {
        var bytes    = File.ReadAllBytes(path);
        var response = await _client.ProcessDocumentAsync(bytes);
        return MapToReceiptData(response);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 401)
    {
        // Credential failure — check all four credentials
        throw new Exception("Authentication failed. Verify clientId, clientSecret, username, apiKey.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 402)
    {
        // Plan quota exceeded — processing halted until billing resolved
        throw new Exception("Quota exceeded. Check plan limits and billing.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 429)
    {
        // Rate limited — requires exponential backoff implementation
        throw new Exception("Rate limit exceeded. Implement retry with backoff.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 500)
    {
        // ベリーフィ infrastructure failure — your processing is down
        throw new Exception("Veryfi server error. Processing unavailable.", ex);
    }
}
// ベリーフィ error categories reflect cloud dependencies
public async Task<ReceiptData> ProcessWithHandlingAsync(string path)
{
    try
    {
        var bytes    = File.ReadAllBytes(path);
        var response = await _client.ProcessDocumentAsync(bytes);
        return MapToReceiptData(response);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 401)
    {
        // Credential failure — check all four credentials
        throw new Exception("Authentication failed. Verify clientId, clientSecret, username, apiKey.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 402)
    {
        // Plan quota exceeded — processing halted until billing resolved
        throw new Exception("Quota exceeded. Check plan limits and billing.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 429)
    {
        // Rate limited — requires exponential backoff implementation
        throw new Exception("Rate limit exceeded. Implement retry with backoff.", ex);
    }
    catch (VeryfiApiException ex) when (ex.StatusCode == 500)
    {
        // ベリーフィ infrastructure failure — your processing is down
        throw new Exception("Veryfi server error. Processing unavailable.", ex);
    }
}
Imports System.IO
Imports System.Threading.Tasks

Public Async Function ProcessWithHandlingAsync(path As String) As Task(Of ReceiptData)
    Try
        Dim bytes = File.ReadAllBytes(path)
        Dim response = Await _client.ProcessDocumentAsync(bytes)
        Return MapToReceiptData(response)
    Catch ex As VeryfiApiException When ex.StatusCode = 401
        ' Credential failure — check all four credentials
        Throw New Exception("Authentication failed. Verify clientId, clientSecret, username, apiKey.", ex)
    Catch ex As VeryfiApiException When ex.StatusCode = 402
        ' Plan quota exceeded — processing halted until billing resolved
        Throw New Exception("Quota exceeded. Check plan limits and billing.", ex)
    Catch ex As VeryfiApiException When ex.StatusCode = 429
        ' Rate limited — requires exponential backoff implementation
        Throw New Exception("Rate limit exceeded. Implement retry with backoff.", ex)
    Catch ex As VeryfiApiException When ex.StatusCode = 500
        ' ベリーフィ infrastructure failure — your processing is down
        Throw New Exception("Veryfi server error. Processing unavailable.", ex)
    End Try
End Function
$vbLabelText   $csharpLabel

ネットワーク障害が発生すると、処理が停止します。 Veryfiのインフラストラクチャ障害により、処理が停止します。 処理速度制限により処理が停止します。 これらはすべて、アプリケーションが制御できない外部依存関係です。

IronOCRのアプローチ

IronOCRはネットワークに一切依存せず、同期的に処理を行います。 結果は、Read()が返されるとすぐに利用可能であり、ポーリングなし、Webhookの設定なし、ネットワーク障害のリトライロジックなしです。

using IronOcr;

var ocr = new IronTesseract();

// Synchronous — result immediately available
// なし network, no quota, no rate limits
var result = ocr.Read("receipt.jpg");

Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");

// Word-level positioning for precise field extraction
foreach (var line in result.Lines)
{
    Console.WriteLine($"Y={line.Y}: {line.Text}");
}
using IronOcr;

var ocr = new IronTesseract();

// Synchronous — result immediately available
// なし network, no quota, no rate limits
var result = ocr.Read("receipt.jpg");

Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");

// Word-level positioning for precise field extraction
foreach (var line in result.Lines)
{
    Console.WriteLine($"Y={line.Y}: {line.Text}");
}
Imports IronOcr

Dim ocr As New IronTesseract()

' Synchronous — result immediately available
' なし network, no quota, no rate limits
Dim result = ocr.Read("receipt.jpg")

Console.WriteLine(result.Text)
Console.WriteLine($"Confidence: {result.Confidence}%")

' Word-level positioning for precise field extraction
For Each line In result.Lines
    Console.WriteLine($"Y={line.Y}: {line.Text}")
Next
$vbLabelText   $csharpLabel

UI応答性のために非同期動作を必要とするアプリケーションについては、IronOCRは非同期OCRTask.Runラッピングまたは非同期APIサーフェスを通じてサポートしています。 IronOCRにおける非同期処理は、リモート呼び出しによって課される要件ではなく、並行処理パターンであるという点が異なります。 午前2時のネットワーク障害は、バッチ処理を停止させません。

レシートスキャンワークフローについては、レシートスキャンチュートリアル請求書OCRガイドで、抽出パターンの完全な実装について解説しています。 信頼度スコアは単語ごとの信頼性シグナルを提供し、抽出したデータを下流システムに渡す前に、低品質なスキャンを特定するのに役立ちます。

APIマッピングリファレンス

ベリーフィ IronOCR相当値
new VeryfiClient(clientId, clientSecret, username, apiKey) new IronTesseract() + IronOcr.License.LicenseKey = "key"
_client.ProcessDocumentAsync(bytes) ocr.Read(filePath) または ocr.Read(ocrInput)
_client.ProcessDocumentAsync(bytes, categories: new[] { "invoices" }) input.LoadPdf(pdfPath); ocr.Read(input)
response.Vendor?.Name result.Lines.FirstOrDefault()?.Text
response.Total ExtractTotal(result.Text) via Regex
response.Date ExtractDate(result.Text) via Regex
response.LineItems result.Lines with positional extraction
response.InvoiceNumber Regex.Match(result.Text, @"Invoice\s*#?\s*:?\s*(\w+)")
response.ConfidenceScore result.Confidence
response.Payment?.Last4 Regex.Match(result.Text, @"\d{4}$")
response.BankAccount?.AccountNumber Regex.Match(result.Text, @"Account\s*#?\s*:?\s*(\d+)")
VeryfiApiException (HTTP 401/402/429/500) 標準 for .NET例外(ローカル例外、ネットワーク例外なし)
アップロード前にBase64エンコードする 必要ありません — ocr.Read(filePath)はファイルパスを直接受け付けます
設定中の4つの認証情報 シングルライセンスキー

チームがVeryfiからIronOCRへの移行を検討する際

データ主権は交渉の余地のないものとなる

IronOCRを評価する最も一般的なきっかけは、コンプライアンス監査または法的審査において、Veryfiが機密性の高い財務記録のデータ処理業者として問題視されることです。 HIPAA(医療情報保護法)に基づく評価の結果、個人健康情報(PHI)を含む経費精算書には、Veryfi社との事業提携契約および継続的な監査監督が必要であることが判明した。 CMMCレベル2の評価では、クラウド経由で送信される財務文書が潜在的な脆弱性として指摘されています。法務チームは、顧客案件の経費データを第三者に送信することに反対しています。 いずれのシナリオにおいても、コンプライアンスへの道は外部データ送信を排除することであり、それはつまりVeryfiをオンプレミスのOCRに置き換えることを意味する。 IronOCRのローカル処理モデルは、デフォルトでこれらの要件を満たしています。BAA(事業提携契約)は不要、サブプロセッサチェーンも不要、第三者による監査範囲も不要です。

経費以外にも文書の種類が拡大

経費自動化のためにVeryfiを導入した組織は、6~12ヶ月以内に、隣接するチームがVeryfiのトレーニングセットに含まれていない文書に対してOCR処理を必要としていることに気づくことが多い。 人事部は入社手続き書類の処理を必要としています。 法的要件を満たすために契約書のテキストを抽出しました。 業務上、船荷証券データの取得が必要です。 新しい文書カテゴリが生まれるたびに、Veryfiの汎用エンドポイントでは不十分な結果しか得られなかったり、有料のカスタムモデルトレーニングが必要になったり、あるいは2つ目のOCRソリューションをインフラストラクチャに導入せざるを得なくなったりする。 IronOCRの単一ライセンスで、これらすべてを同じAPIで処理できます。 特定の文書の読み取りに関するチュートリアルでは、構造化されたフォームレイアウトからの抽出戦略について説明します。

文書ごとのコストがビジネスケースの基準値を超える

月に25,000件以上の文書を処理するチームの場合、 IronOCRの投資回収期間は通常3ヶ月以内です。 高文書量時、$2,999でのIronOCR Professionalライセンスは、通常、Veryfiの同等の支出の最初の月以内に支払いが済みます。 ドキュメントごとのクラウド料金体系について総所有コスト分析を行う財務チームは、必然的にこの比較にたどり着く。 移行作業(チームが必要とする特定のフィールドに対応する正規表現抽出パターンの構築)は、文書の複雑さやワークフロー内の文書タイプの数によって異なりますが、通常8~24時間かかります。

オフライン環境および接続されていない環境

現場サービス組織、遠隔地の作業現場、モバイル経費精算アプリ、そしてインターネット接続のない政府機関環境には、共通の要件があります。それは、OCRがインターネット接続なしで動作する必要があるということです。 Veryfiはアーキテクチャ的にこの要件を満たすことができない。ネットワーク接続がないと、すべてのドキュメント処理呼び出しが失敗する。 IronOCRは設計上、オフラインで処理を行います。 モバイル経費アプリを使用する現場技術者、ファイアウォールで保護されたネットワークを持つ製造工場、SCIF(機密情報隔離施設)内の防衛請負業者など、いずれもIronOCRを修正なしで実行できます。 Docker導入ガイドLinux導入ガイドでは、ネットワークの外部への送信が制限されているコンテナ環境について説明しています。

ベンダーロックインとスキーマ依存性

VeryfiのJSONレスポンススキーマは独自仕様です。 ベンダー名、合計金額、ルーティング番号、または明細項目フィールドを読み取る抽出コードの各行は、Veryfiでのみ動作するコードです。 競合するクラウドAPI、あるいはオンプレミスソリューションに切り替える場合、すべての抽出ロジックを書き直す必要があります。 Veryfiと複数年契約を締​​結する組織は、価格変更や製品ロードマップの変更があった際に、この依存関係に気づくことになる。 IronOCRの抽出ロジックは、標準的な.NET正規表現を使用して生のテキストを読み取ります。移植性が高く、特定のベンダーのスキーマに依存しません。

一般的な移行の考慮事項

構造化出力をパターン抽出に置き換える

Veryfiは解析済みのフィールドを返します。 IronOCRはOCR処理後の生テキストを返します。 移行作業とは、Veryfiがクラウド上で行っていた抽出パターンを書き出す作業です。 レイアウトが統一されている領収書や請求書の場合、これは簡単です。

using IronOcr;
using System.Text.RegularExpressions;

var ocr    = new IronTesseract();
var result = ocr.Read("receipt.jpg");
var text   = result.Text;

// Vendor: first non-empty line, ordered by Y position
var vendor = result.Lines
    .OrderBy(l => l.Y)
    .Select(l => l.Text.Trim())
    .FirstOrDefault(t => !string.IsNullOrWhiteSpace(t) && t.Length > 3);

// Total: pattern matching against common receipt labels
decimal? total = null;
foreach (var pattern in new[] {
    @"Total:?\s*\$?\s*([\d,]+\.?\d*)",
    @"Grand Total:?\s*\$?\s*([\d,]+\.?\d*)",
    @"Amount Due:?\s*\$?\s*([\d,]+\.?\d*)" })
{
    var match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
    if (match.Success && decimal.TryParse(
        match.Groups[1].Value.Replace(",", ""), out var t))
    {
        total = t;
        break;
    }
}

// Tax
var taxMatch = Regex.Match(text,
    @"(?:Tax|Sales Tax|VAT):?\s*\$?\s*([\d,]+\.?\d*)",
    RegexOptions.IgnoreCase);
using IronOcr;
using System.Text.RegularExpressions;

var ocr    = new IronTesseract();
var result = ocr.Read("receipt.jpg");
var text   = result.Text;

// Vendor: first non-empty line, ordered by Y position
var vendor = result.Lines
    .OrderBy(l => l.Y)
    .Select(l => l.Text.Trim())
    .FirstOrDefault(t => !string.IsNullOrWhiteSpace(t) && t.Length > 3);

// Total: pattern matching against common receipt labels
decimal? total = null;
foreach (var pattern in new[] {
    @"Total:?\s*\$?\s*([\d,]+\.?\d*)",
    @"Grand Total:?\s*\$?\s*([\d,]+\.?\d*)",
    @"Amount Due:?\s*\$?\s*([\d,]+\.?\d*)" })
{
    var match = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
    if (match.Success && decimal.TryParse(
        match.Groups[1].Value.Replace(",", ""), out var t))
    {
        total = t;
        break;
    }
}

// Tax
var taxMatch = Regex.Match(text,
    @"(?:Tax|Sales Tax|VAT):?\s*\$?\s*([\d,]+\.?\d*)",
    RegexOptions.IgnoreCase);
Imports IronOcr
Imports System.Text.RegularExpressions

Dim ocr As New IronTesseract()
Dim result = ocr.Read("receipt.jpg")
Dim text = result.Text

' Vendor: first non-empty line, ordered by Y position
Dim vendor = result.Lines _
    .OrderBy(Function(l) l.Y) _
    .Select(Function(l) l.Text.Trim()) _
    .FirstOrDefault(Function(t) Not String.IsNullOrWhiteSpace(t) AndAlso t.Length > 3)

' Total: pattern matching against common receipt labels
Dim total As Decimal? = Nothing
For Each pattern In {
    "Total:?\s*\$?\s*([\d,]+\.?\d*)",
    "Grand Total:?\s*\$?\s*([\d,]+\.?\d*)",
    "Amount Due:?\s*\$?\s*([\d,]+\.?\d*)"
}
    Dim match = Regex.Match(text, pattern, RegexOptions.IgnoreCase)
    If match.Success AndAlso Decimal.TryParse(match.Groups(1).Value.Replace(",", ""), total) Then
        Exit For
    End If
Next

' Tax
Dim taxMatch = Regex.Match(text,
    "(?:Tax|Sales Tax|VAT):?\s*\$?\s*([\d,]+\.?\d*)",
    RegexOptions.IgnoreCase)
$vbLabelText   $csharpLabel

レイアウトが特殊だったり、印刷が薄れていたりするレシートの場合、IronOCRの前処理フィルターによって、抽出実行前に元のデータの精度が向上します。 実際のレシートスキャン画像の品質補正については、画像品質補正ガイドおよび画像色補正ガイドを参照してください。

非同期処理から同期処理への移行の処理

VeryfiのAPIはすべて非同期処理に対応しています。 IronOCRの主な処理方法は同期型です。 アプリケーションコード内の既存の非同期メソッドシグネチャは、以下のようにラップすることで維持できます。

// Preserve async signature during transition
public async Task<ReceiptResult> ProcessReceiptAsync(string path)
{
    // Run IronOCR on a background thread
    return await Task.Run(() =>
    {
        var result = _ocr.Read(path);
        return new ReceiptResult
        {
            Vendor = result.Lines.FirstOrDefault()?.Text,
            Total  = ExtractTotal(result.Text),
            Date   = ExtractDate(result.Text)
        };
    });
}
// Preserve async signature during transition
public async Task<ReceiptResult> ProcessReceiptAsync(string path)
{
    // Run IronOCR on a background thread
    return await Task.Run(() =>
    {
        var result = _ocr.Read(path);
        return new ReceiptResult
        {
            Vendor = result.Lines.FirstOrDefault()?.Text,
            Total  = ExtractTotal(result.Text),
            Date   = ExtractDate(result.Text)
        };
    });
}
Imports System.Threading.Tasks

Public Async Function ProcessReceiptAsync(path As String) As Task(Of ReceiptResult)
    ' Run IronOCR on a background thread
    Return Await Task.Run(Function()
                              Dim result = _ocr.Read(path)
                              Return New ReceiptResult With {
                                  .Vendor = result.Lines.FirstOrDefault()?.Text,
                                  .Total = ExtractTotal(result.Text),
                                  .Date = ExtractDate(result.Text)
                              }
                          End Function)
End Function
$vbLabelText   $csharpLabel

高スループットのシナリオでは、IronOCRはスレッドセーフであり、複数のIronTesseractインスタンスが同期なしでドキュメントを並行して処理できます。 速度最適化ガイドでは、インスタンスの再利用パターンとバッチロード戦略について解説し、大規模な処理時間を最小限に抑える方法を説明します。

認証情報のクリーンアップ

Veryfiは、ApiKeyの四つの認証情報を必要とします。 移行後、これら4つすべてを構成ファイル、環境変数、キー保管庫、およびCI/CDパイプラインから削除する必要があります。 IronOCRには単一のライセンスキー文字列が必要です。 移行チェックリスト:すべての環境から四つのVeryfiシークレットを削除し、単一のIRONOCR_LICENSE環境変数を追加し、Veryfiの認証情報注入を削除するためにデプロイパイプラインを更新します。

請求書のPDF処理

VeryfiはProcessDocumentAsyncを介してPDFバイトを受け付けます。 IronOCRはOcrInput.LoadPdf()を通じてPDFをネイティブに処理します:

// Multi-page invoice PDF — all pages processed locally
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");

var result       = new IronTesseract().Read(input);
var invoiceText  = result.Text;
var invoiceNumber = Regex.Match(invoiceText,
    @"Invoice\s*#?\s*:?\s*(\w+[-\w]*)",
    RegexOptions.IgnoreCase).Groups[1].Value;
// Multi-page invoice PDF — all pages processed locally
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");

var result       = new IronTesseract().Read(input);
var invoiceText  = result.Text;
var invoiceNumber = Regex.Match(invoiceText,
    @"Invoice\s*#?\s*:?\s*(\w+[-\w]*)",
    RegexOptions.IgnoreCase).Groups[1].Value;
Imports System.Text.RegularExpressions
Imports IronOcr

' Multi-page invoice PDF — all pages processed locally
Dim input As New OcrInput()
input.LoadPdf("invoice.pdf")

Dim result = New IronTesseract().Read(input)
Dim invoiceText As String = result.Text
Dim invoiceNumber As String = Regex.Match(invoiceText, _
    "Invoice\s*#?\s*:?\s*(\w+[-\w]*)", _
    RegexOptions.IgnoreCase).Groups(1).Value
$vbLabelText   $csharpLabel

検索可能なPDFアーカイブを生成する請求書ワークフローでは、IronOCRのSaveAsSearchablePdf()メソッドがスキャン入力からPDF/A互換の出力を生成します——これはVeryfiのクラウドAPIが提供しない機能です。"検索可能なPDFガイド"で実装の詳細をご確認ください。

IronOCRの追加機能

IronOCRは、主要な比較領域以外にも、Veryfiの範囲を完全に超える機能を提供しています。

-テーブル抽出グリッドレイアウトを持つ文書から構造化されたテーブルを読み取る機能。銀行取引明細書や明細付き請求書に適用可能。 -手書き文字認識 Veryfiの事前学習済みモデルでは処理できない手書きのメモ、署名、手書きのフォームフィールドを処理します。

  • MICR/小切手読み取り小切手処理ワークフロー専用のMICR行抽出機能により、ルーティング番号と口座番号の抽出はオンプレミスで行われます。
  • hOCRエクスポート OCR結果をhOCR(位置情報付きHTML)としてエクスポートし、下流の文書解析パイプラインに提供する。 -進捗状況の追跡リモートAPIをポーリングすることなく、長時間実行されるバッチジョブの処理進捗状況を監視できます。 -パスポートとIDの読み取りオンボーディングおよびKYCワークフローのために、パスポートと身分証明書から機械読み取り可能なゾーンデータを抽出します。
  • AWSおよびAzureへのデプロイクラウドインフラストラクチャにデプロイしながら、ドキュメント処理は自社のクラウドアカウント内で完結します。外部のSaaSデータ処理業者がコンプライアンス範囲に追加されることはありません。

.NETの互換性と将来の準備

IronOCRは、.NET 8、 .NET 9、そして今後リリースされる.NET 10に加え、レガシー互換性のために.NET Standard 2.0以降にも対応しています。 Windows x64/x86、Linux x64、macOS、およびARM64で動作し、Dockerコンテナ、Azure App Service、AWS Lambda、オンプレミスのLinuxサーバーなど、最新 for .NET展開ターゲットすべてを網羅しています。 単一パッケージ展開モデルでは、環境間でのネイティブなバイナリ管理は不要です。 同じNuGet参照は、サポートされているすべてのプラットフォームで正しく解決されます。 VeryfiのC# SDKは.NET Standardをターゲットとしており、HTTPクライアントラッパーとして機能するため、その"互換性"はOCRエンジンの深度ではなく、主にHTTPスタックに依存します。この違いは、プラットフォームの制約やネットワークの制限が関係する場合に重要になります。

結論

Veryfiは、特定の課題を迅速に解決します。経費精算書を提出し、解析ロジックを記述することなく、構造化されたJSONフィールドを受け取ることができます。 クラウドデータ伝送が許容される環境における小規模な経費自動化においては、その提案は真に価値がある。 摩擦が生じるのは、文書1件あたりのコストが数週間で永久ライセンスの費用を上回ってしまうほど処理量が増加する場合、文書の種類がVeryfiの学習済みカテゴリを超える場合、コンプライアンス要件によって第三者による財務文書処理が非現実的になる場合、あるいはアプリケーションがインターネット接続なしで動作する必要がある場合などです。

4つの認証情報を使用する認証モデル、非同期専用のAPI、レート制限、バッチ処理を停止させるHTTP 402決済失敗、そしてすべての抽出ロジックを単一のベンダーに結びつける独自のJSONスキーマ――これらは例外的な問題ではありません。 これらは、Veryfiを大規模に本番環境で運用しているチームにとって、日々の運用上の現実です。

IronOCR、Veryfiが自動的に処理する抽出パターンを作成する必要があります。 これは実際の開発コストです。領収書や請求書の正規表現抽出機能を構築するには、文書の種類にもよりますが、8~24時間かかることを想定してください。 しかし、その投資は一度きりだ。 生成されたコードは、お客様のインフラストラクチャ上で動作し、あらゆる種類のドキュメントを処理し、オフラインでも動作し、ドキュメントごとに費用は一切かかりません。 銀行取引明細書、ルーティング番号、口座番号、取引履歴は、お客様のサーバーから外部に送信されることはありません。

金融サービス、医療、防衛関連契約、法律サービスなど、経費書類をサードパーティのクラウドに送信することがコンプライアンス上の問題となるあらゆる分野のチームにとって、 IronOCRはそうした議論を完全に不要にします。 現在Veryfiに月額5,000ドルから20,000ドルを費やしているチームにとって、計算は簡単だ。 経費精算書以外の汎用OCRを必要とするチームにとって、選択肢は明確です。クラウド専門のサービスとローカルの汎用ライブラリは同等のツールではなく、後者の1回限りのライセンス費用で、前者では文書ごとの料金では提供できない無制限の柔軟性を手に入れることができます。

ご注意TesseractとVeryfiはそれぞれの所有者の登録商標です。 このサイトはGoogleまたはVeryfiによって提携、承認、または後援されているわけではありません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

よくある質問

Veryfi OCR APIとは何ですか?

Veryfi OCR APIは、開発者や企業が画像や文書からテキストを抽出するために使用するOCRソリューションです。.NETアプリケーション開発のためにIronOCRとともに評価されるいくつかのOCRオプションの一つです。

IronOCRはVeryfi OCR API for .NET開発者と比べてどうですか?

IronOCRはNuGetネイティブ for .NET OCRライブラリで、IronTesseractをコアエンジンとして使用しています。Veryfi OCR APIと比較して、よりシンプルなデプロイメント(SDKインストーラーなし)、定額価格、COMインターオプやクラウド依存のないクリーンなC# APIを提供します。

IronOCRはVeryfi OCR APIよりセットアップが簡単ですか?

IronOCRは単一のNuGetパッケージでインストールされます。SDKインストーラー、ライセンスファイルのコピー、COMコンポーネントの登録、ランタイムバイナリの管理は必要ありません。OCRエンジン全体がパッケージにバンドルされています。

Veryfi OCR APIとIronOCRにはどのような精度の違いがありますか?

IronOCRは、標準的なビジネス文書、請求書、領収書、スキャンしたフォームに対して高い認識精度を達成します。高度に劣化した文書や一般的でないスクリプトの場合、精度はソースの品質によって異なります。IronOCRは低品質入力の認識を向上させる画像前処理フィルターを含んでいます。

IronOCRはPDFテキスト抽出をサポートしていますか?

IronOCRは、ネイティブPDFとスキャンしたPDFイメージの両方から、一回の呼び出しでテキストを抽出します。また、複数ページのTIFFファイル、画像、ストリームもサポートします。スキャンしたPDFの場合、OCRはページごとに適用され、ページごとの結果オブジェクトを持ちます。

Veryfi OCR APIライセンスは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はVeryfiと違い、Dockerやコンテナ化されたデプロイメントに適していますか?

IronOCRはNuGetパッケージによってDockerコンテナで動作します。ライセンスキーは環境変数で設定します。OCRエンジン自体にはライセンスファイル、SDKパス、ボリュームマウントは必要ありません。

Veryfiと比較して、購入前にIronOCRを試すことはできますか?

IronOCRのトライアルモードでは、ドキュメントを処理し、出力に透かしをオーバーレイしたOCR結果を返します。ライセンスを購入する前に、ご自身の文書で精度を確認することができます。

IronOCRはテキスト抽出とバーコード読み取りをサポートしていますか?

IronOCRはテキスト抽出とOCRに重点を置いています。バーコード読み取りについては、Iron SoftwareはIronBarcodeをコンパニオンライブラリとして提供しています。どちらも個別に、あるいはIron Suiteのバンドルとして提供されています。

Veryfi OCR APIからIronOCRへの移行は簡単ですか?

Veryfi OCR APIからIronOCRへの移行は通常、初期化シーケンスをIronTesseractのインスタンス生成に置き換え、COMライフサイクル管理を削除し、APIコールを更新します。ほとんどの移行はコードの複雑さを大幅に軽減します。

Kannaopat Udonpant
ソフトウェアエンジニア
ソフトウェアエンジニアになる前に、Kannapatは北海道大学で環境資源の博士号を修了しました。博士号を追求する間に、彼はバイオプロダクションエンジニアリング学科の一部である車両ロボティクスラボラトリーのメンバーになりました。2022年には、C#のスキルを活用してIron Softwareのエンジニアリングチームに参加し、IronPDFに注力しています。Kannapatは、IronPDFの多くのコードを執筆している開発者から直接学んでいるため、この仕事を大切にしています。同僚から学びながら、Iron Softwareでの働く社会的側面も楽しんでいます。コードやドキュメントを書いていない時は、KannapatはPS5でゲームをしたり、『The Last of Us』を再視聴したりしていることが多いです。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね