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

应该选择哪款 Tesseract OCR 库?开发者对三大顶级选项的比较

Veryfi 每次您调用 _client.ProcessDocumentAsync(bytes) 时,会将您的银行帐号、路由号码、交易金额和供应商关系发送到第三方云服务器。 这就是定义整个 非常 评估的架构现实:在返回一行结构化 JSON 数据之前,您的费用文档(其中包含您组织中最敏感的一些财务数据)就已经离开了您的基础设施。 对很多球队来说,评估到此就结束了。

了解 Veryfi

Veryfi 是一款基于云端的文档智能 API,专为费用和财务文档类型而设计。该产品的核心优势在于结构化输出:Veryfi API 调用返回的是预先提取的字段,而非需要后续解析的原始 OCR 文本,这些字段包括供应商名称、总计、明细项目、税额、支付卡后四位,以及发票的银行账号和路由号码。 这些模型经过大量金融文档的预训练,并声称在其支持的文档类别上准确率超过 99%。

该架构完全基于云。 每个文档都会从您的应用程序流出,通过 HTTPS 传输到 非常 的服务器,经过他们的 AI/ML 管道,然后以 JSON 格式返回。 没有本地部署选项,没有物理隔离模式,也无法在不将文档传输到外部的情况下处理文档。

主要架构特征:

  • 仅限云处理:所有文档上传到 api.veryfi.com,不进行本地处理
  • 四重凭证认证:VeryfiClient 需要 usernameapiKey 四个密码来管理、安全存储和轮替
  • 按文档定价:联系 非常 获取当前按文档类型和体积层定价
  • 仅异步 API:ProcessDocumentAsync 是主要方法; 没有同步路径 -专业文件范围:收据、发票、支票、银行对账单、W-2 表格和名片; 一般文件、医疗记录、合同和技术图纸不在可靠承保范围内。 -专有 JSON 模式: 非常 的响应格式是 非常 特有的; 切换供应商需要重写提取逻辑 -速率限制:高容量处理需要退避和重试逻辑来处理 HTTP 429 响应

非常 收据处理

Veryfi SDK 仅公开了一种主要的文档处理方法:

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 模式传输通常包含银行帐号、路由号码、供应商税号和付款条款的文档:

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

银行对账单端点是最敏感的。调用 ProcessDocumentAsynccategories: new[] { "bank_statements" } 向 非常 的基础设施传输完整的帐号、路由号码、完整的交易历史、开闭余额和电汇详情。

了解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——一个软件包即可覆盖所有目标平台

功能对比

特征 非常 IronOCR
数据位置 非常 云服务器 您的基础设施
部署模型 仅限云 API 本地部署
定价模式 每文档(联系 非常 获取定价) 永久许可证 ($5,999)
离线支持
文件范围 仅需费用凭证 任何文档类型
设置 4. API凭证 1 个许可证密钥

详细功能对比

特征 非常 IronOCR
数据隐私
文件离开基础设施 是的(每次通话) 绝不
气隙部署 不可能 完全支持
本地处理 不可能 默认行为
符合 HIPAA 标准(无需 BAA) 否(BAA 要求)
符合ITAR/CMMC要求 复杂
文档支持
收据处理 是的(专业) 是的(通过OCR+提取)
发票处理 是的(专业) 是的(通过OCR+提取)
银行对账单处理 是的(专业) 是的(通过OCR+提取)
一般商业文件 结果不佳
医疗记录 不支持
法律合同 有限的
自定义/任意文档类型 需要带薪培训 任何类型的
多页PDF
技术的
需要联网 是的(每份文件)
同步 API 可用
图像预处理 自动(云端) 自动(本地)
PDF 输入(原生)
可搜索的 PDF 输出
条形码读取
基于区域的OCR
置信度评分 每字段 按字数和总体
开发
管理凭证 4(客户端 ID、客户端密钥、用户名、API 密钥) 1(许可证密钥)
单元测试的复杂性 需要模拟 HTTP 直接本地测试
错误处理 HTTP 状态码 + VeryfiApiException 本地.NET异常
语言支持 有限的 125 种以上语言
成本
成本上限 没有合同上限则无 许可价格
高产量下的成本 呈线性比例 平坦的

金融文件的数据隐私

Veryfi 处理的财务文件包含任何组织中最敏感的数据类别。 这不是理论上的问题,而是关于产品如何运作的具体架构事实。

