跳至頁尾內容
與其他組件的比較

Azure OCR 與 IronOCR:哪種光學字元辨識解決方案最適合 .NET 專案?

Windows.Media.Ocr 與每個 Windows 10 和 Windows 11 安裝一同免費提供,這使其具有吸引力,直到您嘗試將相同的應用程式部署到Linux伺服器、Docker 容器或AWS Lambda函式時-這時候該 API 根本不存在。平台鎖定並非這個程式庫的個別案例; 這是定義的限制。 每一個從選擇 Windows.Media.Ocr 下游的架構決策都受到主機作業系統必須是 Windows 10 或 Windows 11 桌面或消費等級伺服器的要求所影響。 沒有 Linux、沒有 macOS、沒有 Docker、沒有在Linux上的 Azure Functions、沒有 AWS Lambda。 對於那些建構內部 Windows 工具的開發者而言,沒有跨越那個邊界的計畫,$0 的價格很難說不。 對於其他人而言,隱藏的成本是當部署要求改變時,將 OCR 重寫到另一個系統中。

了解 Windows.Media.Ocr

Windows.Media.Ocr 是 Windows Runtime (WinRT) API 表面的部分,首次在 Windows 8.1 中引入,並為 Windows 10 和 11 進行了改進。它在 OcrEngine 命名空間中暴露一個 Windows.Media.Ocr 類別,接受一個 SoftwareBitmap — 本身就是 Windows.Graphics.Imaging 的 WinRT 型別 - 並返回一個包含識別文字和行幾何的 OcrResult

該 API 是基於 WinRT 的 async/await 合約構建的。 每個操作都經過 async Task 調用,背後由 WinRT IAsyncOperation 機制支持:載入一個 StorageFile,打開一個流,建立一個 BitmapDecoder,獲取一個 SoftwareBitmap,然後調用 RecognizeAsync。 從 .NET 6 開始,使用 WinRT APIs 需要一個 Windows 特定目標框架標識 (TFM),如 net8.0-windows10.0.19041.0。 沒有這個 TFM 的專案文件無法編譯引用 Windows.Media.Ocr 的程式碼——型別在程式集圖中根本不存在。

關鍵架構特徵:

  • 僅 Windows 10/11 - WinRT API 表面在無桌面體驗的所有配置的 Windows Server 上均不可用,在Linux和macOS上完全不存在
  • WinRT 非同步模型 - 所有識別都經過由 IAsyncOperation 支持的非同步調用; 不存在同步路徑
  • 作業系統的語言包 - OcrEngine.TryCreateFromLanguageTryCreateFromUserProfileLanguages 從由使用者或 IT 管理員在該特定機器上安裝的 Windows 語言包中解析可用的語言;沒有捆綁或便攜語言模型
  • 僅圖像輸入 - 該 API 直接接受 SoftwareBitmap; 在 API 的任何層都沒有 PDF 輸入路徑
  • 沒有預處理管道 - 原始點陣圖被傳遞給識別器; 旋轉校正、噪音去除、對比度增強和解析度縮放是開發者需要使用單獨的 Windows 圖像 API 負責的
  • 沒有可搜索的 PDF 輸出 - 識別的文字被作為普通的字串資料與行幾何一起返回; 沒有提供將內容輸出為 PDF
  • 需要 Windows 特定 TFM - 專案文件必須針對 net*-windows* TFM,這防止了相同專案跨平台編譯

WinRT 非同步堆疊

每一個 Windows.Media.Ocr 的基本 OCR 操作都需要遍歷多層 WinRT API 表面才能開始識別:

// Windows.Media.Ocr: 6+ async steps before receiving any text
// Requires net8.0-windows10.0.19041.0 TFM — will not compile cross-platform

public async Task<string> ExtractTextAsync(string imagePath)
{
    // Step 1: WinRT file system access
    var file = await StorageFile.GetFileFromPathAsync(imagePath);

    // Step 2: Open WinRT stream
    using var stream = await file.OpenAsync(FileAccessMode.Read);

    // Step 3: Create bitmap decoder
    var decoder = await BitmapDecoder.CreateAsync(stream);

    // Step 4: Decode to SoftwareBitmap
    var bitmap = await decoder.GetSoftwareBitmapAsync();

    // Step 5: Check language availability — null if not installed on this machine
    var engine = OcrEngine.TryCreateFromLanguage(
        new Windows.Globalization.Language("en-US"));
    if (engine == null)
        throw new Exception("OCR engine not available for this language");

    // Step 6: Recognize
    var result = await engine.RecognizeAsync(bitmap);
    return result.Text;
}
// Windows.Media.Ocr: 6+ async steps before receiving any text
// Requires net8.0-windows10.0.19041.0 TFM — will not compile cross-platform

