跳過到頁腳內容
使用 IRONOCR

.NET OCR SDK:一個用於 C# 的文字辨識庫

.NET OCR SDK是一個軟體開發工具包,它允許 C# 和 .NET 應用程式以程式設計方式從圖像、掃描的 PDF 和其他文件格式中提取文字。 IronOCR 是一款可用於生產的 .NET OCR SDK,它封裝了一個經過優化的 Tesseract 5 引擎,具有預處理過濾器、條碼讀取、可搜尋的 PDF 輸出以及對 125 多種語言的支援——所有這些都可以透過簡潔的 C# API 訪問,該 API 可在 Windows、Linux、macOS 和雲端平台上運行。

為什麼 IronOCR 是您專案的理想 .NET OCR SDK?

從零開始建立文字辨識意味著管理圖像預處理流程、語言資料檔案、線程模型和輸出解析——在提取第一個單字之前,需要數月的工作。 IronOCR 透過提供經過實戰檢驗的引擎來消除這種額外開銷,您的團隊可以在幾分鐘內將其添加到專案中。

它與原始 Tesseract 綁定程式的主要區別在於以下幾個方面:

  • 可辨識125 種以上語言和文字,包括手寫文本
  • 內建濾鏡:降噪、去斜、二值化、解析度增強和對比校正
  • 在同一次讀取過程中偵測條碼和二維碼
  • 產生具有不可見文字圖層的可搜尋 PDF,適用於歸檔工作流程
  • 用於高通量流水線的非同步和平行批處理
  • 採用區域OCR技術,針對特定頁面區域進行識別,以縮短處理時間
  • 支援Windows、Linux、macOS、Docker 和 Azure 等跨平台系統

根據Tesseract OCR 專案文檔,原始 Tesseract 需要手動配置語言包、DPI 設定和輸出模式。 IronOCR 會自動處理所有這些操作,讓您可以專注於提取的文字的含義,而不是如何提取它。

IronOCR 與 Raw Tesseract 相比如何?

透過 P/Invoke 包裝器或 Tesseract NuGet 套件使用原始 Tesseract 會讓您負責:下載和放置 tessdata 語言檔案、選擇正確的頁面分割模式、自行處理多頁 TIFF 和 PDF 分割,以及如果您想要並行處理,則需要連接執行緒。 這些細節並非貴公司獨有的問題。

IronOCR包裹了所有這些管道。 您將獲得類型化的 API 介面、自動 tessdata 管理、內建 PDF 分割和重組功能,以及可在多個請求中重複使用的執行緒安全引擎。 權衡之下,生產用途需要付費許可——許可頁面顯示了當前的定價層級,其中包括免費的開發許可。

對於只需要開源依賴項的團隊來說,原始的 Tesseract 加上自訂預處理是一種可行的方法。 對於需要快速交付可靠 OCR 的團隊來說,IronOCR 將整合式介面簡化為幾行 C# 程式碼。

如何安裝 IronOCR .NET SDK?

安裝透過 NuGet 進行,NuGet 是標準的 .NET 套件管理器。 在專案目錄中執行以下命令:

Install-Package IronOcr

對於 Visual Studio 用戶,請在 NuGet 套件管理器 GUI 中搜尋 IronOcr,然後從那裡安裝。 有關包括手動 DLL 引用在內的完整安裝選項,請參閱IronOCR 安裝文件

安裝完成後,將許可證金鑰新增至您的應用程式啟動項目或 appsettings.json。 您可以開始免費試用,取得試用金鑰,在評估期間解鎖所有功能。

驗證安裝

安裝完成後快速檢查一下,確認所有線路連接正確。 建立一個面向 .NET 10 的控制台應用程式:

using IronOcr;