非常 方法

每次 非常 API 调用通过 HTTPS 将文档字节传输到 api.veryfi.com。 从这些文档中提取的数据(账号、路由号码、交易历史记录、供应商税务 ID、支付卡详细信息和消费模式)由 非常 的基础设施进行处理。 数据驻留、保留政策、子处理链和违规响应程序均受 非常 的条款约束,而不是您的条款约束。

// 银行对账单处理 — 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(附带业务伙伴协议)认证。 这些认证证实 非常 遵循其既定的安全规范。 这并不意味着您的数据始终在您的控制之下,您可以控制数据的存储位置,或者 非常 的子处理者没有访问权限。 对于符合 CMMC 2 级以上、ITAR、SOX 或 GLBA 标准的组织而言,将 非常 添加为数据处理者会引入合规范围,需要进行法律审查和持续监督。

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

Veryfi 对文档的关注点较为狭窄,这既是它最大的优势,也是它最大的局限性。 预训练模型能够针对其所针对的特定文档类型,提供真正快速、结构化的结果。 当您的组织需要在该列表之外的 OCR 时,问题就出现了。

非常 方法

Veryfi 在其领域内表现出色。 提交收据图片,回复将包含供应商、总计、税额、付款方式和明细项目——您无需输入正则表达式。 但其范围仅限于费用和财务文件。 README 文件直接记录了这一点:一般商业文档、医疗记录、技术图纸、多语言文档以及训练集之外的自定义表单类型会产生较差的结果,或者需要付费的自定义模型训练。

现实中的组织很少只处理一种文档类别。 人力资源部门负责处理员工入职表格。 法务团队需要合同文本。 运营团队负责处理货运单据和物流表格。 非常 范围之外的每个类别都会强制引入第二个解决方案:

// 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按文件收费。 收费根据文档类型和体积层而定——联系 非常 获取当前定价。 成本以与量成正比的直接方式增长,除非您通过合同协商了一个上限,并且无论您成为顾客多长时间,后续年度没有减少。

// 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 覆盖 10 名开发者,每月处理无限文档,不需要续费即可继续处理。 第二年的手续费为 0 美元。 第 5 年的处理费用为 0 美元。

// 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 小时开发时间以建立提取模式,而 非常 的费用随着每个处理的文件积累。 根据数量,在使用的前几个月内通常会实现收支平衡。

对于目前在云 OCR 上投入资金的团队, IronOCR许可页面涵盖了层级详情以及适用于喜欢按年计费的团队的 SaaS 订阅选项。

Webhook 和异步处理与同步本地结果

Veryfi 的云架构采用纯异步处理模型。 文档会传输到远程服务器,由远程管道处理,经过一次网络往返后返回响应。对于大批量处理,Veryfi 建议使用基于 Webhook 的通知机制,而不是轮询。 IronOCR默认采用同步处理方式,循环中不依赖网络。

非常 方法

由于 非常 基于云端,因此所有 非常 处理都是异步的。 ProcessDocumentAsync 方法启动 HTTP 调用,等待 非常 的流水线完成,并返回结果。 总延迟包括网络传输、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() 返回后立即可用,无需轮询、网络钩子配置或网络失败的重试逻辑。

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 还支持通过 Task.Run 包装或异步 API 表面进行异步 OCR。 区别在于IronOCR中的 async 是一种并发模式,而不是远程调用所要求的。 凌晨 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) 通过 Regex
response.Date ExtractDate(result.Text) 通过 Regex
response.LineItems result.Lines 通过位置提取
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) 标准.NET异常(本地异常,无网络异常代码)
上传前进行 Base64 编码 不需要 — ocr.Read(filePath) 直接接受文件路径
配置中的四个凭据 单许可证密钥

当团队考虑从 非常 迁移到IronOCR时

数据主权不容谈判

评估IronOCR的最常见触发因素是合规性审计或法律审查,这些审计或审查发现 非常 是敏感财务记录的数据处理者。 根据 HIPAA 评估,包含 PHI 的费用单据需要与 非常 签订业务伙伴协议,并接受持续的审计监督。 CMMC二级评估发现,云端传输的财务文件存在潜在安全漏洞。法律团队建议不要将客户案件费用数据发送给第三方。 在每种情况下,实现合规的途径都是消除外部数据传输——这意味着用本地 OCR 取代 Veryfi。IronOCR的本地处理模型默认满足这些要求:无需 BAA,无需子处理器链,无需第三方审计范围。