public async Task<string> ExtractTextAsync(string imagePath)
{
    // Step 1: WinRT file system access
    var file = await StorageFile.GetFileFromPathAsync(imagePath);

    // Step 2: Open WinRT stream
    using var stream = await file.OpenAsync(FileAccessMode.Read);

    // Step 3: Create bitmap decoder
    var decoder = await BitmapDecoder.CreateAsync(stream);

    // Step 4: Decode to SoftwareBitmap
    var bitmap = await decoder.GetSoftwareBitmapAsync();

    // Step 5: Check language availability — null if not installed on this machine
    var engine = OcrEngine.TryCreateFromLanguage(
        new Windows.Globalization.Language("en-US"));
    if (engine == null)
        throw new Exception("OCR engine not available for this language");

    // Step 6: Recognize
    var result = await engine.RecognizeAsync(bitmap);
    return result.Text;
}
Imports System.Threading.Tasks
Imports Windows.Media.Ocr
Imports Windows.Storage
Imports Windows.Graphics.Imaging
Imports Windows.Storage.Streams
Imports Windows.Globalization

Public Async Function ExtractTextAsync(imagePath As String) As Task(Of String)
    ' Step 1: WinRT file system access
    Dim file As StorageFile = Await StorageFile.GetFileFromPathAsync(imagePath)

    ' Step 2: Open WinRT stream
    Using stream As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.Read)

        ' Step 3: Create bitmap decoder
        Dim decoder As BitmapDecoder = Await BitmapDecoder.CreateAsync(stream)

        ' Step 4: Decode to SoftwareBitmap
        Dim bitmap As SoftwareBitmap = Await decoder.GetSoftwareBitmapAsync()

        ' Step 5: Check language availability — Nothing if not installed on this machine
        Dim engine As OcrEngine = OcrEngine.TryCreateFromLanguage(New Language("en-US"))
        If engine Is Nothing Then
            Throw New Exception("OCR engine not available for this language")
        End If

        ' Step 6: Recognize
        Dim result As OcrResult = Await engine.RecognizeAsync(bitmap)
        Return result.Text
    End Using
End Function
$vbLabelText   $csharpLabel

engine 的空值檢查不是可選的。 如果運行程式碼的機器上沒有安裝目標語言包,TryCreateFromLanguage 返回 null 並且識別是不可能的。 沒有後備; 應用程式必須向使用者顯示錯誤或默默失敗。

理解 IronOCR

IronOCR 是一個商業 .NET OCR 程式庫,建基於優化的 Tesseract 5 引擎,並具有一個管理的 API 層,能夠處理預處理、PDF 閱讀、多語言解決和結構化資料輸出。 它安裝為一個單一的 NuGet 套件,沒有需要單獨部署的外部本機二進制檔案,沒有需要管理的 tessdata 文件夾,沒有需要的平台特定 TFM。

關鍵特徵:

  • 按設計跨平台 - 可在不更改程式碼的情況下在 Windows、Linux、macOS、Docker、Azure App Service (Windows 或 Linux)、AWS Lambda 和 GCP Cloud Run 上運行
  • 自動預處理 - 自動應用桌面偏斜、去噪、對比度增強、二值化和解析度縮放於劣質輸入上,通過 OcrInput 過濾方法提供明確的控制
  • 本地 PDF 輸入 - IronTesseract.Read 接受 PDF 路徑直接輸入; 不需要轉換步驟,不需要外部程式庫
  • 125 多種捆綁的語言 - 語言包是隨應用程式一同部署的 NuGet 套件; 不依賴作業系統安裝的語言資料
  • 可搜索的 PDF 輸出 - OcrResult.SaveAsSearchablePdf 從任何掃描輸入建立一個文字層 PDF
  • 結構化的結果模型 - OcrResult 暴露 Words,每一個詞的置信度分數和邊界框
  • 支援並行查詢 - IronTesseract 實例支援並行工作負載,不需要額外的同步
  • 永久授權 - $999 Lite 至 $5,999 無限制,單次購買後可處理無限文件

功能比較

功能 Windows.Media.Ocr IronOCR
平台 僅 Windows 10/11 Windows,Linux,macOS,Docker,雲端
價格 免費 $5,999 永久
PDF輸入 不是 本地
語言模型 系統安裝包 超過 125 個捆綁的 NuGet 包
預處理 None 自動 + 明確的過濾
可搜尋的PDF輸出 不是
API 模型 WinRT 非同步 標準 .NET

詳細功能比較

功能 Windows.Media.Ocr IronOCR
平台支持
Windows 10/11
Windows Server 有限
Linux 不是
macOS 不是
Docker 不是
Azure Functions (Linux) 不是
AWS Lambda 不是
輸入格式
JPEG / PNG / BMP 是 (經由 WinRT pipeline)
PDF (掃描) 不是
PDF(密碼保護) 不是
TIFF / 多頁 不是
流/字節陣列 否 (僅 WinRT StorageFile)
URL 不是
語言支持
語言來源 系統安裝的語言包 超過 125 個捆綁的 NuGet 包
在不需要作業系統管理員的情況下安裝 不是 是 (NuGet)
同時多語言支持 不是
跨機器的語言可攜性 不是
預處理
糾偏 不是 是 (input.Deskew())
降噪 不是 是 (input.DeNoise())
對比增強 不是 是 (input.Contrast())
二值化 不是 是 (input.Binarize())
解析度縮放 不是 是 (input.EnhanceResolution(300))
輸出
純文字
可搜尋的PDF 不是
hOCR / HTML 不是
單詞級邊界框 部分 (行幾何)
每個單詞的信心分數 不是
API 設計
TFM 限制 需要 net*-windows* None
同步路徑 不是
OCR期間的條碼讀取 不是
基於區域的OCR 不是

平台鎖定與跨平台部署