// Minimal smoke test -- reads a single image and prints extracted text
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("sample.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;

// Minimal smoke test -- reads a single image and prints extracted text
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("sample.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

' Minimal smoke test -- reads a single image and prints extracted text
Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("sample.png")
    Dim result = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

如果控制台中出現文本,則表示 SDK 已安裝且許可證金鑰有效。 您已準備好建置生產工作流程。

如何在 C# 中從圖像和 PDF 中提取文字?

核心提取模式在所有輸入類型中都是一致的。您建立一個 IronTesseract 實例,將內容載入到 OcrInput 物件中,然後呼叫 Read()。 IronOCR 可以根據檔案副檔名自動偵測檔案格式,因此相同的程式碼路徑可以處理 JPEG、PNG、TIFF、BMP 和多頁 PDF 檔案。

using IronOcr;

// Reusable OCR service encapsulating the IronTesseract engine
public class OcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractText(string filePath)
    {
        using var input = new OcrInput();

        // LoadPdf for PDF files; LoadImage for raster formats
        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        return _ocr.Read(input).Text;
    }

    public async Task<string> ExtractTextAsync(string filePath)
    {
        using var input = new OcrInput();

        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        var result = await _ocr.ReadAsync(input);
        return result.Text;
    }
}
using IronOcr;

// Reusable OCR service encapsulating the IronTesseract engine
public class OcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractText(string filePath)
    {
        using var input = new OcrInput();

        // LoadPdf for PDF files; LoadImage for raster formats
        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        return _ocr.Read(input).Text;
    }

    public async Task<string> ExtractTextAsync(string filePath)
    {
        using var input = new OcrInput();

        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        var result = await _ocr.ReadAsync(input);
        return result.Text;
    }
}
Imports IronOcr

' Reusable OCR service encapsulating the IronTesseract engine
Public Class OcrService
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ExtractText(filePath As String) As String
        Using input As New OcrInput()
            ' LoadPdf for PDF files; LoadImage for raster formats
            If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(filePath)
            Else
                input.LoadImage(filePath)
            End If

            Return _ocr.Read(input).Text
        End Using
    End Function

    Public Async Function ExtractTextAsync(filePath As String) As Task(Of String)
        Using input As New OcrInput()
            If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(filePath)
            Else
                input.LoadImage(filePath)
            End If

            Dim result = Await _ocr.ReadAsync(input)
            Return result.Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

使用該服務的最高入口點:

using IronOcr;

var service = new OcrService();
string text = await service.ExtractTextAsync("invoice.pdf");
Console.WriteLine(text);
using IronOcr;

var service = new OcrService();
string text = await service.ExtractTextAsync("invoice.pdf");
Console.WriteLine(text);
Imports IronOcr

Dim service = New OcrService()
Dim text As String = Await service.ExtractTextAsync("invoice.pdf")
Console.WriteLine(text)
$vbLabelText   $csharpLabel

IronTesseract 實例是線程安全的,並且設計用於重複使用。 在應用程式啟動時建立一次(例如,透過 ASP.NET Core 中的依賴注入),而不是每次請求都實例化它。

對於多頁 PDF,result.Pages 可讓您逐頁存取文字、置信度分數和邊界框。 有關逐頁迭代的詳細信息,請參閱多頁 PDF OCR 指南

如何利用預處理濾波器提高OCR準確率?

平板掃描器、智慧型手機相機或傳真機掃描出的原始影像經常有雜訊、旋轉、對比度低和解析度不足等問題。 IronOCR 的影像品質校正流程透過在讀取呼叫之前連結有針對性的濾鏡來解決每個問題。

using IronOcr;

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

    public string ProcessLowQualityDocument(string filePath)
    {
        using var input = new OcrInput();

        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        // Chain preprocessing filters in order of operation
        input.DeNoise();              // Remove scan artifacts and speckling
        input.Deskew();               // Correct page tilt up to 35 degrees
        input.Scale(150);             // Enlarge small text for better recognition
        input.Binarize();             // Convert to black/white for cleaner edges
        input.EnhanceResolution(300); // Sharpen blurry or low-DPI input

        var result = _ocr.Read(input);

        // Confidence below 70 often signals a preprocessing mismatch
        if (result.Confidence < 70)
            Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)");

        return result.Text;
    }
}
using IronOcr;

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

    public string ProcessLowQualityDocument(string filePath)
    {
        using var input = new OcrInput();

        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        // Chain preprocessing filters in order of operation
        input.DeNoise();              // Remove scan artifacts and speckling
        input.Deskew();               // Correct page tilt up to 35 degrees
        input.Scale(150);             // Enlarge small text for better recognition
        input.Binarize();             // Convert to black/white for cleaner edges
        input.EnhanceResolution(300); // Sharpen blurry or low-DPI input

        var result = _ocr.Read(input);

        // Confidence below 70 often signals a preprocessing mismatch
        if (result.Confidence < 70)
            Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)");

        return result.Text;
    }
}
Imports IronOcr