文件类型不再局限于费用

采用 非常 进行费用自动化的组织通常会在 6-12 个月内发现,相邻团队需要对 非常 训练集之外的文档进行 OCR 识别。 人力资源部需要处理入职表格。 已提取法律需求合同文本。 运营部门需要采集提单数据。 每增加一个文档类别,Veryfi 的通用端点要么会产生较差的结果,要么需要付费的自定义模型训练,要么会强制在基础架构中引入第二个 OCR 解决方案。 一个IronOCR许可证即可通过同一个 API 处理所有这些操作。 针对特定文档的读取教程涵盖了结构化表单布局的提取策略。

单份文档成本超过商业案例阈值

每月处理 25,000 份或更多文档的团队通常会发现IronOCR 的投资回收期不到三个月。 在高文档量时,IronOCR 专业版许可证在 $2,999 通常在等值 非常 支出后的第一个月内就会收回成本。 财务团队在对按文档计费的云定价进行总体拥有成本分析时,必然会得出这样的比较结果。 迁移工作(为团队需要的特定字段构建正则表达式提取模式)通常需要 8 到 24 小时,具体取决于文档的复杂性和工作流程中不同文档类型的数量。

离线和断网环境

现场服务机构、远程工作地点、移动费用采集应用程序和与互联网隔离的政府环境都有一个共同的要求:OCR 必须在没有互联网的情况下工作。 非常 的架构无法满足这一要求——如果没有网络连接,每次文档处理调用都会失败。 IronOCR处理过程是离线进行的。 现场技术人员使用移动费用应用程序、制造工厂使用防火墙网络、国防承包商在保密信息设施 (SCIF) 中工作,所有这些人员都可以在不进行任何修改的情况下运行IronOCR 。 Docker 部署指南Linux 部署指南涵盖了网络出口受限的容器化环境。

供应商锁定和模式依赖

Veryfi 的 JSON 响应模式是专有的。 每一行读取供应商名称、总计、路由号码或行项目字段的提取代码都只能与 非常 一起使用。 切换到竞争对手的云 API 或本地部署解决方案,需要重写所有提取逻辑。 与 非常 签订多年合同的组织在价格变化或产品路线图调整时会发现这种依赖性。 IronOCR提取逻辑使用标准的.NET正则表达式从原始文本中读取——可移植,不与任何供应商的架构耦合。

常见迁移注意事项

用模式提取代替结构化输出