這兩個程式庫之間最重要的區別不是準確性,不是預處理,也不是 PDF 支援——是部署拓撲。 Windows.Media.Ocr 在 Windows 10/11 之外不存在。這不是一個配置問題或缺少的 NuGet 套件; 支持該 API 的 WinRT 執行時在其他所有作業系統上都不存在。

Windows.Media.Ocr 方法

WinRT 依賴關係在運行任何程式碼之前會在專案文件中出現。 TargetFramework 必須指定一個 Windows 平台版本:


<PropertyGroup>
  <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
</PropertyGroup>

<PropertyGroup>
  <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
</PropertyGroup>
XML

有了那個 TFM,該專案不能從Linux容器中使用。 基於 mcr.microsoft.com/dotnet/aspnet:8.0 的Docker映像——ASP.NET 部署的標準Linux基礎映像——沒有 WinRT 執行時。嘗試在針對 net8.0(無 Windows 後綴)目標的專案中引用 Windows.Media.Ocr 型別會產生編譯錯誤,而非運行時錯誤。 在編譯時強制鎖定。

當在微服務架構中出現 OCR 要求時,其中的 OCR 工作者在Linux上運行,或者在生成跨平台Docker映像的 CI/CD 管道中,Windows.Media.Ocr 不是一個可以評估的選項——它在首次探測前已被排除。

IronOCR方法

IronOCR 針對 net8.0net9.0,無平台特定 TFM。 同一個 NuGet 套件和同一個應用程式二進制可以在 Windows,Linux 和macOS上運行。 將IronOCR部署到 Docker 只需要在Linux基礎映像上進行一行 apt-get 操作,其他不需要:

FROM mcr.microsoft.com/dotnet/aspnet:8.0
# Linux dependency for System.Drawing
RUN apt-get update && apt-get install -y libgdiplus

COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]

應用程式程式碼本身在 Windows 和Linux部署之間不會改變:

// Same code — Windows, Linux, macOS, Docker, AWS Lambda
//不是platform TFM, no WinRT, no conditional compilation
using IronOcr;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
// Same code — Windows, Linux, macOS, Docker, AWS Lambda
//不是platform TFM, no WinRT, no conditional compilation
using IronOcr;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr

' Same code — Windows, Linux, macOS, Docker, AWS Lambda
'不是platform TFM, no WinRT, no conditional compilation

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text As String = New IronTesseract().Read("document.jpg").Text
$vbLabelText   $csharpLabel

IronOCR 能在AWS Lambda上運行在Linux上的 Azure FunctionsLinux 伺服器上直接運行,而無需修改程式碼。 部署目標是一個配置問題,而不是架構約束。

語言支援:作業系統依賴還是捆綁包

Windows.Media.Ocr 完全將語言可用性委派給主機機器。您的應用程式能識別的語言集由於——或一位IT管理員——已安裝的 Windows 安裝中的語言包決定。 這創造了一種與您的程式碼無關的生產故障類別。

Windows.Media.Ocr 方法

當請求的語言未安裝時,OcrEngine.TryCreateFromLanguage 返回 null。 當完全不存在任何具有 OCR 功能的語言包時,TryCreateFromUserProfileLanguages 返回 null。 兩條路徑都要求空值處理,且均未提供優雅的恢復路徑——無法從程式碼中安裝語言或將其與應用程式捆綁:

// Windows.Media.Ocr: language availability is a runtime unknown
// Returns null if the language pack is not installed on this machine

var engine = OcrEngine.TryCreateFromLanguage(
    new Windows.Globalization.Language("fr-FR"));

if (engine == null)
{
    // French OCR is simply unavailable — no recovery path
    // User must go to Windows Settings > Language to install French
    throw new InvalidOperationException(
        "French OCR unavailable. Install the French language pack in Windows Settings.");
}

var result = await engine.RecognizeAsync(bitmap);
// Windows.Media.Ocr: language availability is a runtime unknown
// Returns null if the language pack is not installed on this machine

var engine = OcrEngine.TryCreateFromLanguage(
    new Windows.Globalization.Language("fr-FR"));

if (engine == null)
{
    // French OCR is simply unavailable — no recovery path
    // User must go to Windows Settings > Language to install French
    throw new InvalidOperationException(
        "French OCR unavailable. Install the French language pack in Windows Settings.");
}

var result = await engine.RecognizeAsync(bitmap);
Imports Windows.Globalization
Imports Windows.Media.Ocr

' Windows.Media.Ocr: language availability is a runtime unknown
' Returns Nothing if the language pack is not installed on this machine

Dim engine = OcrEngine.TryCreateFromLanguage(New Language("fr-FR"))

If engine Is Nothing Then
    ' French OCR is simply unavailable — no recovery path
    ' User must go to Windows Settings > Language to install French
    Throw New InvalidOperationException("French OCR unavailable. Install the French language pack in Windows Settings.")
End If

Dim result = Await engine.RecognizeAsync(bitmap)
$vbLabelText   $csharpLabel

using Windows.Media.Ocr 部署多語文件處理應用程式需要協調部署目標中每台機器上的 Windows 語言包安裝。 在由組策略管理的共享伺服器或使用者計算機上,這不在開發者控制範圍內。

IronOCR方法