Public Class AccuracyOptimizedOcr
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ProcessLowQualityDocument(filePath As String) As String
        Using input As New OcrInput()

            If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(filePath)
            Else
                input.LoadImage(filePath)
            End If

            ' Chain preprocessing filters in order of operation
            input.DeNoise()              ' Remove scan artifacts and speckling
            input.Deskew()               ' Correct page tilt up to 35 degrees
            input.Scale(150)             ' Enlarge small text for better recognition
            input.Binarize()             ' Convert to black/white for cleaner edges
            input.EnhanceResolution(300) ' Sharpen blurry or low-DPI input

            Dim result = _ocr.Read(input)

            ' Confidence below 70 often signals a preprocessing mismatch
            If result.Confidence < 70 Then
                Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)")
            End If

            Return result.Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

篩選器選擇指南:

  • DeNoise() -- 用於掃描過程中出現嚴重斑點或壓縮偽影的情況
  • Deskew() -- 以一定角度拍攝文件時使用; 請參閱頁面旋轉檢測以實現自動檢測
  • Scale() -- 用於小字或低於 150 DPI 的輸入; 通常情況下,數值在 150-200 之間能獲得最佳結果
  • Binarize() -- 用於彩色或漸層背景; 將影像轉換為純黑白影像
  • EnhanceResolution() -- 用於模糊或低對比文字; Tesseract 的最佳 DPI 為 300 DPI。

《國際文檔分析與識別期刊》上發表的研究一致表明,二值化和去斜是提高字元辨識率的兩個影響最大的預處理步驟。 將兩者作為任何生產流程的基準。

IronOCR 預處理濾波器及其主要應用案例
篩選 問題已解決 何時申請
DeNoise() 掃描器偽影、散斑雜訊 任何平板掃描器或傳真掃描儀
Deskew() 頁面傾斜和旋轉 拍攝或錯置的文件
Scale() 小字或低DPI 輸入解析度低於 150 DPI
Binarize() 彩色背景,漸變 彩色紙張或附浮水印的表格
EnhanceResolution() 模糊和低對比度 相機拍攝並壓縮成JPEG格式

如何建構生產批量處理流水線?

單一文件的提取很簡單,但生產場景涉及成百上千個文件到達佇列、共用資料夾或雲端儲存。 IronOCR 的非同步 API 和執行緒安全引擎使其適用於並行工作負載。

using IronOcr;
using Microsoft.Extensions.Logging;

public class ProductionOcrService
{
    private readonly IronTesseract _ocr;
    private readonly ILogger<ProductionOcrService> _logger;

    public ProductionOcrService(ILogger<ProductionOcrService> logger)
    {
        _logger = logger;
        _ocr = new IronTesseract
        {
            Configuration =
            {
                RenderSearchablePdfsAndHocr = true,
                ReadBarCodes = true
            }
        };
    }

    public async Task<IReadOnlyList<string>> ProcessBatchAsync(
        IEnumerable<string> filePaths,
        int maxDegreeOfParallelism = 4)
    {
        var results = new System.Collections.Concurrent.ConcurrentBag<string>();

        var options = new ParallelOptions
        {
            MaxDegreeOfParallelism = maxDegreeOfParallelism
        };

        await Parallel.ForEachAsync(filePaths, options, async (filePath, ct) =>
        {
            try
            {
                using var input = new OcrInput();

                if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
                    input.LoadPdf(filePath);
                else
                    input.LoadImage(filePath);

                var result = await _ocr.ReadAsync(input);
                results.Add(result.Text);
                _logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence",
                    filePath, result.Confidence);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "OCR failed for {FilePath}", filePath);
                results.Add(string.Empty);
            }
        });

        return results.ToList();
    }

    public void CreateSearchablePdf(string inputPath, string outputPath)
    {
        using var input = new OcrInput();

        if (inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(inputPath);
        else
            input.LoadImage(inputPath);

        _ocr.Read(input).SaveAsSearchablePdf(outputPath);
        _logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath);
    }
}
using IronOcr;
using Microsoft.Extensions.Logging;