Veryfi 返回预先解析的字段; IronOCR返回原始 OCR 文本。 迁移工作是将 非常 在其云端执行的提取模式写入到现有系统中。 对于格式一致的收据和发票,这很简单:

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)
{
    // RunIronOCRon 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)
{
    // RunIronOCRon 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 需要四个凭证:UsernameApiKey。 迁移后,必须从配置文件、环境变量、密钥库和 CI/CD 管道中删除这四个参数。 IronOCR需要一个许可证密钥字符串。 迁移清单:从每个环境中删除所有四个 非常 密钥,添加一个 IRONOCR_LICENSE 环境变量,并更新部署流水线以去除 非常 凭证注入。

发票的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 兼容输出——这是 非常 的云 API 无法提供的功能。请参阅可搜索 PDF 指南以获取实施细节。

其他IronOCR功能

除了核心比较领域之外, IronOCR还提供了一些完全超出 非常 范围的功能:

-表格提取从网格布局的文档中读取结构化表格,适用于银行对账单和明细发票 -手写识别处理 非常 预训练模型无法处理的手写笔记、签名和表单字段。

  • MICR/支票读取专用于支票处理工作流程的MICR行提取,将路由和账号提取保留在本地。
  • hOCR导出将OCR结果导出为hOCR(包含位置数据的HTML),以便用于下游文档分析流程。 -进度跟踪无需轮询远程 API 即可监控长时间运行的批处理作业的处理进度 -护照和身份证件读取从护照和身份证件中提取机读区数据,用于用户注册和KYC工作流程
  • AWS 和 Azure 部署部署到云基础设施,同时将文档处理保留在您自己的云帐户中——无需在您的合规范围内添加任何外部 SaaS 数据处理器。

.NET兼容性和未来准备情况

IronOCR 的目标平台是.NET 8、 .NET 9 和即将推出的.NET 10,同时为了兼容旧版本,也支持.NET Standard 2.0+。 它可在 Windows x64/x86、Linux x64、macOS 和 ARM64 上运行,涵盖所有现代.NET部署目标,包括 Docker 容器、Azure 应用服务、AWS Lambda 和本地 Linux 服务器。 单包部署模型意味着无需跨环境进行原生二进制文件管理; 同一个NuGet引用在所有受支持的平台上都能正确解析。 非常 的 C# SDK 面向.NET Standard ,并作为 HTTP 客户端包装器运行,这意味着它的"兼容性"主要取决于 HTTP 堆栈,而不是 OCR 引擎的深度——当平台限制或网络限制发挥作用时,这种区别就变得非常重要了。

结论

Veryfi 快速解决了一个具体问题:提交费用单据,无需编写解析逻辑即可接收结构化的 JSON 字段。 对于可接受云数据传输的环境中的小规模费用自动化而言,该方案具有真正的价值。 当文件量增长到单份文件成本在几周内超过永久许可证费用,当文件类型超出 非常 的训练类别,当合规性要求使第三方金融文件处理不切实际,或者当应用程序需要在没有互联网访问的情况下运行时,摩擦就会出现。

四凭证认证模型、仅异步 API、速率限制、导致批量处理停止的 HTTP 402 支付失败以及将所有提取逻辑耦合到单个供应商的专有 JSON 模式——这些都不是边缘情况问题。 对于大规模在生产环境中运行 非常 的团队来说,这些都是日常运营中面临的现实问题。

IronOCR需要编写提取模式,而 非常 可以自动处理这些模式。 这是实际的开发成本:根据文档种类,构建收据和发票的正则表达式提取功能预计需要 8-24 小时。 但这项投资只需进行一次。 生成的代码可在您的基础设施上运行,处理任何文档类型,可离线运行,且每个文档不收取任何费用。 银行对账单、路由号码、账号和交易记录永远不会离开您的服务器。

对于金融服务、医疗保健、国防承包或法律服务等行业的团队——任何将费用文件发送到第三方云平台涉及合规性的领域IronOCR方案完全消除了这种合规性问题。 对于目前每月在 非常 上花费 5,000 至 20,000 美元的团队来说,计算很简单。 对于需要通用 OCR 功能(不仅限于费用文档)的团队来说,选择很明确:云专家和本地通用库并非等效工具,后者的一次性许可费用可以购买前者无法以任何文档价格提供的无限灵活性。

请注意Tesseract 和 非常 是各自所有者的注册商标。 本网站与 Google 或 非常 无关、不被其认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

常见问题解答

什么是 Veryfi OCR API?

Veryfi OCR API 是一款 OCR 解决方案,开发者和企业可以使用它从图像和文档中提取文本。它是与 IronOCR 一起评估的几种适用于 .NET 应用程序开发的 OCR 方案之一。

IronOCR 与 Veryfi OCR API 在 .NET 开发人员中相比如何?

IronOCR 是一个基于 NuGet 的 .NET OCR 库,其核心引擎是 IronTesseract。与 Veryfi OCR API 相比,它部署更简便(无需 SDK 安装程序),采用统一价格模式,并提供简洁的 C# API,无需 COM 互操作或云依赖。

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 安装程序。

与 Veryfi 不同,IronOCR 是否适用于 Docker 和容器化部署?

是的。IronOCR 通过 NuGet 包在 Docker 容器中运行。许可证密钥通过环境变量设置。OCR 引擎本身不需要任何许可证文件、SDK 路径或卷挂载。

我可以在购买前试用 IronOCR,并将其与 Veryfi 进行比较吗?

是的。IronOCR 试用模式可以处理文档,并在输出结果上添加水印,从而生成 OCR 结果。您可以在购买许可证之前,先在自己的文档上验证其准确性。

IronOCR是否支持条形码读取和文本提取?

IronOCR专注于文本提取和OCR识别。对于条形码读取,Iron Software提供了配套库IronBarcode。两者都可单独购买,也可作为Iron Suite套装的一部分购买。

从 Veryfi OCR API 迁移到 IronOCR 容易吗?

从 Veryfi OCR API 迁移到 IronOCR 通常涉及将初始化序列替换为 IronTesseract 实例化、移除 COM 生命周期管理以及更新 API 调用。大多数迁移都能显著降低代码复杂度。

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

钢铁支援团队

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