IronOCR 將語言模型作為專用的 NuGet 套件提供,這些套件隨應用程式二進制一同部署。 語言資料隨著構建工件一起傳輸,而不是與作業系統配置一起傳輸。 支援超過 125 種語言 是一個 dotnet add package 操作:

dotnet add package IronOcr.Languages.French, IronOcr.Languages.German, IronOcr.Languages.Arabic, IronOcr.Languages.ChineseSimplified
// IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

// Works on any machine, any OS, zero OS configuration required
var result = ocr.Read("multilingual-document.jpg");
Console.WriteLine(result.Text);
// IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

// Works on any machine, any OS, zero OS configuration required
var result = ocr.Read("multilingual-document.jpg");
Console.WriteLine(result.Text);
Imports IronOcr

' IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.French
ocr.AddSecondaryLanguage(OcrLanguage.German)

' Works on any machine, any OS, zero OS configuration required
Dim result = ocr.Read("multilingual-document.jpg")
Console.WriteLine(result.Text)
$vbLabelText   $csharpLabel

完整語言目錄涵蓋了拉丁語、CJK、阿拉伯語、希伯來語、天城文、西里爾字母以及包括數學符號的專業集合。 每個語言包版本釘住了IronOCR套件版本,因此生產環境中的語言模型與本地測試時匹配。

缺乏預處理

低質量掃描——輕微旋轉的頁面、帶有斑點噪點的複印文字、淡色油墨在偏白紙上——無論是哪種引擎在接收原樣時都會導致 OCR 準確性差。 預處理在識別運行之前糾正這些缺陷。 Windows.Media.Ocr 提供任何型別的預處理層。

Windows.Media.Ocr 方法

API 接受一個 SoftwareBitmap 並返回文字。 在這兩點之間圖像質量發生的變化是不可配置的。 需要提高不理想輸入準確性的開發者必須使用 Windows Imaging Component API 手動實施預處理,然後再構建 SoftwareBitmap。 那是一個有自己維護負擔的分離程式碼庫,並且它保持 Windows 特定是出於與 OCR API 本身相同的原因:

// Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
// Skewed, noisy, or low-resolution images degrade accuracy with no remedy
// Manual preprocessing via separate Windows Imaging APIs is the only option

var bitmap = await decoder.GetSoftwareBitmapAsync();
// bitmap goes directly to recognition with no quality improvement
var result = await engine.RecognizeAsync(bitmap);
// Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
// Skewed, noisy, or low-resolution images degrade accuracy with no remedy
// Manual preprocessing via separate Windows Imaging APIs is the only option

var bitmap = await decoder.GetSoftwareBitmapAsync();
// bitmap goes directly to recognition with no quality improvement
var result = await engine.RecognizeAsync(bitmap);
Imports System.Threading.Tasks

' Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
' Skewed, noisy, or low-resolution images degrade accuracy with no remedy
' Manual preprocessing via separate Windows Imaging APIs is the only option

Dim bitmap = Await decoder.GetSoftwareBitmapAsync()
' bitmap goes directly to recognition with no quality improvement
Dim result = Await engine.RecognizeAsync(bitmap)
$vbLabelText   $csharpLabel

對於標準、乾淨的文件掃描(在控制掃描環境、一致光照、最低300 DPI、正確方位)下,這個限制是可管理的。 對於從移動電話拍攝的照片、自動進紙錯位的平板掃描儀、傳真文件或複印材料接收圖像的文件處理管道而言,這意味著要麼從頭開始構建預處理層,要麼接受準確性下降。

IronOCR方法

IronOCR 的 OcrInput 類提供一個帶有單獨過濾方法的預處理管道,按順序應用。 圖像質量校正過濾器 對生產中文件處理中的最常見準確性殺手進行處理:

// IronOCR: explicit preprocessing pipeline
// Each filter targets a specific quality defect
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();              // Correct page rotation up to ~40 degrees
input.DeNoise();             // Remove scanner speckle and compression artifacts
input.Contrast();            // Boost contrast on faded or washed-out text
input.Binarize();            // Convert to black/white with optimal threshold
input.EnhanceResolution(300); // Scale image to 300 DPI for recognition

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
// IronOCR: explicit preprocessing pipeline
// Each filter targets a specific quality defect
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();              // Correct page rotation up to ~40 degrees
input.DeNoise();             // Remove scanner speckle and compression artifacts
input.Contrast();            // Boost contrast on faded or washed-out text
input.Binarize();            // Convert to black/white with optimal threshold
input.EnhanceResolution(300); // Scale image to 300 DPI for recognition

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr

' IronOCR: explicit preprocessing pipeline
' Each filter targets a specific quality defect
Using input As New OcrInput()
    input.LoadImage("low-quality-scan.jpg")

    input.Deskew()              ' Correct page rotation up to ~40 degrees
    input.DeNoise()             ' Remove scanner speckle and compression artifacts
    input.Contrast()            ' Boost contrast on faded or washed-out text
    input.Binarize()            ' Convert to black/white with optimal threshold
    input.EnhanceResolution(300) ' Scale image to 300 DPI for recognition

    Dim result = New IronTesseract().Read(input)
    Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
$vbLabelText   $csharpLabel