public class ProductionOcrService
{
    private readonly IronTesseract _ocr;
    private readonly ILogger<ProductionOcrService> _logger;

    public ProductionOcrService(ILogger<ProductionOcrService> logger)
    {
        _logger = logger;
        _ocr = new IronTesseract
        {
            Configuration =
            {
                RenderSearchablePdfsAndHocr = true,
                ReadBarCodes = true
            }
        };
    }

    public async Task<IReadOnlyList<string>> ProcessBatchAsync(
        IEnumerable<string> filePaths,
        int maxDegreeOfParallelism = 4)
    {
        var results = new System.Collections.Concurrent.ConcurrentBag<string>();

        var options = new ParallelOptions
        {
            MaxDegreeOfParallelism = maxDegreeOfParallelism
        };

        await Parallel.ForEachAsync(filePaths, options, async (filePath, ct) =>
        {
            try
            {
                using var input = new OcrInput();

                if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
                    input.LoadPdf(filePath);
                else
                    input.LoadImage(filePath);

                var result = await _ocr.ReadAsync(input);
                results.Add(result.Text);
                _logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence",
                    filePath, result.Confidence);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "OCR failed for {FilePath}", filePath);
                results.Add(string.Empty);
            }
        });

        return results.ToList();
    }

    public void CreateSearchablePdf(string inputPath, string outputPath)
    {
        using var input = new OcrInput();

        if (inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(inputPath);
        else
            input.LoadImage(inputPath);

        _ocr.Read(input).SaveAsSearchablePdf(outputPath);
        _logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath);
    }
}
Imports IronOcr
Imports Microsoft.Extensions.Logging
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

Public Class ProductionOcrService
    Private ReadOnly _ocr As IronTesseract
    Private ReadOnly _logger As ILogger(Of ProductionOcrService)

    Public Sub New(logger As ILogger(Of ProductionOcrService))
        _logger = logger
        _ocr = New IronTesseract With {
            .Configuration = New TesseractConfiguration With {
                .RenderSearchablePdfsAndHocr = True,
                .ReadBarCodes = True
            }
        }
    End Sub

    Public Async Function ProcessBatchAsync(filePaths As IEnumerable(Of String), Optional maxDegreeOfParallelism As Integer = 4) As Task(Of IReadOnlyList(Of String))
        Dim results = New ConcurrentBag(Of String)()

        Dim options = New ParallelOptions With {
            .MaxDegreeOfParallelism = maxDegreeOfParallelism
        }

        Await Parallel.ForEachAsync(filePaths, options, Async Function(filePath, ct)
            Try
                Using input As New OcrInput()
                    If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                        input.LoadPdf(filePath)
                    Else
                        input.LoadImage(filePath)
                    End If

                    Dim result = Await _ocr.ReadAsync(input)
                    results.Add(result.Text)
                    _logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence", filePath, result.Confidence)
                End Using
            Catch ex As Exception
                _logger.LogError(ex, "OCR failed for {FilePath}", filePath)
                results.Add(String.Empty)
            End Try
        End Function)

        Return results.ToList()
    End Function

    Public Sub CreateSearchablePdf(inputPath As String, outputPath As String)
        Using input As New OcrInput()
            If inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(inputPath)
            Else
                input.LoadImage(inputPath)
            End If

            _ocr.Read(input).SaveAsSearchablePdf(outputPath)
            _logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath)
        End Using
    End Sub
End Class
$vbLabelText   $csharpLabel

