USING IRONOCR

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

Kannaopat Udonpant
Kannapat Udonpant
Updated: 2026年4月21日

一個 .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 進行。 在您的專案目錄中運行以下命令:

PM > 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);

如果控制台中出現文字,則 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;

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

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;
    }
}

過濾選擇指南:

  • 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);
    }
}

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;
    }
}

當您確切知道每個字段在表格上出現的位置時,這種方法與 區域化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);

IronOCR 語言支持頁面 列出了所有125+種可用的語言包以及下載說明。 語言包作為 NuGet 套件發佈(例如,IronOcr.Languages.German),因此它們與您已在使用的相同套件管理工作流程整合。

對於超出拉丁字母的字元集——阿拉伯語、中文、日語、韓語——IronOCR 提供了優化的模型,處理從右到左的文字方向和表意字元。請參見 CJK OCR 指南 以獲取配置具體資訊。

您的下一步是什麼?

您現在擁有將生產級 OCR 新增到任何 .NET 10 應用程式中所需的模式:基礎文字提取、困難掃描的預處理、異步批處理、結構化資料解析和多語言支持。

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

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

NuGet使用NuGet安裝

PM > Install-Package IronOcr

Install IronOCR by running the command above in the NuGet Package Manager Console, or search for the package in the NuGet Package Manager.

相關文章