對於常見情況,IronOCR 在直接調用 Read 上的檔案路徑時應用自動預處理——引擎檢測質量問題並在沒有明確過濾器配置的情況下糾正它們。 圖像過濾器教學 涵蓋完整過濾器集,包括 Invert、和針對專門場景的 ToGrayScale顏色校正過濾器方向校正 進一步擴展了管道,適用於具有非標準色彩配置檔案或多角度旋轉的文件。

缺乏 PDF 支援

PDF 是企業環境中的主要文件格式。 合同、發票、掃描歸檔和政府表單以 PDF 形式到達。 Windows.Media.Ocr 對 PDF 沒有概念——它只接受圖像資料。 對 PDF 文件進行 OCR 需要另一個 PDF 渲染程式庫,按頁光柵化,以及手動組裝結果。

Windows.Media.Ocr 方法

在 API 中沒有 PDF 路徑。 使用 Windows.Media.Ocr 對掃描的 PDF 進行 OCR 的開發者必須:使用單獨的 PDF 渲染程式庫(Windows 中沒有任何一個內建的程式庫)渲染每個頁面為 SoftwareBitmap,迭代頁面,調用 RecognizeAsync 處理每個頁面,並手動連接結果。 那個渲染程式庫本身帶有額外的授權和部署考慮。 Windows.Media.Ocr 程式碼是整個實現的一小部分:

// Windows.Media.Ocr: no PDF support
// Requires external PDF renderer to rasterize pages before OCR
// Conceptual pattern — a PDF rendering library is not provided by Windows APIs

// Step 1: Use external PDF library to render page to bitmap (not shown)
// Step 2: Pass rendered bitmap to Windows OCR
// var bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex); // external library required

var engine = OcrEngine.TryCreateFromUserProfileLanguages();
if (engine == null)
    throw new Exception("No OCR language available");

// Step 3: Recognize the rasterized page
// var result = await engine.RecognizeAsync(bitmap);
// Step 4: Collect and concatenate results across all pages manually
// Windows.Media.Ocr: no PDF support
// Requires external PDF renderer to rasterize pages before OCR
// Conceptual pattern — a PDF rendering library is not provided by Windows APIs

// Step 1: Use external PDF library to render page to bitmap (not shown)
// Step 2: Pass rendered bitmap to Windows OCR
// var bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex); // external library required

var engine = OcrEngine.TryCreateFromUserProfileLanguages();
if (engine == null)
    throw new Exception("No OCR language available");

// Step 3: Recognize the rasterized page
// var result = await engine.RecognizeAsync(bitmap);
// Step 4: Collect and concatenate results across all pages manually
' Windows.Media.Ocr: no PDF support
' Requires external PDF renderer to rasterize pages before OCR
' Conceptual pattern — a PDF rendering library is not provided by Windows APIs

' Step 1: Use external PDF library to render page to bitmap (not shown)
' Step 2: Pass rendered bitmap to Windows OCR
' Dim bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex) ' external library required

Dim engine = OcrEngine.TryCreateFromUserProfileLanguages()
If engine Is Nothing Then
    Throw New Exception("No OCR language available")
End If

' Step 3: Recognize the rasterized page
' Dim result = Await engine.RecognizeAsync(bitmap)
' Step 4: Collect and concatenate results across all pages manually
$vbLabelText   $csharpLabel

僅外部 PDF 渲染步驟就新增了一個依賴性、一個單獨的學習曲線,以及一個額外的失敗表面,對於一個"免費且內建"解決方案來說。

IronOCR方法

IronOCR原生讀取PDF。 沒有外部渲染器,沒有光柵化步驟,沒有手動頁面組裝。 接受圖像路徑的相同 IronTesseract.Read 方法接受 PDF 路徑。 在.NET中進行 PDF OCR 是一行程式碼:

// IronOCR: native PDF support — no external renderer needed
var text = new IronTesseract().Read("scanned-document.pdf").Text;

// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);