MaxDegreeOfParallelism 限制可防止檔案過大時記憶體耗盡。 在四核心伺服器上,數值 4 效果很好; 只有在分析記憶體使用情況後才能增加該值。 對於Azure Functions 或 AWS Lambda 部署,請將每個函數實例的同時數量設為 1,並改為水平擴充。

CreateSearchablePdf 產生一個 PDF,其中原始圖像保留為可見圖層,識別出的文字以不可見的方式嵌入在其下方。 這使得 PDF 檢視器能夠進行全文搜索,搜尋引擎能夠對其進行索引——這是文件管理系統的常見要求。

生產環境中的置信度評分監控

每個 OcrResult 都公開一個 Confidence 屬性(0-100),該屬性反映引擎對識別文本的確定程度。 在日誌記錄基礎架構中追蹤此指標,可以在文件品質下降時發出預警信號——例如,如果掃描器的校準發生漂移,或者新的文件供應商發送的 DPI 低於預期。

一個實用的閾值策略:置信度低於 80 時記錄警告,低於 70 時觸發預處理重試,低於 60 時標記文件以供人工審核。這種分層方法可以在品質問題導致下游系統出現隱性資料損壞之前將其捕獲。

Microsoft .NET 日誌記錄文件涵蓋了上述批次服務中使用的 ILogger 模式,適用於與 ASP.NET Core 內建 DI 容器整合的團隊。

如何從掃描文件中提取結構化資料?

文字提取是第一步。第二步是將文字解析成應用程式可以操作的類型欄位。 此模式結合了 IronOCR 的讀取流程和 .NET 的 Regex,以從發票、表單和報告中提取結構化資料。

using IronOcr;
using System.Text.RegularExpressions;

