跳至頁尾內容
USING 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 多種語言和腳本 的識別,包括手寫文字
  • 內建過濾器:噪聲消除、傾斜校正、二值化、解析度增強和對比度校正
  • 在同一讀取快速通道中條碼和 QR 碼檢測
  • 可搜尋的 PDF 生成,用於歸檔工作流中隱藏文字層
  • 異步和並行批量處理,用於高吞吐量管道
  • 區域化OCR,針對特定頁面區域以減少處理時間
  • Windows、Linux、macOS、Docker 和 Azure 上的跨平台支援

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

IronOCR 與原始 Tesseract 的比較?

通過 P/Invoke 包裝器或 Tesseract NuGet 包的原始 Tesseract,讓您負責:下載和安置 tessdata 語言文件、選擇正確的頁面分段模式、自己處理多頁 TIFF 和 PDF 拆分,如果您想要並行處理,還需配置執行緒。 沒有一項細節與您的業務問題特別相關。

IronOCR 封裝了所有這些管道。 您將獲得一個型別化的API介面、自動 tessdata 管理、內建 PDF 拆分和重組,以及一個執行緒安全的引擎,可以在多個請求中重用。 權衡之處是需要付費授權以進行生產用途——授權頁面顯示了當前的定價級別,包括免費開發授權。

對於需要完全開源依賴的團隊,使用原始 Tesseract 加上自定義預處理是一個可行的途徑。 對於需要快速交付可靠 OCR 的團隊,IronOCR 將整合面縮減到幾行 C#。

How Do You Install the IronOCR .NET SDK?

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

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 已安裝並且授權金鑰有效。 您已經準備好建立生產工作流。

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

核心提取模式在所有輸入型別中保持一致。您建立一個 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() -- 用於模糊或低對比度的文字; 將300 DPI 作為 Tesseract 最佳的位置

發表在關於文件分析和識別的國際期刊中的研究穩定地顯示,二值化和傾斜校正是改善字元識別率的兩個影響最大的預處理步驟。 將兩者應用為任何生產管道的基準。

IronOCR 預處理過濾器及其主要用例
過濾器 解決問題 何時應用
DeNoise() 掃描儀僞影、斑點噪音 任何平板掃描或傳真掃描
Deskew() 頁面傾斜和旋轉 拍攝或未對齊的文件
Scale() 小字體或低 DPI 輸入低於 150 DPI
Binarize() 顏色背景、漸變 顏色紙張或帶水印的表格
EnhanceResolution() 模糊和低對比度 相機拍攝和壓縮 JPEGs

如何建立一個生產批處理管道?

單個文件提取很簡單,但生產場景涉及數百或數千個文件在隊列中、共享文件夾或雲端儲存中到達。 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 應用程式中所需的模式:基礎文字提取、困難掃描的預處理、異步批處理、結構化資料解析和多語言支持。

從這裡開始,根據您的專案需求探索這些領域:

首先使用 免費試用授權 評估整個功能集,以便在提交到一個層級之前在您的文件上進行評估。

NuGet 使用NuGet安裝

PM >  Install-Package IronOcr

查看在NuGet上的https://www.nuget.org/packages/IronOcr,快速安裝。超過1000萬次下載,正在用C#轉變PDF開發。 您也可以下載DLLWindows安裝程式

常見問題

什麼是.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將其整合到他們的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。

Iron 支援團隊

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