MODI OCR C# 與 IronOCR:在 C# 中選擇適當的 OCR 光學字元辨識庫
TesseractOCR (由 Sicos1977 分支) 是一個真正活躍、現代的 .NET 包裝器 — 這正是使其限制值得仔細檢查的原因。 與已歸檔的 charlesw/tesseract 項目不同,此分支針對 .NET 6+ 並包裝 Tesseract 5.4.1。然而,更新的包裝器並無法修正其下的 Tesseract 引擎。 從 charlesw 升級到TesseractOCR以獲得框架相容性的團隊會發現所有的困難問題依然存在:tessdata 資料夾管理、零內建的預處理、沒有原生的 PDF 支持,以及非執行緒安全的引擎,在並行場景下需要每個執行緒一個實例。
理解TesseractOCR
TesseractOCR 是由 Kees van Spelde (Sicos1977) 維護的 Apache 2.0 版權的 .NET 包裝器,是原始 charlesw/tesseract 項目的社群分支。 分支的主要動機是實際的:在 2023 年後,charlesw 的活動減緩,使得 .NET 6/7/8 開發者失去了當前框架的 Tesseract 綁定。TesseractOCR透過針對 .NET 6.0、7.0 和 8.0,並捆綁適用於 Windows x64、Linux x64 和 macOS 的 Tesseract 5.x 原生程式庫來彌補這一空白。
架構是一個 P/Invoke 包裝器:排序的 .NET 程式碼通過互操作來調用原生的 Tesseract C API。NuGet 套件打包了常見平台的原生二進位文件,這消除了舊包裝中一些原生程式庫部署摩擦。 然而,基本設計仍然是一個對 Tesseract 引擎薄弱的綁定 — 沒有預處理邏輯,沒有 PDF 管道,沒有執行緒抽象。
關鍵架構特徵:
- 由單一志願者開發者積極維護 — 發佈更新,但沒有 SLA,沒有商業支援,總突擊能力僅為一人
- 包裝 Tesseract 5.5.0 — 最新的 LSTM 引擎改進可以存取,這是相較於 charlesw 的 5.2.0 的優勢
- 針對 .NET 6.0+ — 現代框架定向是分支存在的主要原因
- 需要手動 tessdata 管理 — 語言
.traineddata文件必須單獨下載並與應用程式共同部署 - 沒有內建預處理 — 包裝器直接調用
engine.Process(image); 圖像質量的提升完全是開發者的責任 - 非執行緒安全的引擎 —
Engine實例不能跨執行緒共享; 每個並行工作者需要擁有自己的實例,這會成倍增加記憶體消耗 - 沒有原生的 PDF 支持 — PDF 輸入需要單獨的程式庫(Docnet.Core, PdfiumViewer)來將頁面渲染成圖像,然後 Tesseract 才能處理它們
- ~200K 次 NuGet 下載 vs charlesw 的 ~8M — 較小型社群意味著較少的 Stack Overflow 答案、較少的教程,以及來自現有 Tesseract 資源的更多適應工作
引擎初始化和 tessdata 依賴
每個TesseractOCR操作都以 Engine 初始化開始,而該初始化需要一個包含手動從外部儲存庫下載的語言 .traineddata 文件的 tessdata 資料夾:
// tessdata/eng.traineddata must exist before this line runs
// Downloaded separately: curl -L -o tessdata/eng.traineddata
// https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile("document.png");
using var page = engine.Process(image);
string text = page.Text;
float confidence = page.MeanConfidence; // Returns 0.0-1.0 float
// tessdata/eng.traineddata must exist before this line runs
// Downloaded separately: curl -L -o tessdata/eng.traineddata
// https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile("document.png");
using var page = engine.Process(image);
string text = page.Text;
float confidence = page.MeanConfidence; // Returns 0.0-1.0 float
Imports TesseractOCR
' tessdata/eng.traineddata must exist before this line runs
' Downloaded separately: curl -L -o tessdata/eng.traineddata
' https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata
Using engine As New Engine("./tessdata", Language.English, EngineMode.Default)
Using image As Pix.Image = TesseractOCR.Pix.Image.LoadFromFile("document.png")
Using page As Page = engine.Process(image)
Dim text As String = page.Text
Dim confidence As Single = page.MeanConfidence ' Returns 0.0-1.0 float
End Using
End Using
End Using
Engine 構造函式接受 tessdata 目錄路徑和 Language 枚舉值。 如果目錄不存在,如果 .traineddata 文件丟失,或者如果文件版本不匹配 Tesseract 引擎版本,初始化將引發異常。 這是 Tesseract 包裝常見生產失敗中的三種,而TesseractOCR繼承了所有這些失敗。 專案的 README 包含防禦性驗證程式碼,在嘗試構建引擎之前檢查 tessdata 資料夾和個別語言文件,這告訴您開發者遇到這個問題的頻率有多高。
理解 IronOCR
IronOCR 是一個商業 .NET OCR 程式庫,包裝了一個優化的 Tesseract 5 引擎,具有自動預處理、原生的 PDF 輸入/輸出和執行緒安全架構。 整個程式庫作為單個 NuGet 套件運送,沒有外部依賴,沒有 tessdata 資料夾管理,也沒有原生程式庫配置。
關鍵特徵:
- 單一 NuGet 安裝 —
dotnet add package IronOcr產生一個工作的 OCR 管道;沒有 tessdata,沒有原生二進位設置,核心工作流程不需要額外的套件 - 自動預處理 — 引擎自動應用校正、噪聲去除、對比度增強、二值化和解析度縮放;當需要細粒度控制時,可使用明確的過濾器方法
- 原生 PDF 輸入和輸出 — PDF 通過
OcrInput.LoadPdf()直接載入; 掃描的 PDF 通過result.SaveAsSearchablePdf()產生可搜尋的 PDF 輸出 - 執行緒安全
IronTesseract— 單一實例處理並發請求而不需要每個執行緒的重複 - 125+ 語言作為 NuGet 套件 — 無需外部文件下載; 語言包安裝通過
dotnet add package IronOcr.Languages.French,引用時無需路徑配置 - 永久授權 — $999 Lite / $1,499 Plus / $2,999 Professional; 沒有每份文件的費用,無需訂閱
- 跨平台一致行為 — Windows、Linux、macOS、Docker、Azure 和 AWS 都可從同一個套件運作,無需平台特定配置
功能比較
| 功能 | TesseractOCR | IronOCR |
|---|---|---|
| .NET 定向 | .NET 6.0, 7.0, 8.0 | .NET 6.0, 7.0, 8.0, .NET Framework 4.6.2+ |
| 許可證 | Apache 2.0(免費) | 商業 ($999+ 永久) |
| tessdata management | 必需 (手動下載) | 不需要(捆綁) |
| 內建預處理 | None | 自動 + 明確的過濾 |
| 本地PDF輸入 | 不是 | 是 |
| 可搜尋的 PDF 輸出 | 不是 | 是 |
| 執行緒安全性 | 否 (每個執行緒的引擎) | 是 (單一共享實例) |
詳細功能比較
| 功能 | TesseractOCR | IronOCR |
|---|---|---|
| 設置和部署 | ||
| NuGet安裝 | TesseractOCR |
IronOcr |
| 需要 tessdata 文件夾 | 是 | 不是 |
| 語言文件下載 | 手動 (GitHub) | NuGet套件 |
| 原生二進位打包 | 部分 (常見平台) | 全部 |
| 單一套件部署 | 否 (tessdata分開) | 是 |
| 氣隙環境 | 需要預放置的 tessdata | 語言 NuGet 包可離線工作 |
| OCR能力 | ||
| Tesseract引擎版本 | 5.5.0 | 5.x (已優化) |
| 自動去偏 | 不是 | 是 |
| 自動噪聲去除 | 不是 | 是 |
| 自動對比度 | 不是 | 是 |
| 解析度增強 | 不是 | 是 (EnhanceResolution(300)) |
| 二值化 | 不是 | 是 |
| PDF 支持 | ||
| PDF 輸入 | 否 (需要外部程式庫) | 是(本地) |
| 受密碼保護的 PDF | 否 (需要解密 + 重新處理) | 是 (單參數) |
| 可搜尋的 PDF 輸出 | 不是 | 是 |
| 特定頁面範圍 | 手動 (每頁渲染迴圈) | 是 (LoadPdfPages) |
| 語言支持 | ||
| 支持的語言 | 任何 tessdata 文件 | 通過 NuGet 提供的 125 多種 |
| 多語言語法 | Language.English |Language.French |
OcrLanguage.English + OcrLanguage.French |
| 自定義語言資料 | 是 (將文件複製到 tessdata) | 是 (自定義語言包) |
| 多執行緒和批次 | ||
| 執行緒安全的引擎 | 不是 | 是 |
| 並行處理模式 | 每個執行緒的引擎(記憶體密集) | 單一實例,並行輸入 |
| 每執行緒記憶體 | ~40-100MB 每個引擎實例 | 共享實例 |
| 輸出和結果 | ||
| 信心分數 | page.MeanConfidence (0.0-1.0) |
result.Confidence (0-100%) |
| 字詞級別定位 | 有限 | 是 (X, Y, 寬度, 高度 每字) |
| 結構化結果層次 | 不是 | 頁面、段落、行、單詞 |
| OCR期間的條碼讀取 | 不是 | 是 |
| hOCR匯出 | 不是 | 是 |
| 支持和維護 | ||
| 維護模式 | 單一志願者開發者 | 商業團隊 |
| 商業支持 | 不是 | 是 (電子郵件,SLA 選項) |
| GitHub 問題回覆 | 志願者時間表 | 商業時間表 |
Tessdata 管理:永不消失的部署問題
Sicos1977 分支更新了 Tesseract 引擎並現代化了目標框架。 它並沒有改變語言資料的運作方式。 每個運行TesseractOCR的環境都需要一個填滿了 .traineddata 文件的 tessdata 資料夾才能進行第一次 Engine 構造函式調用。
TesseractOCR方法
此儲存庫中的 basic-ocr.cs 文件包含一個 ValidateTessData() 方法,該專案建議在任何 OCR 操作之前運行它。 存在這種防禦模式是因為失敗模式 —— 一個 TesseractException 被拋出的管道中期 —— 足夠常見,以至於庫自己的範例如此保護:
// From BasicOcrService in tesseractocr-basic-ocr.cs
private void ValidateTessData()
{
if (!Directory.Exists(_tessDataPath))
{
throw new DirectoryNotFoundException(
$"tessdata folder not found at: {_tessDataPath}\n" +
"Download traineddata files from: https://github.com/tesseract-ocr/tessdata_best");
}
string engTrainedData = Path.Combine(_tessDataPath, "eng.traineddata");
if (!File.Exists(engTrainedData))
{
throw new FileNotFoundException(
$"eng.traineddata not found in {_tessDataPath}\n" +
"Download from: https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata");
}
}
// From BasicOcrService in tesseractocr-basic-ocr.cs
private void ValidateTessData()
{
if (!Directory.Exists(_tessDataPath))
{
throw new DirectoryNotFoundException(
$"tessdata folder not found at: {_tessDataPath}\n" +
"Download traineddata files from: https://github.com/tesseract-ocr/tessdata_best");
}
string engTrainedData = Path.Combine(_tessDataPath, "eng.traineddata");
if (!File.Exists(engTrainedData))
{
throw new FileNotFoundException(
$"eng.traineddata not found in {_tessDataPath}\n" +
"Download from: https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata");
}
}
Private Sub ValidateTessData()
If Not Directory.Exists(_tessDataPath) Then
Throw New DirectoryNotFoundException(
$"tessdata folder not found at: {_tessDataPath}" & vbCrLf &
"Download traineddata files from: https://github.com/tesseract-ocr/tessdata_best")
End If
Dim engTrainedData As String = Path.Combine(_tessDataPath, "eng.traineddata")
If Not File.Exists(engTrainedData) Then
Throw New FileNotFoundException(
$"eng.traineddata not found in {_tessDataPath}" & vbCrLf &
"Download from: https://github.com/tesseract-ocr/tessdata_best/raw/main/eng.traineddata")
End If
End Sub
多語言 OCR 加劇了這個問題。 每個語言需要自己的 .traineddata 文件 — 每個語言 15 到 50 MB —— 並且這些文件必須來自正確的儲存庫版本。 tessdata_best 儲存庫提供更高的準確性但處理速度較慢; tessdata_fast 以速度換取準確性。 混合版本,或使用為 Tesseract 4.x 構建的 tessdata 文件搭配 Tesseract 5.x 引擎使用,會在無報錯信號的情況下靜默降低準確性。
對於 Docker 部署,tessdata 文件必須嵌入到鏡像中或安裝到已知路徑。 對於 CI/CD 管道,下載步驟必須被腳本化並快取。 對於氣隙環境,文件必須預先定置。 每個部署配置都是另一個可以失敗的地方。
// Multi-language requires each .traineddata file pre-downloaded
// eng.traineddata + fra.traineddata + deu.traineddata all required
using var engine = new Engine(@"./tessdata",
Language.English | Language.French | Language.German,
EngineMode.Default);
// If any traineddata file is missing, this throws at construction time
using var image = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
using var page = engine.Process(image);
return page.Text;
// Multi-language requires each .traineddata file pre-downloaded
// eng.traineddata + fra.traineddata + deu.traineddata all required
using var engine = new Engine(@"./tessdata",
Language.English | Language.French | Language.German,
EngineMode.Default);
// If any traineddata file is missing, this throws at construction time
using var image = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
using var page = engine.Process(image);
return page.Text;
Imports TesseractOCR
' Multi-language requires each .traineddata file pre-downloaded
' eng.traineddata + fra.traineddata + deu.traineddata all required
Using engine As New Engine("./tessdata", Language.English Or Language.French Or Language.German, EngineMode.Default)
' If any traineddata file is missing, this throws at construction time
Using image As TesseractOCR.Pix.Image = TesseractOCR.Pix.Image.LoadFromFile(imagePath)
Using page As Page = engine.Process(image)
Return page.Text
End Using
End Using
End Using
IronOCR方法
IronOCR 以 NuGet 套件形式運送語言支持。 英語被打包在核心包中。 附加語言通過單個命令安裝,無需路徑配置:
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German
// No tessdata folder, no download scripts, no path validation
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
return result.Text;
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German
// No tessdata folder, no download scripts, no path validation
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
return result.Text;
Imports IronOcr
' dotnet add package IronOcr.Languages.French
' dotnet add package IronOcr.Languages.German
' No tessdata folder, no download scripts, no path validation
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.French
ocr.AddSecondaryLanguage(OcrLanguage.German)
Using input As New OcrInput()
input.LoadImage(imagePath)
Dim result = ocr.Read(input)
Return result.Text
End Using
語言包是 NuGet 依賴項,以版本管理,會自動還原,並與應用程式二進位一起部署。 沒有外部 GitHub 儲存庫,沒有 curl 腳本,沒有構建系統配置將文件複製到輸出目錄。 對於氣隙部署,NuGet 套件可以從私有提要離線恢復,與其他任何套件方式相同。 多語言指南涵蓋了所有支持的 125+ 種語言的設置。
預處理:現代分支仍無法做到的
TesseractOCR 的 Sicos1977 分支比 charlesw 的更新,針對當前 .NET,並捆綁了更新的 Tesseract 二進位文件。 這都沒有改變開發者將一個傾斜,對比度低或手機相機品質的圖像傳遞給 engine.Process(image) 時發生的情況。 引擎獲得的是原始像素。 Tesseract 產生退化的輸出。 然後,開發者將一個外部成像庫新增到依賴圖中,並編寫預處理程式碼。
TesseractOCR方法
此儲存庫中的 migration-comparison.cs 文件顯示了TesseractOCR需要的預處理模式。 必須新增外部成像程式庫(在此情況下為 SixLabors.ImageSharp),必須調整手動過濾器參數,並且必須將預處理後的圖像寫入臨時文件,然後TesseractOCR才能閱讀它 — 因為 TesseractOCR.Pix.Image API 期望有一個文件路徑:
// Requires: dotnet add package SixLabors.ImageSharp
// Manual preprocessing — each parameter requires tuning per document type
using var image = Image.Load(imagePath);
image.Mutate(x => x.Grayscale());
image.Mutate(x => x.Contrast(1.5f)); // 1.5 is a guess; tune per use case
image.Mutate(x => x.GaussianBlur(0.5f)); // Denoise with blur
image.Mutate(x => x.BinaryThreshold(0.5f)); // Threshold requires manual tuning
// Deskew is NOT in ImageSharp — requires separate Hough transform implementation
// (~50-100 additional lines)
string tempPath = Path.GetTempFileName() + ".png";
try
{
image.Save(tempPath);
using var engine = new Engine(@"./tessdata", Language.English);
using var pixImage = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(pixImage);
return page.Text;
}
finally
{
File.Delete(tempPath); // Clean up temp file
}
// Requires: dotnet add package SixLabors.ImageSharp
// Manual preprocessing — each parameter requires tuning per document type
using var image = Image.Load(imagePath);
image.Mutate(x => x.Grayscale());
image.Mutate(x => x.Contrast(1.5f)); // 1.5 is a guess; tune per use case
image.Mutate(x => x.GaussianBlur(0.5f)); // Denoise with blur
image.Mutate(x => x.BinaryThreshold(0.5f)); // Threshold requires manual tuning
// Deskew is NOT in ImageSharp — requires separate Hough transform implementation
// (~50-100 additional lines)
string tempPath = Path.GetTempFileName() + ".png";
try
{
image.Save(tempPath);
using var engine = new Engine(@"./tessdata", Language.English);
using var pixImage = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(pixImage);
return page.Text;
}
finally
{
File.Delete(tempPath); // Clean up temp file
}
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.Processing
Imports TesseractOCR
Imports System.IO
' Requires: dotnet add package SixLabors.ImageSharp
' Manual preprocessing — each parameter requires tuning per document type
Dim image As Image = Image.Load(imagePath)
image.Mutate(Sub(x) x.Grayscale())
image.Mutate(Sub(x) x.Contrast(1.5F)) ' 1.5 is a guess; tune per use case
image.Mutate(Sub(x) x.GaussianBlur(0.5F)) ' Denoise with blur
image.Mutate(Sub(x) x.BinaryThreshold(0.5F)) ' Threshold requires manual tuning
' Deskew is NOT in ImageSharp — requires separate Hough transform implementation
' (~50-100 additional lines)
Dim tempPath As String = Path.GetTempFileName() & ".png"
Try
image.Save(tempPath)
Using engine As New Engine("./tessdata", Language.English)
Using pixImage As TesseractOCR.Pix.Image = TesseractOCR.Pix.Image.LoadFromFile(tempPath)
Using page As Page = engine.Process(pixImage)
Return page.Text
End Using
End Using
End Using
Finally
File.Delete(tempPath) ' Clean up temp file
End Try
TesseractOCR 列出的 README 中,在不完美的輸入上,精確度下降:5 度傾斜精確度從 97% 下降到 65-75%; 手機相機拍攝降到 30-50%。 這些並不是生產中的邊緣案例 —— 它們是掃描文件、白板照片和傳真件的預設狀態。 恢復該精確度需要去傾斜,噪聲減少和對比度標準化。 僅去傾斜的功能在一般 .NET 成像程式庫中不可用,並且需要實現霍夫變換角度檢測算法。
IronOCR方法
IronOCR 的預處理管道內建於 OcrInput。 調用 Deskew()、DeNoise()、Contrast() 和 EnhanceResolution() 應用相應的算法,無需外部庫,無需臨時文件,無需為常見文件型別調整參數:
// No external imaging library needed
// No temp files, no manual parameter tuning
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew(); // Automatic angle detection and correction
input.DeNoise(); // Intelligent noise removal
input.Contrast(); // Automatic contrast enhancement
input.EnhanceResolution(300); // Upscale if below 300 DPI
var result = new IronTesseract().Read(input);
return result.Text;
// No external imaging library needed
// No temp files, no manual parameter tuning
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew(); // Automatic angle detection and correction
input.DeNoise(); // Intelligent noise removal
input.Contrast(); // Automatic contrast enhancement
input.EnhanceResolution(300); // Upscale if below 300 DPI
var result = new IronTesseract().Read(input);
return result.Text;
Imports IronOcr
' No external imaging library needed
' No temp files, no manual parameter tuning
Using input As New OcrInput()
input.LoadImage(imagePath)
input.Deskew() ' Automatic angle detection and correction
input.DeNoise() ' Intelligent noise removal
input.Contrast() ' Automatic contrast enhancement
input.EnhanceResolution(300) ' Upscale if below 300 DPI
Dim result = New IronTesseract().Read(input)
Return result.Text
End Using
對於質量問題未知的文件,引擎自動應用基線校正,無需顯式的過濾器調用。 圖像質量校正指南涵蓋了每個過濾器和需要自動行為調整的場合的參數選項。 圖像方向校正指南涵蓋了去傾斜和旋轉檢測專門材料 —— 這些操作在TesseractOCR中需要自定義實現。 低質量掃描範例演示了在具有挑戰性的文件上的準確度差異。
PDF 處理:外部程式庫稅
TesseractOCR 處理圖像。 它不處理 PDF。 每個使用TesseractOCR的 PDF 工作流程都需要第二個程式庫將 PDF 頁面轉換成圖像文件,每個 PDF-渲染的圖像工作流程需要臨時文件管理、字節格式轉換和清理邏輯。
TesseractOCR方法
此儲存庫中的 tesseractocr-pdf-processing.cs 文件實現了完整的 PDF OCR 服務。它需要 Docnet.Core 作為額外的依賴,並且需要大約 100 行程式碼來完成IronOCR用 3 行就能做到的事情。 核心提取迴圈涉及使用 Docnet 載入 PDF,將每頁渲染成 BGRA 字節陣列,將每頁寫入臨時文件(因為 TesseractOCR.Pix.Image.LoadFromFile 需要一個文件路徑,而不是字節陣列),OCR 處理臨時文件,附加到 StringBuilder,並在 finally 塊中刪除臨時文件:
// Requires: dotnet add package TesseractOCR
// dotnet add package Docnet.Core
// Note: Docnet is MIT-licensed; iTextSharp would be AGPL
using var library = DocLib.Instance;
using var docReader = library.GetDocReader(pdfPath, new PageDimensions(dpi, dpi));
int pageCount = docReader.GetPageCount();
var allText = new StringBuilder();
var tempFiles = new List<string>();
try
{
using var engine = new Engine(_tessDataPath, Language.English, EngineMode.Default);
for (int pageIndex = 0; pageIndex < pageCount; pageIndex++)
{
using var pageReader = docReader.GetPageReader(pageIndex);
var width = pageReader.GetPageWidth();
var height = pageReader.GetPageHeight();
var imageBytes = pageReader.GetImage(); // BGRA bytes
// TesseractOCR.Pix.Image requires a file path — write to temp
string tempPath = Path.Combine(_tempDirectory, $"page_{pageIndex}_{Guid.NewGuid()}.png");
tempFiles.Add(tempPath);
SaveBgraAsPng(imageBytes, width, height, tempPath); // ~30 lines
using var image = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(image);
allText.AppendLine($"--- Page {pageIndex + 1} ---");
allText.AppendLine(page.Text);
}
}
finally
{
foreach (var tempFile in tempFiles)
{
try { File.Delete(tempFile); } catch { }
}
}
// Requires: dotnet add package TesseractOCR
// dotnet add package Docnet.Core
// Note: Docnet is MIT-licensed; iTextSharp would be AGPL
using var library = DocLib.Instance;
using var docReader = library.GetDocReader(pdfPath, new PageDimensions(dpi, dpi));
int pageCount = docReader.GetPageCount();
var allText = new StringBuilder();
var tempFiles = new List<string>();
try
{
using var engine = new Engine(_tessDataPath, Language.English, EngineMode.Default);
for (int pageIndex = 0; pageIndex < pageCount; pageIndex++)
{
using var pageReader = docReader.GetPageReader(pageIndex);
var width = pageReader.GetPageWidth();
var height = pageReader.GetPageHeight();
var imageBytes = pageReader.GetImage(); // BGRA bytes
// TesseractOCR.Pix.Image requires a file path — write to temp
string tempPath = Path.Combine(_tempDirectory, $"page_{pageIndex}_{Guid.NewGuid()}.png");
tempFiles.Add(tempPath);
SaveBgraAsPng(imageBytes, width, height, tempPath); // ~30 lines
using var image = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(image);
allText.AppendLine($"--- Page {pageIndex + 1} ---");
allText.AppendLine(page.Text);
}
}
finally
{
foreach (var tempFile in tempFiles)
{
try { File.Delete(tempFile); } catch { }
}
}
Imports Docnet.Core
Imports TesseractOCR
Imports System.IO
Imports System.Text
' Requires: dotnet add package TesseractOCR
' dotnet add package Docnet.Core
' Note: Docnet is MIT-licensed; iTextSharp would be AGPL
Dim library = DocLib.Instance
Dim docReader = library.GetDocReader(pdfPath, New PageDimensions(dpi, dpi))
Dim pageCount As Integer = docReader.GetPageCount()
Dim allText As New StringBuilder()
Dim tempFiles As New List(Of String)()
Try
Using engine As New Engine(_tessDataPath, Language.English, EngineMode.Default)
For pageIndex As Integer = 0 To pageCount - 1
Using pageReader = docReader.GetPageReader(pageIndex)
Dim width = pageReader.GetPageWidth()
Dim height = pageReader.GetPageHeight()
Dim imageBytes = pageReader.GetImage() ' BGRA bytes
' TesseractOCR.Pix.Image requires a file path — write to temp
Dim tempPath As String = Path.Combine(_tempDirectory, $"page_{pageIndex}_{Guid.NewGuid()}.png")
tempFiles.Add(tempPath)
SaveBgraAsPng(imageBytes, width, height, tempPath) ' ~30 lines
Using image = TesseractOCR.Pix.Image.LoadFromFile(tempPath)
Using page = engine.Process(image)
allText.AppendLine($"--- Page {pageIndex + 1} ---")
allText.AppendLine(page.Text)
End Using
End Using
End Using
Next
End Using
Finally
For Each tempFile In tempFiles
Try
File.Delete(tempFile)
Catch
End Try
Next
End Try
密碼保護的 PDF 需要第三方程式庫(iText 帶有 AGPL 許可,或 PDFSharp)來首先解密文件,這增加了另一個依賴和另一個許可問題需要評估。 tesseractocr-pdf-processing.cs 文件的評論對此直言不諱:"TesseractOCR + Docnet 不能直接處理密碼保護的 PDF。 你需要:1. 使用支持解密的 PDF 程式庫... 2. 首先解密/移除密碼... 3. 保存解密的 PDF... 4. 然後處理上述程式碼。"
IronOCR方法
IronOCR 的 PDF 支持是原生的。沒有外部程式庫,沒有臨時文件,沒有字節格式轉換。 PDF 輸入指南涵蓋了每個 PDF 場景 —— 完整文件、頁面範圍和密碼保護文件:
// Full PDF — native, no external library
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(pdfPath);
var result = ocr.Read(input);
string text = result.Text;
// Password-protected PDF — built-in, one parameter
using var encryptedInput = new OcrInput();
encryptedInput.LoadPdf("encrypted.pdf", Password: "secret");
var encryptedResult = ocr.Read(encryptedInput);
// Specific page range — no manual loop required
using var pageInput = new OcrInput();
pageInput.LoadPdfPages(pdfPath, startPage: 1, endPage: 5);
var pageResult = ocr.Read(pageInput);
// Full PDF — native, no external library
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(pdfPath);
var result = ocr.Read(input);
string text = result.Text;
// Password-protected PDF — built-in, one parameter
using var encryptedInput = new OcrInput();
encryptedInput.LoadPdf("encrypted.pdf", Password: "secret");
var encryptedResult = ocr.Read(encryptedInput);
// Specific page range — no manual loop required
using var pageInput = new OcrInput();
pageInput.LoadPdfPages(pdfPath, startPage: 1, endPage: 5);
var pageResult = ocr.Read(pageInput);
Imports IronTesseract
Dim ocr As New IronTesseract()
' Full PDF — native, no external library
Using input As New OcrInput()
input.LoadPdf(pdfPath)
Dim result = ocr.Read(input)
Dim text As String = result.Text
End Using
' Password-protected PDF — built-in, one parameter
Using encryptedInput As New OcrInput()
encryptedInput.LoadPdf("encrypted.pdf", Password:="secret")
Dim encryptedResult = ocr.Read(encryptedInput)
End Using
' Specific page range — no manual loop required
Using pageInput As New OcrInput()
pageInput.LoadPdfPages(pdfPath, startPage:=1, endPage:=5)
Dim pageResult = ocr.Read(pageInput)
End Using
掃描的 PDF — 這是TesseractOCR與 Docnet + 預處理 + OCR 組合最痛苦的場景 — 也是IronOCR的預處理管道最重要的場景。掃描 PDF 通過 LoadPdf()、自動預處理、OCR 和可選擇的搜尋 PDF 輸出在沒有臨時文件管理的線性鏈中進行。 PDF OCR 範例和搜尋 PDF 指南涵蓋了完整的工作流程,包括 result.SaveAsSearchablePdf(),TesseractOCR 中無任何等價功能可以使用。
執行緒管理:非執行緒安全引擎的記憶體成本
TesseractOCR 的 Engine 不是執行緒安全的。 basic-ocr.cs 文件包含一個帶有顯式警告的 ThreadSafeOcrService 類:"記憶體開銷:4 個執行緒 x 50MB = 200MB+ 只為引擎。"並行TesseractOCR的成本是一個引擎實例對每個執行緒,持有大約 ~40-100MB 的原生 Tesseract 記憶體,每個需要 ~500ms 初始化時間。
TesseractOCR方法
TesseractOCR 的並行處理需要在每個工作者 lambda 中建立一個新的 Engine:
// WARNING: Engine is NOT thread-safe — must create per thread
// Memory: _maxDegreeOfParallelism * engine footprint (~40-100MB each)
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(
imagePaths,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
imagePath =>
{
// Per-thread engine — required, expensive (~500ms init, ~50MB memory)
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
using var page = engine.Process(image);
results[imagePath] = page.Text;
});
// WARNING: Engine is NOT thread-safe — must create per thread
// Memory: _maxDegreeOfParallelism * engine footprint (~40-100MB each)
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(
imagePaths,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
imagePath =>
{
// Per-thread engine — required, expensive (~500ms init, ~50MB memory)
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
using var page = engine.Process(image);
results[imagePath] = page.Text;
});
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' WARNING: Engine is NOT thread-safe — must create per thread
' Memory: _maxDegreeOfParallelism * engine footprint (~40-100MB each)
Dim results As New ConcurrentDictionary(Of String, String)()
Parallel.ForEach(
imagePaths,
New ParallelOptions With {.MaxDegreeOfParallelism = 4},
Sub(imagePath)
' Per-thread engine — required, expensive (~500ms init, ~50MB memory)
Using engine As New Engine("./tessdata", Language.English, EngineMode.Default)
Using image As TesseractOCR.Pix.Image = TesseractOCR.Pix.Image.LoadFromFile(imagePath)
Using page As Page = engine.Process(image)
results(imagePath) = page.Text
End Using
End Using
End Using
End Sub)
單引擎重用模式(在迴圈外建立一個引擎並按順序重用它)適用于串行處理,但如果任何其他執行緒觸及實例,就會失效。 因此,承載下的批處理要求要麼接受每個執行緒引擎的記憶體成本,要麼實施一個謹慎管理生命週期的執行緒局部引擎池。
IronOCR方法
IronTesseract 是執行緒安全的。 一個實例處理來自任意多個並行執行緒的請求:
// Single instance — thread-safe, no per-thread duplication
var ocr = new IronTesseract();
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, imagePath =>
{
using var input = new OcrInput(imagePath);
results[imagePath] = ocr.Read(input).Text;
});
// Single instance — thread-safe, no per-thread duplication
var ocr = new IronTesseract();
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, imagePath =>
{
using var input = new OcrInput(imagePath);
results[imagePath] = ocr.Read(input).Text;
});
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' Single instance — thread-safe, no per-thread duplication
Dim ocr As New IronTesseract()
Dim results As New ConcurrentDictionary(Of String, String)()
Parallel.ForEach(imagePaths, Sub(imagePath)
Using input As New OcrInput(imagePath)
results(imagePath) = ocr.Read(input).Text
End Using
End Sub)
多執行緒範例展示了模式。 4 個並行工作者的記憶體使用量是一個引擎實例,而不是四個。 對於吞吐量很重要的批次文件處理管道,這是一個顯著的不同。
API 地圖參考
| TesseractOCR | IronOCR 等效 | 注意事項 |
|---|---|---|
Engine(tessDataPath, Language.English, EngineMode.Default) |
new IronTesseract() |
不需要 tessdata 路徑 |
TesseractOCR.Pix.Image.LoadFromFile(path) |
new OcrInput(path) |
支持更多格式 |
engine.Process(image) |
ocr.Read(input) |
核心 OCR 調用 |
page.Text |
result.Text |
完整提取文字 |
page.MeanConfidence (0.0-1.0) |
result.Confidence (0-100) |
比例不同 |
Language.English |Language.French |
OcrLanguage.English + OcrLanguage.French |
操作符不同 |
EngineMode.Default |
不適用 | 自動選擇 |
TesseractOCR.Exceptions.TesseractException |
IronOcr.Exceptions.OcrException |
處理的異常型別較少 |
| 手工預處理 (ImageSharp) | input.Deskew(), input.DeNoise(), input.Contrast() |
內建,無外部庫 |
Docnet GetPageReader().GetImage() + 臨時文件 |
input.LoadPdf(path) |
原生 PDF,無臨時文件 |
| 不適用 | input.LoadPdf(path, Password: "secret") |
沒有與外部程式庫等價的功能 |
| 不適用 | result.SaveAsSearchablePdf(path) |
TesseractOCR中沒有與此等價的功能 |
| 不適用 | result.Pages, result.Lines, result.Words |
結構化輸出 |
| 不適用 | ocr.Configuration.ReadBarCodes = true |
條形碼共讀 |
每個執行緒的 Engine 實例 |
單一 IronTesseract 實例 |
執行緒安全內建 |
當團隊考慮從TesseractOCR轉至IronOCR時
文件質量各不相同
TesseractOCR 的整合在高質量 300 DPI 掃描上運作順利。 文件質量一降 —— 來自平板的歪斜頁面、低對比度的傳真件、收據的手機照片 —— 准確率缺口就會開啟。 README 自己的基準測試顯示,沒有預處理的情況下,手機相機捕捉下準確性下降到 30-50%。 在 ImageSharp 或 SkiaSharp 中構建和調整處理裝置以恢復該準確率需要開發時間 8-20 小時,並增加了額外依賴。 那些在初始整合六個月后發現他們的"高品質掃描"假設錯誤的團隊是典型的TesseractOCR轉移案例。 預處理間隙不是一次性解決的問題 —— 它會在新的文件型別或擷取方法進入管道時顯現。
PDF 文件是輸入工作流程的一部分
TesseractOCR 的 Docnet.Core +TesseractOCR組合對PDF OCR 起作用,但它需要大約 100 行程式碼來代替 3 行。更實際地說,它需要評估 Docnet 的許可 (MIT)、其跨平台行為、其對無效 PDF 的處理以及其與現有 tessdata 和預處理程式碼的交互。 構建文件管理系統、發票處理程式或任何PDF作為主要輸入的工作流程的團隊發現,隨著時間的推移,以外部庫處理PDF的方法會聚集阻力:頁面尺寸處理、渲染的DPI選擇、臨時文件清理邏輯以及缺乏可搜尋的 PDF 輸出。 需要從掃描輸入生成可搜尋PDF的團隊使用TesseractOCR沒有出路。
執行緒架構達到記憶體限制
TesseractOCR 中的四個並行OCR工作者在處理單個圖像之前消耗 200-400MB 的引擎記憶體。 這對於低吞吐量的背景作業不是問題。 這是一個 ASP.NET Core 端點處理多個同時文件上傳或批處理器推動吞吐量的問題。 每個執行緒的引擎模式也意味著每個新執行緒在處理其第一個文件之前都要付出約 500ms 的初始化成本。 選擇TesseractOCR作為背景服務並需要擴大吞吐量的團隊會遇到這個上限。 轉向一個支持執行緒安全的引擎完全消除每個執行緒的開銷。
初次開發後的部署環境變更
TesseractOCR 需要將 tessdata 文件與應用程式共同部署。 在開發者的本地環境中,這是可管理的。 在 Docker 容器中,這意味著要麼將 tessdata 文件烘焙到映像中(新增每種語言 15-50MB 到映像大小),要麼在已知路徑上安裝一個卷(增加運行的複雜性)。 在 CI/CD 管道中,這意味著腳本化和快取下載。 在 Azure App Service 或 AWS Lambda 中,tessdata 路徑配置是一個更多的環境特定設置,可能與開發不同。 從僅限本地的概念驗證出發的團隊,然後轉向容器化或雲部署,發現 tessdata 要求在每個環境中都行為不同。IronOCR的基於 NuGet 的語言包在套件恢復的任何地方部署相同。
社群支持達到分叉邊界
TesseractOCR 有大約 200K 次 NuGet 下載。 charlesw/tesseract 有大約 8M。 關於 Tesseract .NET 包裝的 Stack Overflow 問題、部落格文章和 GitHub 問題中,絕大多數參考了 charlesw 的 API — TesseractEngine,而不是 Engine; Pix.LoadFromFile,而不是 TesseractOCR.Pix.Image.LoadFromFile。 適用於 charlesw 的解決方案需要針對TesseractOCR的 API 差異進行適應。 對於主要支持模式是社群資源的團隊,這是一個真正的摩擦倍增器。
常見的遷移考量
命名空間和類替換
核心代替是 Engine 到 IronTesseract 和 TesseractOCR.Pix.Image.LoadFromFile() 到 OcrInput。 命名空間替換 (using TesseractOCR 到 using IronOcr) 捕獲了大多數引用。TesseractOCR使用 Language.English|Language.French (bitwise OR on a flags enum),IronOCRuses OcrLanguage.English + OcrLanguage.French (相加運算子)。 信心值尺度也不同:TesseractOCR 返回 page.MeanConfidence 作為 0.0-1.0 的浮點;IronOCR返回 result.Confidence 作為 0-100 的雙精度。 任何比較信心值的閾值邏輯都需要更新。
// Before (TesseractOCR)
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile("document.png");
using var page = engine.Process(image);
float confidence = page.MeanConfidence; // 0.0 to 1.0
// After (IronOCR)
var ocr = new IronTesseract();
using var input = new OcrInput("document.png");
var result = ocr.Read(input);
double confidence = result.Confidence; // 0 to 100
// Before (TesseractOCR)
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile("document.png");
using var page = engine.Process(image);
float confidence = page.MeanConfidence; // 0.0 to 1.0
// After (IronOCR)
var ocr = new IronTesseract();
using var input = new OcrInput("document.png");
var result = ocr.Read(input);
double confidence = result.Confidence; // 0 to 100
Imports TesseractOCR
Imports IronOcr
' Before (TesseractOCR)
Using engine As New Engine("./tessdata", Language.English, EngineMode.Default)
Using image As TesseractOCR.Pix.Image = TesseractOCR.Pix.Image.LoadFromFile("document.png")
Using page As Page = engine.Process(image)
Dim confidence As Single = page.MeanConfidence ' 0.0 to 1.0
End Using
End Using
End Using
' After (IronOCR)
Dim ocr As New IronTesseract()
Using input As New OcrInput("document.png")
Dim result As OcrResult = ocr.Read(input)
Dim confidence As Double = result.Confidence ' 0 to 100
End Using
移除預處理依賴項
如果現有TesseractOCR整合已經具有 ImageSharp 或 SkiaSharp 預處理管道,可以在遷移後刪除此程式碼。IronOCR的內建 Deskew()、DeNoise()、Contrast() 和 EnhanceResolution() 方法替換了外部過濾器鏈。 圍繞預處理圖像的臨時文件建立和清理程式碼也會消失 — OcrInput 直接接受文件路徑、字節陣列、流或 Bitmap,無需中間文件寫入。圖像過濾器範例涵蓋了可用過濾器及其等價物。
移除PDF外部程式庫
using Docnet.Core 或 PdfiumViewer 進行 PDF 渲染的團隊可以完全移除這些套件。 替換整個 PDF 渲染迴圈 — DocLib.Instance、GetDocReader、GetPageReader、GetImage、SaveBgraAsPng、臨時文件建立、Pix.Image.LoadFromFile、engine.Process — 與 input.LoadPdf(pdfPath)。 PDF 輸入指南 和 PDF OCR 使用案例頁面 涵蓋了完整的IronOCRPDF API。 從項目中刪除 tessdata 資料夾,移除 <CopyToOutputDirectory> 用於 tessdata 文件的建構配置,並更新 Docker 映像以移除任何 apt-get install tesseract-ocr 步驟。
錯誤處理範圍縮小
TesseractOCR 需要捕捉 TesseractOCR.Exceptions.TesseractException 來處理引擎初始化失敗、DllNotFoundException 處理丟失的原生程式庫,以及 BadImageFormatException 處理架構不匹配。IronOCR將其原生依賴打包並在內部管理初始化,因此這些異常型別不適用。 剩下的錯誤範圍是標準 IOException 處理文件存取問題和 IronOcr.Exceptions.OcrException 處理 OCR 特定故障。
其他IronOCR功能
超出此比較中覆蓋的範圍,IronOCR 包含在TesseractOCR中無等價的功能:
- 可搜尋的 PDF 輸出 —
result.SaveAsSearchablePdf()將掃描的文件轉換為內嵌可選文字的 PDF;TesseractOCR沒有生成任何一類 PDF 輸出 - 基於區域的 OCR —
input.LoadImage("invoice.jpg", new CropRectangle(0, 0, 600, 100))限制處理到特定區域; 這對於表格字段提取和結構化文件解析很有用 - 條形碼在OCR期間讀取 —
ocr.Configuration.ReadBarCodes = true在相同解析步驟中讀取嵌入文件中的條形碼和QR碼 - 結構化結果資料 —
result.Pages、result.Paragraphs、result.Lines和result.Words以每個單詞坐標資料顯露文件結構;TesseractOCR返回一個帶有單一信心值的平面文字字串 - hOCR 輸出 —
result.SaveAsHocrFile()為下游文件處理管道生成 hOCR 格式輸出 - 異步 OCR — 原生 async/await 支持,無需手動
Task.Run包裝器,即可嵌入在 ASP.NET Core - 每個單詞的信心分數 — 單詞級別的信心允許過濾不確定的提取;TesseractOCR只提供文件級別的平均信心
- 專門的文件閱讀 — 護照、MICR 支票和車牌識別,具有超出一般 OCR 的領域專家化最佳化
.NET 相容性和未來準備
TesseractOCR 針對 .NET 6.0、7.0 和 8.0,覆蓋了目前活動的LTS 和 STS 發行。IronOCR支持同樣現代的 .NET 版本,並向後相容到 .NET Framework 4.6.2+,供尚未完成框架遷移的團隊使用。 兩個程式庫都能在 Windows、Linux 和 macOS 上運行。IronOCR在其 NuGet 套件中針對所有受支持的平台提供平台特定最佳化,而無需平台特定配置;TesseractOCR為常見平台打包原生二進位,但需要額外的原生程式庫配置來支持不常見的 Linux 發行版和自製 Docker 基本映像。IronOCR發佈了適用於生產環境的Docker、Linux、Azure 和 AWS 部署指南,其中包含經過驗證的配置。
結論
TesseractOCR 佔據了一個真正的空缺:當您需要一個積極維護的現代框架 Tesseract 綁定,用於需要 Apache 2.0 許可、處理乾淨高質量圖像的項目,並且具有內影圖像處理專業知識來構建任何必要的預處理管道時,這才是正確的選擇。 Sicos1977 分支明顯比為新的 .NET 6+ 工作使用已歸檔的 charlesw 項目更好 — 新引擎、活躍的漏洞修復、真正的跨平台原生捆綁。 對於適合整潔輸入、僅開源的項目,這已經足夠。
此比較的論點是更具體的:更新包裝器無法修復 Tesseract 本身未提供的功能。tessdata 要求無變更。 非執行緒安全的引擎無變更。 缺乏預處理無變更。 缺乏原生 PDF 支持無變更。 選擇TesseractOCR用於其現代 .NET 目標的團隊仍需預算 26-56 小時用于初始設置、預處理實現和 PDF 整合 - 這與使用 charlesw 所需的預算相同。 現代分支降低了版本摩擦; 它不減少整合工作。
IronOCR 直接解決了所有四個缺口:語言作為 NuGet 套件安裝,IronTesseract 是執行緒安全的,預處理是自動的,PDF 是原生的。交易折衷是 $999 適用於 Lite 許可。 對於大多數生產應用,這種折衷很快就會被解決:以任何競爭價格的開發者時間在初次設置工作的一周內就會超過許可成本,尚未計算持續的維護。
對於任何評估TesseractOCR的團隊來說,開放的問題不是分支是否活躍和維護得很好 — 而是。 問題是根本的 Tesseract 架構是否符合生產要求。 如果答案涉及變質文件、PDF輸入、可擴展的吞吐量或 tessdata 管理存在摩擦的部署模型,IronOCR 的方法能在支付一次性授權費的代價下消除這些問題。
常見問題
什麼是 TesseractOCR.Net?
TesseractOCR.Net 是一種由開發者和企業用來從影像和文件中提取文字的 OCR 解決方案。這是與 IronOCR 一起評估的幾個 OCR 選項之一,用於 .NET 應用程式開發。
IronOCR 與 TesseractOCR.Net 對於 .NET 開發者的比較如何?
IronOCR 是一個 NuGet 原生的 .NET OCR 程式庫,使用 IronTesseract 作為其核心引擎。與 TesseractOCR.Net 相比,它提供更簡單的部署(無 SDK 安裝程式)、固定價格以及不需要 COM互操作或雲端依賴的清晰 C# API。
IronOCR 是否比 TesseractOCR.Net 更容易設置?
IronOCR 通過一個單一的 NuGet 套件安裝。無需 SDK 安裝程式、複製授權文件、註冊 COM 元件或管理單獨的運行時二進位檔案。整個 OCR 引擎都打包在套件中。
TesseractOCR.Net 和 IronOCR 之間存在哪些準確性差異?
IronOCR 在標準商業文件、發票、收據和掃描表單上達到了高識別準確度。對於極度退化的文件或罕見文字,準確度會根據來源品質變化。IronOCR 包含影像預處理篩選器,以改善低品質輸入的識別。
IronOCR 支援 PDF 文字提取嗎?
是的。IronOCR 能從原生 PDF 和掃描的 PDF 圖像中一次性提取文字。它還支持多頁 TIFF 檔案、影像和流。對於掃描的 PDF,OCR 會逐頁應用並生成每頁的結果物件。
TesseractOCR.Net 和 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 和容器化部署,而 TesseractOCR.Net 則不適合?
是的。IronOCR 通過其 NuGet 載於 Docker 容器中運行。授權金鑰通過環境變數設置。無需授權文件、SDK 路徑或量掛載來執行 OCR 引擎。
與 TesseractOCR.Net 相比,我可以在購買前試用 IronOCR 嗎?
是的。IronOCR 試用模式中處理文件並在輸出上附上浮水印結果。您可以在購買授權前驗證自己文件的準確性。
IronOCR 支援條碼閱讀與文字提取嗎?
IronOCR 專注於文字提取和 OCR。對於條碼閱讀,Iron Software 提供了額外的 IronBarcode 程式庫。兩者均可個別使用或作為 Iron Suite 套件的一部分。
從 TesseractOCR.Net 遷移到 IronOCR 容易嗎?
從 TesseractOCR.Net 遷移到 IronOCR 通常包括用 IronTesseract 初始化替代初始化序列、移除 COM 生命週期管理並更新 API 呼叫。大多數遷移顯著減少了程式碼的複雜性。