public record Invoice(
    string? InvoiceNumber,
    DateOnly? Date,
    decimal? TotalAmount,
    string RawText
);

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

    public Invoice ExtractInvoiceData(string invoicePath)
    {
        using var input = new OcrInput();

        if (invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(invoicePath);
        else
            input.LoadImage(invoicePath);

        input.DeNoise();
        input.Deskew();

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

        return new Invoice(
            InvoiceNumber: ExtractInvoiceNumber(text),
            Date: ExtractDate(text),
            TotalAmount: ExtractAmount(text),
            RawText: text
        );
    }

    private static string? ExtractInvoiceNumber(string text)
    {
        var match = Regex.Match(text, @"Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase);
        return match.Success ? match.Groups[1].Value : null;
    }

    private static DateOnly? ExtractDate(string text)
    {
        // Numeric format: MM/DD/YYYY
        var numeric = Regex.Match(text, @"\b(\d{1,2}/\d{1,2}/\d{2,4})\b");
        if (numeric.Success && DateTime.TryParse(numeric.Groups[1].Value, out var d1))
            return DateOnly.FromDateTime(d1);

        // Written format: January 15, 2025
        var written = Regex.Match(text,
            @"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
            RegexOptions.IgnoreCase);
        if (written.Success && DateTime.TryParse(written.Value, out var d2))
            return DateOnly.FromDateTime(d2);

        return null;
    }

    private static decimal? ExtractAmount(string text)
    {
        var match = Regex.Match(text, @"\$\s*(\d+(?:\.\d{2})?)");
        return match.Success && decimal.TryParse(match.Groups[1].Value, out var amt)
            ? amt
            : null;
    }
}
using IronOcr;
using System.Text.RegularExpressions;

public record Invoice(
    string? InvoiceNumber,
    DateOnly? Date,
    decimal? TotalAmount,
    string RawText
);

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

    public Invoice ExtractInvoiceData(string invoicePath)
    {
        using var input = new OcrInput();

        if (invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(invoicePath);
        else
            input.LoadImage(invoicePath);

        input.DeNoise();
        input.Deskew();

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

        return new Invoice(
            InvoiceNumber: ExtractInvoiceNumber(text),
            Date: ExtractDate(text),
            TotalAmount: ExtractAmount(text),
            RawText: text
        );
    }

    private static string? ExtractInvoiceNumber(string text)
    {
        var match = Regex.Match(text, @"Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase);
        return match.Success ? match.Groups[1].Value : null;
    }

    private static DateOnly? ExtractDate(string text)
    {
        // Numeric format: MM/DD/YYYY
        var numeric = Regex.Match(text, @"\b(\d{1,2}/\d{1,2}/\d{2,4})\b");
        if (numeric.Success && DateTime.TryParse(numeric.Groups[1].Value, out var d1))
            return DateOnly.FromDateTime(d1);

        // Written format: January 15, 2025
        var written = Regex.Match(text,
            @"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
            RegexOptions.IgnoreCase);
        if (written.Success && DateTime.TryParse(written.Value, out var d2))
            return DateOnly.FromDateTime(d2);

        return null;
    }

    private static decimal? ExtractAmount(string text)
    {
        var match = Regex.Match(text, @"\$\s*(\d+(?:\.\d{2})?)");
        return match.Success && decimal.TryParse(match.Groups[1].Value, out var amt)
            ? amt
            : null;
    }
}
Imports IronOcr
Imports System.Text.RegularExpressions

Public Class Invoice
    Public Property InvoiceNumber As String
    Public Property Date As DateOnly?
    Public Property TotalAmount As Decimal?
    Public Property RawText As String

    Public Sub New(invoiceNumber As String, [date] As DateOnly?, totalAmount As Decimal?, rawText As String)
        Me.InvoiceNumber = invoiceNumber
        Me.Date = [date]
        Me.TotalAmount = totalAmount
        Me.RawText = rawText
    End Sub
End Class

Public Class InvoiceOcrService
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ExtractInvoiceData(invoicePath As String) As Invoice
        Using input As New OcrInput()

            If invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(invoicePath)
            Else
                input.LoadImage(invoicePath)
            End If

            input.DeNoise()
            input.Deskew()

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

            Return New Invoice(
                InvoiceNumber:=ExtractInvoiceNumber(text),
                [Date]:=ExtractDate(text),
                TotalAmount:=ExtractAmount(text),
                RawText:=text
            )
        End Using
    End Function

    Private Shared Function ExtractInvoiceNumber(text As String) As String
        Dim match = Regex.Match(text, "Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase)
        Return If(match.Success, match.Groups(1).Value, Nothing)
    End Function

    Private Shared Function ExtractDate(text As String) As DateOnly?
        ' Numeric format: MM/DD/YYYY
        Dim numeric = Regex.Match(text, "\b(\d{1,2}/\d{1,2}/\d{2,4})\b")
        If numeric.Success AndAlso DateTime.TryParse(numeric.Groups(1).Value, Nothing) Then
            Return DateOnly.FromDateTime(DateTime.Parse(numeric.Groups(1).Value))
        End If

        ' Written format: January 15, 2025
        Dim written = Regex.Match(text,
            "\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
            RegexOptions.IgnoreCase)
        If written.Success AndAlso DateTime.TryParse(written.Value, Nothing) Then
            Return DateOnly.FromDateTime(DateTime.Parse(written.Value))
        End If

        Return Nothing
    End Function

    Private Shared Function ExtractAmount(text As String) As Decimal?
        Dim match = Regex.Match(text, "\$\s*(\d+(?:\.\d{2})?)")
        Dim amt As Decimal
        Return If(match.Success AndAlso Decimal.TryParse(match.Groups(1).Value, amt), amt, Nothing)
    End Function
End Class
$vbLabelText   $csharpLabel

當您確切知道表單上每個欄位的位置時,這種方法與區域 OCR結合使用效果很好。 透過提供邊界矩形,您可以跳過整頁識別,僅針對包含發票號碼或總金額的區域,從而大大縮短固定佈局文件的處理時間。

對於包括表格和結構化表單在內的更高級的提取場景,請查看產品網站上的IronOCR 資料提取範例

如何在.NET中處理多語言OCR?

許多組織處理的文件使用多種語言——進出口表格、國際合約或多語言客戶提交的文件。 IronOCR 透過允許您在讀取呼叫之前配置語言包來解決這個問題。

using IronOcr;

// Configure multi-language recognition
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.EnglishBest;  // Swap for any of 125+ supported languages

// For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German);

using var input = new OcrInput();
input.LoadPdf("multilingual-contract.pdf");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;

// Configure multi-language recognition
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.EnglishBest;  // Swap for any of 125+ supported languages

// For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German);

using var input = new OcrInput();
input.LoadPdf("multilingual-contract.pdf");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

' Configure multi-language recognition
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.EnglishBest  ' Swap for any of 125+ supported languages

' For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German)

Using input As New OcrInput()
    input.LoadPdf("multilingual-contract.pdf")
    Dim result = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

IronOCR 語言支援頁面列出了所有 125 多個可用的語言套件以及下載說明。 語言套件以 NuGet 套件的形式發布(例如,IronOcr.Languages.German),因此它們可以與您已經使用的相同套件管理工作流程整合。

對於拉丁字母以外的字元集(例如阿拉伯語、中文、日語、韓語),IronOCR 提供了最佳化的模型,可以處理從右到左的文字方向和表意文字。有關配置詳情,請參閱CJK OCR 指南

下一步計劃是什麼?

現在您擁有了將生產級 OCR 新增至任何 .NET 10 應用程式所需的模式:基本文字擷取、困難掃描的預處理、非同步批次處理、結構化資料解析和多語言支援。

接下來,您可以根據專案需求探索以下領域:

條碼和二維碼讀取-從同一影像中擷取機器可讀程式碼

先使用免費試用許可證,在決定購買哪個等級之前,先用您自己的文件評估全部功能。

!{--010011000100100101000010010100100100000101010010010110010101111101001110010101010101010101010101010101010101010 0100010111110100100101001101010100010000010100110001001100010111110100001001001100010011110010101010

常見問題解答

.NET OCR SDK 是什麼?

IronOCR 的 .NET OCR SDK 是一個用於將光學字符識別功能集成到 C# 應用中的庫,允許開發者從圖像、PDF 和掃描的文檔中提取文字。

IronOCR 的 .NET SDK 的主要功能有哪些?

IronOCR 的 .NET SDK 提供簡單的 API,支援多種語言,跨平台兼容,並具備處理各種文件格式和低質量掃描的高級功能。

IronOCR 如何處理不同語言?

IronOCR 的 .NET SDK 支援多種語言,可以從不同語言的文檔中提取和識別文字,無需額外配置。

IronOCR 能處理低質量掃描嗎?

是的,IronOCR 設計用於有效處理低質量掃描,利用先進算法在挑戰性場景中增強文字識別的準確性。

IronOCR 的 .NET SDK 是跨平台的嗎?

IronOCR 的 .NET SDK 是跨平台的,這意味著它可以在不同的操作系統上使用,使其適用於各種開發環境。

IronOCR 支援哪些文件格式?

IronOCR 支援多種文件格式,包括圖像、PDF 和掃描文檔,為不同媒體的文字識別任務提供靈活性。

開發者如何將 IronOCR 集成到項目中?

開發人員可以使用 IronOCR 的類型化 API 將 IronOCR 整合到他們的 C# 專案中,從而簡化為應用程式添加 OCR 功能的流程。

IronOCR 的一些使用案例有哪些?

IronOCR 可以用於文檔管理系統、自動資料錄入、內容數字化,以及任何需要從圖像或 PDF 中提取文字的應用。

Kannaopat Udonpant
軟體工程師
在成為軟件工程師之前,Kannapat 從日本北海道大學完成了環境資源博士學位。在追逐學位期间,Kannapat 還成為了生產工程系一部份——汽車机器人實验室的成員。2022 年,他利用他的 C# 技能加入 Iron Software 的工程團隊, 專注於 IronPDF。Kannapat 珍惜他的工作,因為他直接向编写大部分 IronPDF 使用的代碼的開發者学习。除了同行学习,Kannapat 还喜欢在 Iron Software 工作的社交十环。当他不编写代碼或文檔時,Kannapat 通常在他的 PS5 上打游戏或重看《The Last of Us》。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我