//可搜尋的PDFoutput: make a scanned PDF text-searchable
var ocrResult = new IronTesseract().Read("scanned-archive.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
// IronOCR: native PDF support — no external renderer needed
var text = new IronTesseract().Read("scanned-document.pdf").Text;

// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);

//可搜尋的PDFoutput: make a scanned PDF text-searchable
var ocrResult = new IronTesseract().Read("scanned-archive.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

' IronOCR: native PDF support — no external renderer needed
Dim text As String = New IronTesseract().Read("scanned-document.pdf").Text

' Password-protected PDFs
Using input As New OcrInput()
    input.LoadPdf("encrypted.pdf", Password:="secret")
    Dim result = New IronTesseract().Read(input)
    Console.WriteLine(result.Text)
End Using

' 可搜尋的PDFoutput: make a scanned PDF text-searchable
Dim ocrResult = New IronTesseract().Read("scanned-archive.pdf")
ocrResult.SaveAsSearchablePdf("searchable-output.pdf")
$vbLabelText   $csharpLabel

可搜索的 PDF 功能 在原始掃描圖像之上嵌入了一個文字層,產生了一個保留視覺完整性的 PDF,同時實現全文字搜索和複製粘貼。 這是文件管理系統和合規檔案的常見要求。 Windows.Media.Ocr 不能在其 API 的任何層次上產生這種輸出。

API 地圖參考

Windows.Media.Ocr IronOCR 等效
OcrEngine.TryCreateFromLanguage(lang) new IronTesseract()ocr.Language = OcrLanguage.X
OcrEngine.TryCreateFromUserProfileLanguages() new IronTesseract() (預設語言自動解析)
engine.RecognizeAsync(softwareBitmap) ocr.Read("image.jpg")ocr.Read(ocrInput)
OcrResult.Text OcrResult.Text
OcrResult.Lines OcrResult.Lines (附加擴展元資料)
OcrLine.Text OcrResult.Lines[i].Text
OcrLine.Words OcrResult.Words (帶邊界框+信心值)
OcrWord.BoundingRect OcrResult.Words[i].X, .Y, .Width, .Height
BitmapDecoder.CreateAsync(stream) input.LoadImage(stream) 通過 OcrInput
StorageFile.GetFileFromPathAsync(path) ocr.Read("path") 直接
沒有等價性(不支持 PDF) ocr.Read("document.pdf")
沒有等價性(不支持 PDF) input.LoadPdf("file.pdf", Password: "x")
沒有等價性(無可搜索的 PDF) result.SaveAsSearchablePdf("output.pdf")
沒有等價性(無預處理) input.Deskew(), input.DeNoise(), input.Contrast()
沒有等價性(無多語言) ocr.AddSecondaryLanguage(OcrLanguage.X)
沒有等價性(無信心) result.Confidence, word.Confidence

當團隊考慮從 Windows.Media.Ocr 遷移至 IronOCR

應用程式超出 Windows 桌面的範疇

最常見的觸發器是要求更改,引入一個非 Windows 部署目標。 一個最初作為內部 Windows 工具的桌面工具被提升為一個 Web 服務、基於Docker的微服務或雲函式。 一旦發生這種情況,Windows.Media.Ocr 就成為阻礙。 OCR 組件需要重寫全部,因為 API 在目標平台上不存在——沒有移植,沒有相容性填充,也沒有能解決問題的條件編譯標識。 計劃在當前基礎上繼續發展的團隊使用IronOCR的團隊不用面對重寫。

語言要求超出已安裝的包

文件處理流程通常會擴大範圍。 一個用於處理英語發票的系統收到一個要求來處理法語、德語、阿拉伯語或日語文件。 使用 Windows.Media.Ocr 支援這些語言需要協調在每一個部署目標上安裝操作系統語言包——開發者機,測試虛擬機,生產伺服器和包含的任何容器。 在由組策略管理的環境或具有最小操作系統配置的雲虛擬機中,這種協調是不切實際的。IronOCR的基於 NuGet 的語言包隨應用程式一起部署,不需要 OS 協調。

將 PDF 處理加入範圍

當最初要求是"從平板掃描儀中進行 OCR 圖像",Windows.Media.Ocr 能夠正常工作。 當要求擴展至"也處理我們檔案庫中的掃描 PDF 的積壓"時,一個第二庫進入堆棧。 那個程式庫是一個額外的依賴性、一個額外的許可證考慮,以及一個額外的故障表面。 需要統一 API 下圖像 OCR 和 PDF OCR 的團隊發現IronOCR從一開始就消除了雙庫架構。

在現實輸入中的準確性下降

控制的掃描環境會產生清晰的圖像。 現實世界的輸入——用手機拍攝的照片、輕微偏斜的平板掃描、較舊的傳真接收文件、複印材料——會導致準確性下降,這在 Windows.Media.Ocr 中無法補救。 當圍繞缺漏文字的客戶投訴開始出現時,團隊發現他們跳過的預處理步驟成為了必要。 使用 Windows Imaging API 進行預處理的改裝是一個相當大的開發努力,這保持了解決方案的 Windows 唯一性。IronOCR的預處理管道已經在那裡。

伺服器部署問題出現

Windows.Media.Ocr 的文件明確將該 API 定位於客戶端應用程式。 在伺服器上下文中運行——如處理使用者上傳文件的 ASP.NET 程式、一個消耗文件隊列的 Windows 服務——需要一個安裝了桌面體驗的 Windows Server 環境,這是一個比Linux容器更重更昂貴的虛擬機配置檔案。 當基礎架構團隊詢問 OCR 工作者是否可以運行在一個Linux實例上以降低寄宿成本時,Windows.Media.Ocr 的答案是否定的。

常見的遷移考量

專案文件 TFM 變更

Windows.Media.Ocr 在專案文件中需要一個 Windows 特定的 TFM(net8.0-windows10.0.19041.0 或類似)。 移除該依賴以支持跨平台目標意味着移除 TFM 後綴。IronOCR針對 net8.0net9.0,無 Windows 特定後綴。 遷移時,確認專案中沒有其他需要 Windows TFM 的 WinRT API 依賴——其他 Windows 平台功能(如 shell 整合,Windows 通知等)可能需要在平台檢查後面抽象。

非同步到同步遷移

Windows.Media.Ocr 完全是非同步的——RecognizeAsync 返回 IAsyncOperation<OcrResult>,該映射通過 WinRT 互操作到 Task<OcrResult>。IronOCR 提供同步和非同步路徑。 同步的 ocr.Read("file.jpg") 直接取代多步 await 鏈。 對於 OCR 調用位於後台服務或基於 Task 的管道內的伺服器應用程式,非同步路徑也可用。 無論哪種方式,從超過6步非同步轉變到1次調用是很容易的:

// Before: Windows.Media.Ocr — 6+ await operations
var file = await StorageFile.GetFileFromPathAsync(imagePath);
using var stream = await file.OpenAsync(FileAccessMode.Read);
var decoder = await BitmapDecoder.CreateAsync(stream);
var bitmap = await decoder.GetSoftwareBitmapAsync();
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
var winResult = await engine.RecognizeAsync(bitmap);
string text = winResult.Text;

// After:IronOCR— 1 call, same result, any platform
string text = new IronTesseract().Read(imagePath).Text;
// Before: Windows.Media.Ocr — 6+ await operations
var file = await StorageFile.GetFileFromPathAsync(imagePath);
using var stream = await file.OpenAsync(FileAccessMode.Read);
var decoder = await BitmapDecoder.CreateAsync(stream);
var bitmap = await decoder.GetSoftwareBitmapAsync();
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
var winResult = await engine.RecognizeAsync(bitmap);
string text = winResult.Text;

// After:IronOCR— 1 call, same result, any platform
string text = new IronTesseract().Read(imagePath).Text;
Imports Windows.Storage
Imports Windows.Graphics.Imaging
Imports Windows.Media.Ocr

' Before: Windows.Media.Ocr — 6+ await operations
Dim file As StorageFile = Await StorageFile.GetFileFromPathAsync(imagePath)
Using stream = Await file.OpenAsync(FileAccessMode.Read)
    Dim decoder As BitmapDecoder = Await BitmapDecoder.CreateAsync(stream)
    Dim bitmap = Await decoder.GetSoftwareBitmapAsync()
    Dim engine = OcrEngine.TryCreateFromUserProfileLanguages()
    Dim winResult = Await engine.RecognizeAsync(bitmap)
    Dim text As String = winResult.Text
End Using

' After: IronOCR— 1 call, same result, any platform
Dim text As String = New IronTesseract().Read(imagePath).Text
$vbLabelText   $csharpLabel

語言包替換

對於每種語言,以前通過 OcrEngine.TryCreateFromLanguage(new Windows.Globalization.Language("fr-FR")) 解析,安裝相應的IronOCR語言包並設置 ocr.Language = OcrLanguage.FrenchIronOCR 語言目錄 列出了全部可用的 125 多個包。 語言程式碼直接從 BCP-47 標籤映射到 OcrLanguage 列舉型。

無空引擎處理移除

Windows.Media.Ocr 需要在每次引擎建立調用時進行空值檢查。IronOCR會拋出結構化異常,而不是返回空值以回應配置或初始化失敗。 移除空值檢查保護子句,並在需要時用標準異常處理代替。 結果是更乾淨的調用場地,沒有"靜默不可用的語言"故障模式。

其他IronOCR功能

除了直接替代 Windows.Media.Ocr 功能的特性,IronOCR 還覆蓋了 Windows.Media.Ocr 沒有等價性的功能:

  • 掃描文件處理 — 專為多頁掃描檔案設計的處理,包括 TIFF 和多頁 PDF 輸入
  • 表格提取 — 在文件中對表格資料的結構化檢測,用於發票行條目、報告網格和表單矩陣
  • 專門的文件型別 — 護照 MRZ 區域、MIЧR 支票行、車牌號和手寫文字各有專用的處理路徑
  • 進度追蹤 — 批處理操作通過事件報告進度,實現應用程式 UI 中的進度條和處理速率監控

.NET 相容性和未來準備

IronOCR 支援 .NET 6、.NET 7、.NET 8 和 .NET 9 的標準 TFM,無平台特定後綴,同時支持 .NET Framework 4.6.2 到 4.8 用於舊應用程式支持。 該程式庫會定期跟踪 .NET 發版節奏進行更新,預定於 2026 年支援 .NET 10。Windows.Media.Ocr 可在任何支援從 .NET 5 開始的 WinRT 互操作的 .NET 版本上使用,但 Windows TFM 的要求使其應用僅限於針對 Windows 的專案。 隨著 .NET 的跨平台故事成熟——更多團隊將Linux容器和雲環境作為一級部署目標——Windows.Media.Ocr 的 TFM 約束比起一個小的警告,成為一個更明顯的架構負擔。

結論

Windows.Media.Ocr 佔據了一個特定且合法的利基:一個 Windows 10/11 桌面應用程式,沒有跨平台野心,基本圖像 OCR 需求以及 $0 的硬性預算限制。在那個利基中,它是有效的。 在這個利基之外——當部署目標指向Linux容器、雲函式、一個具有多語言需求的伺服器或一個處理 PDF 的文件管道時——該 API 在目標平台上不存在,程式碼必須被替換。

更深層的問題是,Windows.Media.Ocr 的限制是架構性的而非偶然的。 平台鎖定不是一個可以關掉的配置標識; 它深植於該 API 依賴的 WinRT 運行時中。 語言可用性不是在構建時包含的捆綁包;它委託給系統管理員。 PDF 支援不是一個可以用 NuGet 套件來新增的遺漏功能; 它在 API 表面上完全不存在。 每個限制都需要一個獨立系統來補償它,而每個補償系統重新引入平台依賴性。

IronOCR 在一個套件中解決所有四個約束——平台、語言、預處理和 PDF。 $999 的入門價不是 $0,對於一個 Windows 唯一控制輸入和僅英語文件的桌面工具,Windows.Media.Ocr 仍然是一個合理的選擇。對於任何具有更廣泛要求的專案,圍繞 Windows.Media.Ocr 限制的建設成本可能會超過IronOCR授權成本,在專案到達其首個生產部署之前的開發時間。

實際的測試很簡單:如果部署目標有可能是 Linux、Docker 或雲環,並且如果輸入文件有可能是 PDF 或超出預設操作系統包的語言,則 Windows.Media.Ocr 是錯誤的基礎。 在專案中途發現這一點比起一開始就選擇合適的工具要昂貴得多。 在提交任何一方向之前評估IronOCR的功能集及與您特定要求的匹配是做出那個決定的最有效方法。

請注意Tesseract and Windows Media OCR are registered trademarks of their respective owners. 此站點與Google或Microsoft無任何聯繫、認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供資訊用途,並反映撰寫時獲得的公開資訊。

常見問題

什麼是 Windows.Media.Ocr?

Windows.Media.Ocr 是一種 OCR 解決方案,由開發者和企業用來從圖像和文件中提取文字。它是幾個 OCR 選項之一,與 IronOCR 一起評估,用於 .NET 應用程式開發。

IronOCR 與 Windows.Media.Ocr 對於 .NET 開發者之間的比較如何?

IronOCR 是一個 NuGet 原生 .NET OCR 程式庫,使用 IronTesseract 作為其核心引擎。與 Windows.Media.Ocr 相比,它提供更簡單的部署(無需 SDK 安裝程式),固定費率定價,並且有一個乾淨的 C# API,無需 COM 互操作或雲端依賴。

IronOCR 的設置是否比 Windows.Media.Ocr 更簡單?

IronOCR 通過一個單一的 NuGet 套件安裝。無需 SDK 安裝程式、複製授權文件、註冊 COM 元件或管理單獨的運行時二進位檔案。整個 OCR 引擎都打包在套件中。

Windows.Media.Ocr 和 IronOCR 之間在準確性上有什麼差異?

IronOCR 在標準商業文件、發票、收據和掃描表單上達到了高識別準確度。對於極度退化的文件或罕見文字,準確度會根據來源品質變化。IronOCR 包含影像預處理篩選器,以改善低品質輸入的識別。

IronOCR 支援 PDF 文字提取嗎?

是的。IronOCR 能從原生 PDF 和掃描的 PDF 圖像中一次性提取文字。它還支持多頁 TIFF 檔案、影像和流。對於掃描的 PDF,OCR 會逐頁應用並生成每頁的結果物件。

Windows.Media.Ocr 的授權與 IronOCR 如何比較?

IronOCR 採用固定費率的永久授權,無須為每頁或每次掃描支付費用。處理大量文件的組織無論數量多少都支付相同的授權費用。詳細資訊和批量定價在 IronOCR 授權頁面上。

IronOCR 支援哪些語言?

IronOCR 透過單獨的 NuGet 語言包支持 127 種語言。新增一種語言只需一個 'dotnet add package IronOcr.Languages.{Language}' 命令。無需手動放置文件或配置路徑。

如何在.NET專案中安裝IronOCR?

通過 NuGet 安裝:在套件管理員控制台或 CLI 中分別使用 'Install-Package IronOcr' 或 'dotnet add package IronOcr'。其他語言包也是這樣安裝的。無需本地 SDK 安裝程式。

IronOCR 是否適合用於 Docker 和容器化部署,與 Windows.Media.Ocr 不同?

是的。IronOCR 通過其 NuGet 載於 Docker 容器中運行。授權金鑰通過環境變數設置。無需授權文件、SDK 路徑或量掛載來執行 OCR 引擎。

與 Windows.Media.Ocr 相比,我可以在購買之前試用 IronOCR 嗎?

是的。IronOCR 試用模式中處理文件並在輸出上附上浮水印結果。您可以在購買授權前驗證自己文件的準確性。

IronOCR 支援條碼閱讀與文字提取嗎?

IronOCR 專注於文字提取和 OCR。對於條碼閱讀,Iron Software 提供了額外的 IronBarcode 程式庫。兩者均可個別使用或作為 Iron Suite 套件的一部分。

從 Windows.Media.Ocr 遷移到 IronOCR 是否容易?

從 Windows.Media.Ocr 遷移到 IronOCR 通常涉及用 IronTesseract 實例替換初始化序列,去除 COM 生命週期管理,並更新 API 呼叫。大多數遷移顯著降低程式碼複雜度。

Kannaopat Udonpant
軟體工程師
在成為軟體工程師之前,Kannapat在日本北海道大學完成了環境資源博士學位。在攻讀學位期間,Kannapat還成為車輛機器人實驗室的一員,該實驗室隸屬於生產工程系。在2022年,他憑藉C#技能加入了Iron Software的工程團隊,專注於IronPDF。Kannapat珍視他的工作,因為他能直接向撰寫大部分IronPDF程式碼的開發者學習。除了同儕學習,Kannapat還喜歡在Iron Software工作的社交方面。不寫程式碼或文件時,Kannapat通常在他的PS5上玩遊戲或重看The Last of Us。

Iron 支援團隊

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