從XImage.OCR遷移至IronOCR
本指南適用於將現有XImage.OCR整合移動到IronOCR的.NET開發人員。 它涵蓋了封包合併過程、命名空間和API的變更,以及在XImage.OCR的分散架構造成最大摩擦的情境下的具體程式碼遷移範例。 不需要閱讀比較文章。
為什麼要從XImage.OCR遷移
XImage.OCR是RasterEdge提供的商業Tesseract包裝器,透過一連串協調的NuGet封包分發其功能。 該架構在小規模時有效,但隨著應用程式的增長會造成複合維護成本。
每個語言增加一個封包。 新增一個語言就意味著新增一個NuGet封包。 一個五語言的應用程式在其.csproj中帶有六個封包。 一個十語言的應用程式帶有十一個。 每個封包都必須固定在與核心相同的版本上——這是一個在開發人員只更新了部分鏈時會產生靜默運行時錯誤的限制。 IronOCR提供一個封包給所有125+種語言。
版本同步是一個持續的風險。 dotnet outdated貪心更新封包。 當XImage.OCR.Language.French停留在12.4.0時,錯誤出現於運行時,而不是構建時,且訊息很少指向版本同步為原因。 執行CI/CD管道的團隊學會為每個XImage.OCR封包新增顯式版本固定——這種開銷除了補償分解模型外毫無用途。
沒有內建的預處理會限制真實文件的準確性。 XImage.OCR將圖片直接傳遞給底層Tesseract引擎。用150 DPI加上兩度傾斜的掃描直接進入Tesseract。 在此類輸入上的準確性上限為60–75%,無論使用哪個Tesseract包裝器。 IronOCR附帶一個預處理管道——Sharpen()——在識別運行之前解決這些問題。
結構化輸出需要手動解析。 XImage.OCR返回一個純字串。 提取單詞位置、行邊界或每個單詞信心需要自行解析該字串。 IronOCR返回一個Words,以及每字元的像素座標和置信度得分。
輸出格式僅止於純文字。 從XImage.OCR結果產生可搜尋PDF需要RasterEdge PDF SDK——第二個商業購買。 IronOCR通過result.SaveAsSearchablePdf()產生可搜尋PDF,無需額外的依賴項。
不支持跨平台部署。 XImage.OCR針對Windows。 Linux容器、macOS開發環境和基於Azure或AWS的雲端原生部署需要不同的程式庫。 IronOCR在同一封包中運行於Windows、Linux、macOS、Docker、Azure App Service和AWS Lambda。
根本問題
XImage.OCR每種語言需要一個NuGet封包。 十種語言意味著十一個封包,全部版本相互鎖定:
<!-- XImage.OCR: 11 packages to support 10 languages — every version must match -->
<PackageReference Include="RasterEdge.XImage.OCR" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.English" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.German" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.French" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Spanish" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Italian" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Portuguese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.ChineseSimplified" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Japanese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Korean" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Arabic" Version="12.4.0" />
IronOCR用一行代替整個區塊:
<!-- IronOCR: One package. 125+ languages.不是version coordination. -->
<PackageReference Include="IronOcr" Version="2024.x.x" />
IronOCR與XImage.OCR:功能比較
下表涵蓋了對遷移決策最相關的功能。
| 功能 | XImage.OCR | IronOCR |
|---|---|---|
| 僅英文的NuGet封包 | 2(核心+語言包) | 1 |
| 10語言的NuGet封包 | 11 | 1 |
| 需要版本同步 | 是——所有封包必須匹配 | 不是 |
| 可用語言 | ~15作為獨立封包 | 125+捆綁 |
| 內嵌預處理 | None | Deskew、去噪、對比度、二值化、銳化、縮放、膨脹、侵蝕、反轉 |
| 深度降噪 | None | 是(DeepCleanBackgroundNoise()) |
| 本地PDF輸入 | 需要RasterEdge PDF SDK | 是(input.LoadPdf()) |
| 可搜尋的PDF輸出 | 需要RasterEdge PDF SDK | 是(result.SaveAsSearchablePdf()) |
| 多頁 TIFF 輸入 | 有限 | 是(input.LoadImageFrames()) |
| 位元組陣列輸入 | 通過MemoryStream手動 | 是(input.LoadImage(bytes)) |
| 流輸入 | 手動 | 是(input.LoadImage(stream)) |
| 結構化輸出 | 純字串 | 頁、段落、行、詞、字元及坐標 |
| 每單字信心水準 | 不可用 | 是 |
| 條碼識別 | 不可用 | 是(ocr.Configuration.ReadBarCodes = true) |
| hOCR 輸出 | 不可用 | 是 |
| 執行緒安全 | 非執行緒安全 | 完整執行緒安全 |
| 記憶體模型(平行) | 每個執行緒一個處理器實例 | 單一共享實例 |
| 跨平台 | 主要定位於Windows | Windows、Linux、macOS、Docker、Azure、AWS |
| .NET相容性 | .NET Standard 2.0, .NET Framework 4.5+ | .NET Framework 4.6.2+, .NET Core, .NET 5/6/7/8/9 |
| 許可型別 | 商業(RasterEdge) | 永久(Lite $999,Pro $1,499,Enterprise $2,999) |
| 商業支持 | RasterEdge支持 | 是,按許可分級 |
快速入門:XImage.OCR到IronOCR遷移
步驟1:替換NuGet包
移除所有XImage.OCR封包。 命令數量與您安裝的語言包數量相同:
dotnet remove package RasterEdge.XImage.OCR
dotnet remove package XImage.OCR.Language.English
dotnet remove package XImage.OCR.Language.German
dotnet remove package XImage.OCR.Language.French
# Repeat for every language pack in your project
從NuGet安裝IronOCR:
步驟2:更新命名空間
將RasterEdge命名空間導入替換為IronOCR單一命名空間:
// Before (XImage.OCR)
using RasterEdge.XImage.OCR;
using RasterEdge.Imaging.Basic;
// After (IronOCR)
using IronOcr;
步驟3:初始化許可證
在應用程式啟動時,首次進行任何OCR調用之前進行許可初始化:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"將密鑰儲存在環境變數或秘密管理器中,而不是硬編碼它:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY");Imports System
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY")程式碼遷移範例
多封包初始化合併
第一個遷移任務是將XImage.OCR初始化區塊——許可激活、處理器建立和基於字串的語言分配——合併到IronOCR等價形式中。
XImage.OCR方法:
// Requires: RasterEdge.XImage.OCR + one XImage.OCR.Language.* package per language
// Language strings must exactly match installed package names or OCR fails at runtime
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-ximage-license-key");
var ocrHandler = new OCRHandler();
// String codes — typo "enh" instead of "eng" silently fails or throws at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra", "spa", "ita" };
// Process returns a plain string — no structure, no confidence
string extractedText = ocrHandler.Process("document.png");
Console.WriteLine(extractedText);
IronOCR方法:
// Requires: IronOcr (single package — all languages included)
IronOcr.License.LicenseKey = "YOUR-IRONOCR-LICENSE-KEY";
var ocr = new IronTesseract();
// Type-safe enum — compiler catches typos, no runtime surprises
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
在XImage.OCR中的基於字串的語言程式碼("deu")在相應NuGet封包不存在或版本不正確時運行失敗。 IronOCR中的OcrLanguage枚舉使無效語言組合無法編譯。 IronTesseract安裝指南全面涵蓋引擎配置選項,多語言使用指南記錄了主要和次要語言組合如何在混合語言文件中工作。
圖片格式處理統一
XImage.OCR根據格式不同地處理每一個圖片來源。 位元組陣列、流及文件路徑各需稍有不同的程式碼路徑。 IronOCR通過相同的OcrInput方法接受所有這些。
XImage.OCR方法:
// XImage.OCR: different handling per image source type
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// File path — works directly
string resultFromFile = ocrHandler.Process("invoice.jpg");
// Byte array — must write to temp file first, then process
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
string tempPath = Path.GetTempFileName() + ".jpg";
File.WriteAllBytes(tempPath, imageBytes);
try
{
string resultFromBytes = ocrHandler.Process(tempPath);
Console.WriteLine(resultFromBytes);
}
finally
{
File.Delete(tempPath); //手動cleanup — easy to forget
}
// Multi-page TIFF — must split frames manually
//不是built-in TIFF frame iteration in base XImage.OCR
IronOCR方法:
// IronOCR: unified OcrInput accepts all source types identically
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
// File path
using (var input = new OcrInput())
{
input.LoadImage("invoice.jpg");
var result = ocr.Read(input);
Console.WriteLine($"From file: {result.Text}");
}
// Byte array — no temp file needed
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
using (var input = new OcrInput())
{
input.LoadImage(imageBytes);
var result = ocr.Read(input);
Console.WriteLine($"From bytes: {result.Text}");
}
// Multi-page TIFF — all frames processed in one call
using (var input = new OcrInput())
{
input.LoadImageFrames("scanned-archive.tiff");
var result = ocr.Read(input);
Console.WriteLine($"TIFF pages: {result.Pages.Count}");
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}
XImage.OCR中位元組陣列的臨時文件模式是磁碟膨脹和錯誤路徑中洩露文件的常見來源。 IronOCR的LoadImage(byte[])徹底消除了中間文件。 圖片輸入指南和TIFF/GIF輸入指南涵蓋了每一個支持的來源型別,包括流和多幀處理。
輸出格式精簡
XImage.OCR返回一個簡單字串。 生成一個可搜尋的PDF需要第二個RasterEdge產品。 IronOCR從同一結果物件中產生純文字、可搜尋的PDF和結構化資料,無需額外封包。
XImage.OCR方法:
// XImage.OCR: plain text output only
// Searchable PDF requires purchasing the RasterEdge PDF SDK separately
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
string plainText = ocrHandler.Process("scanned-contract.jpg");
// To produce a searchable PDF from this text, you would need:
// 1. Purchase RasterEdge PDF SDK (separate commercial license)
// 2. Create a PDF document programmatically
// 3. Embed the extracted text as invisible text layer over the image
// 4. Manage the PDF document lifecycle manually
//不是built-in path from OCR result to searchable PDF in XImage.OCR alone
Console.WriteLine(plainText);
IronOCR方法:
// IronOCR: plain text, searchable PDF, and structured data from one result
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("scanned-contract.jpg");
var result = ocr.Read(input);
// Plain text
Console.WriteLine(result.Text);
// Searchable PDF — no extra package required
result.SaveAsSearchablePdf("searchable-contract.pdf");
// Structured data: paragraphs with bounding box coordinates
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}
// Per-word confidence for quality gating
var lowConfidenceWords = result.Pages
.SelectMany(p => p.Words)
.Where(w => w.Confidence < 70)
.ToList();
Console.WriteLine($"Words below 70% confidence: {lowConfidenceWords.Count}");
呼叫SaveAsSearchablePdf()將識別的文字嵌入原始圖片下方作為隱藏層,使文件完全可以進行文字搜索而不改變其視覺外觀。 可搜尋PDF指南描述了頁面範圍選項和DPI設定。 結構化資料提取模式,請參見讀取結果指南,其中記錄了完整的OcrResult層次結構,包括單詞坐標和置信度存取。 可搜尋PDF範例提供了一個完整的工作實施方案。
批量文件處理
XImage.OCR不是執行緒安全的。 每個並行工作執行緒必須建立其自己的OCRHandler實例,從而將記憶體消耗乘以執行緒數量。 IronOCR在所有執行緒中使用單一共享實例。
XImage.OCR方法:
// XImage.OCR: one handler per thread — memory multiplies with concurrency
// 4 threads processing English documents: 4 x ~100MB = ~400MB for OCR alone
// 4 threads processing 5 languages: 4 x ~250MB = ~1GB just for OCR handlers
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
documentPath =>
{
// Each thread must create and dispose its own handler
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
try
{
string text = ocrHandler.Process(documentPath);
results[documentPath] = text;
}
finally
{
//手動disposal required — no using statement support shown
ocrHandler.Dispose();
}
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
IronOCR方法:
// IronOCR: single IronTesseract instance shared across all threads
// Memory stays flat regardless of thread count
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract(); // Create once outside the parallel loop
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths, documentPath =>
{
// OcrInput is created per thread — IronTesseract instance is shared
using var input = new OcrInput();
input.LoadImage(documentPath);
input.Deskew(); // Preprocessing runs per-document, not per-thread engine
input.DeNoise();
var result = ocr.Read(input);
results[documentPath] = result.Text;
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
XImage.OCR的每執行緒處理器模式意味著四執行緒批量作業載入五種語言,約載有1GB的OCR處理器記憶體,而未處理單個文件。 IronOCR的共享實例使記憶體限制在單一實例足跡上,無論是平行運行。 多執行緒範例完整展示了這一模式,速度優化指南則涵蓋了針對吞吐量集中的批量工作負載的配置調整。
條碼和文字結合提取
XImage.OCR無條碼讀取能力。 包含文字和條碼的文件需要兩個單獨的庫和兩種獨立的處理流程。 IronOCR一次讀取操作即可提取兩者。
XImage.OCR方法:
// XImage.OCR: text only — barcodes require a separate library and second pass
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// Pass 1: text extraction with XImage.OCR
string documentText = ocrHandler.Process("warehouse-label.png");
Console.WriteLine($"Text: {documentText}");
// Pass 2: barcode reading requires a completely separate library
// e.g., ZXing.Net, Dynamsoft Barcode Reader, or another commercial SDK
// - Additional NuGet package required
// - Additional license required
// - Additional code for result merging
//不是combined text + barcode result object exists in XImage.OCR
IronOCR方法:
// IronOCR: text and barcodes from a single Read() call
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true; // Enable barcode extraction
using var input = new OcrInput();
input.LoadImage("warehouse-label.png");
var result = ocr.Read(input);
// Text and barcodes in one result object
Console.WriteLine($"Document text:\n{result.Text}");
if (result.Barcodes.Any())
{
Console.WriteLine($"\nBarcodes found: {result.Barcodes.Count}");
foreach (var barcode in result.Barcodes)
Console.WriteLine($" [{barcode.BarcodeType}] {barcode.Value}");
}
設定ReadBarCodes = true將條碼檢測新增到識別進程中,無需第二個庫或第二次讀取。 條碼閱讀指南和條碼OCR範例涵蓋了支持的條碼格式及混合內容文件的配置選項。
XImage.OCR API到IronOCR的對應參考
| XImage.OCR | IronOCR 等效 |
|---|---|
new OCRHandler() | new IronTesseract() |
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("key") | IronOcr.License.LicenseKey = "key" |
ocrHandler.Language = "eng" | ocr.Language = OcrLanguage.English |
ocrHandler.Languages = new[] { "eng", "deu" } | ocr.Language = OcrLanguage.English + OcrLanguage.German |
ocrHandler.Process(imagePath) | input.LoadImage(path)之後) |
ocrHandler.Process(image)(從物件) | input.LoadImage(stream) |
ocrHandler.ProcessRegion(path, rect) | input.LoadImage(path, new CropRectangle(x, y, w, h)) |
ocrHandler.SetVariable("tessedit_char_whitelist", "0-9") | ocr.Configuration.WhiteListCharacters = "0123456789" |
result(純字串) | result.Text |
result.MeanConfidence | result.Confidence |
| 無相應物件 | result.Pages / result.Paragraphs / result.Lines |
| 無相應物件 | .Confidence一起) |
| 無相應物件 | result.SaveAsSearchablePdf("output.pdf") |
| 無相應物件 | input.Deskew() |
| 無相應物件 | input.DeNoise() |
| 無相應物件 | input.Contrast() |
| 無相應物件 | input.Binarize() |
| 無相應物件 | input.Sharpen() |
| 無相應物件 | input.LoadImageFrames("file.tiff")(多幀) |
| 需要RasterEdge PDF SDK | input.LoadPdf(pdfPath) |
| 需要RasterEdge PDF SDK | result.SaveAsSearchablePdf("output.pdf") |
| 不可用 | ocr.Configuration.ReadBarCodes = true |
每執行緒OCRHandler實例 | 單一共享IronTesseract實例 |
常見的遷移問題与解決方案
問題1:部分封包更新後的運行時失敗
XImage.OCR: 運行RasterEdge.XImage.OCR推進到新版本,而語言包仍停留於先前版本。 錯誤在首次OCR調用時發生,錯誤消息未清楚識別版本不匹配為根本原因。 找到差異需要手動檢查所有PackageReference條目。
解決方案: 移除XImage.OCR封包並安裝IronOCR後,無需維持版本同步。 單一IronOcr封包涵蓋一切。 如果您需要捆綁預設值之外的語言包,請獨立安裝IronOcr.Languages.*封包——它們不需要與核心匹配版本:
問題2:字串語言程式碼導致靜默OCR失敗
XImage.OCR: 語言程式碼為字串("fra")。 語言程式碼中的錯誤——"deu"——要麼靜默回退至預設語言,要麼扔出運行時例外,這取決於XImage.OCR版本。 無論是哪種結果,編譯時不會檢測到。
解決方案: IronOCR使用OcrLanguage枚舉。 無效值為編譯錯誤,而非運行時意外。 將字串陣列遷移至枚舉表達式:
// Before (XImage.OCR) — typos compile fine, fail at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra" };
// After (IronOCR) — typos are compile errors
ocr.Language = OcrLanguage.English + OcrLanguage.German + OcrLanguage.French;
參見多語言指南,了解如何在包含混合語言內容的文件中結合主、次要語言。
問題3:位元組陣列處理留下的磁碟上的臨時文件
XImage.OCR: 對位元組陣列圖片進行處理需要寫入臨時文件,因為OCRHandler.Process()接受文件路徑而非緩衝區。 跳過finally區塊的例外途徑會在磁碟上留下那些臨時文件。 在高吞吐量應用程式中,這種情況會迅速累積。
解決方案: byte[]。 不會建立臨時文件:
// Before (XImage.OCR) — temp file required
string tempPath = Path.GetTempFileName() + ".png";
File.WriteAllBytes(tempPath, imageBytes);
try { text = ocrHandler.Process(tempPath); }
finally { File.Delete(tempPath); }
// After (IronOCR) — direct byte array loading, no disk I/O
using var input = new OcrInput();
input.LoadImage(imageBytes);
var result = ocr.Read(input);
string text = result.Text;
問題4:平行負載下的記憶體耗盡
XImage.OCR: 平行處理需要每個執行緒一個OCRHandler。 八個執行緒處理五種語言的文件會載入八個獨立的引擎實例,每個帶有所有五語言包。 大約每實例每語言50MB,八個執行緒大約消耗了2GB的OCR引擎記憶體,僅計算文件資料進入之前。
解決方案: 單一IronTesseract實例處理所有執行緒。 為每個文件建立IronTesseract:
// Single instance — shared safely across all threads
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
Parallel.ForEach(documentPaths, path =>
{
using var input = new OcrInput(); // Per-document, lightweight
input.LoadImage(path);
var result = ocr.Read(input); // Thread-safe call on shared instance
ProcessResult(result.Text);
});
問題5:部分恢復後的CI/CD管道中斷
XImage.OCR: 備有封包快取的CI/CD代理通常會使某些XImage.OCR語言包快取於舊版本。 當專案文件中僅核心封包更新時,恢復成功,但運行時載入不匹配的程式集。 構建通過; 部署失敗。
解決方案: 遷移到IronOCR後,CI/CD管道恢復一個封包。 新增驗證步驟以確認存在期望版本:
# In your CI pipeline — verify single package restore
dotnet restore
dotnet list package | grep IronOcr
#不是version coordination logic needed — only one package to check
問題6:缺少下游解析的結構化資料
XImage.OCR: 返回一個簡單字串。 需要單詞位置、行分組或每個單詞信心的應用程式必須使用空白啓發式或自訂邏輯解析該字串。 在包含多列佈局、表格或旋轉文字的文件上,此解析的準確性會降低。
解決方案: IronOCR的OcrResult直接公開完整文件層次結構。 不需要字串解析:
var result = ocr.Read(input);
// Direct access to structured data — no string manipulation
foreach (var page in result.Pages)
{
foreach (var line in page.Lines)
{
// Line text, bounding box, and per-word data all available
Console.WriteLine($"Line [{line.X},{line.Y}]: {line.Text}");
foreach (var word in line.Words)
Console.WriteLine($" Word '{word.Text}' confidence: {word.Confidence}%");
}
}
有關完整結構化資料API,請參見讀取結果操作指南和OCR結果功能頁面。
XImage.OCR遷移檢查清單
遷移前
在進行更改之前,審核程式碼庫以查找所有XImage.OCR接觸點:
# Find all XImage.OCR namespace imports
grep -r "RasterEdge.XImage.OCR\|Yiigo.Image.Ocr\|XImage.OCR" --include="*.cs" .
# Find all OCRHandler usages
grep -r "OCRHandler\|ocrHandler" --include="*.cs" .
# Find all string-based language assignments
grep -r "\.Language\s*=\s*\"" --include="*.cs" .
grep -r "\.Languages\s*=\s*new\[\]" --include="*.cs" .
# Find all XImage.OCR package references in project files
grep -r "RasterEdge.XImage.OCR\|XImage.OCR.Language" --include="*.csproj" .
# Count distinct language packs installed
grep "XImage.OCR.Language" --include="*.csproj" -r . | wc -l
注意使用中哪種圖片源型別(文件路徑、位元組陣列、流、TIFF),並識別任何使用臨時文件進行位元組陣列處理的位置。 這些是高優先順序的清理目標。
程式碼遷移
- 從每個
.csproj包引用 - 新增
dotnet add package IronOcr) - 在所有文件中將
using IronOcr - 在應用程式啟動時新增
IronOcr.License.LicenseKey = ...(每個過程一次) - 將
new IronTesseract() - 用
"deu") - 將
input.LoadImage(path)+ocr.Read(input).Text - 用
input.LoadImage(byte[])替換位元組-陣列到臨時文件模式 - 用
input.LoadImageFrames("file.tiff")替換多頁面TIFF手動幀分割 - 從
IronTesseract實例 - 在每個
input.DeNoise()),針對來自可變質量來源的文件。 - 用
result.SaveAsSearchablePdf()用於PDF輸出 - 用
ocrHandler.SetVariable("tessedit_char_whitelist", ...) - 更新CI/CD管線:移除多包恢復步驟,移除版本同步邏輯,驗證單一
IronOcr包恢復
遷移後
- 確認基本文字提取從已知良好的測試圖片中生成正確輸出
- 驗證多語言文件返回所有配置語言的文字
- 測試位元組陣列輸入路徑產生正確輸出,磁碟上未建立臨時文件
- 確認多頁TIFF文件在
result.Pages中返回正確的頁面數 - 在負載下運行平行批量處理,並測量峰值記憶體——應顯著低於XImage.OCR基準。
- 驗證可搜索PDF輸出能正常打開於Adobe Acrobat或PDF查看器中,並且文字是可選擇的。
- 測試在低質量或歪斜掃描上進行預處理,並將提取文字準確性與XImage.OCR基準進行比較。
- 確認許可金鑰初始化在首次OCR調用之前執行,且不拋出
- 驗證CI/CD恢復在無快取封包的乾淨環境下成功。
- 檢查結構化資料輸出(
result.Paragraphs)是否與預期文件佈局匹配。
遷移至IronOCR的主要好處
單一包取代整個依賴圖。 每個dotnet add package IronOcr命令中。 .csproj條目計數從十一降到一。 CI/CD恢復步驟從具有十一個獨立故障點的多包操作變為單一包恢復。 這種簡化合計:需要審核的安全漏洞包較少,當.NET相容性變更時需要更新的條目更少,且無需在自動化更新管道中維持版本協調邏輯。 IronOCR產品頁面和文件中樞提供了完整的功能和部署參考。
預處理準確性增強是立即的。 遷移不是完全相同的替代——它是準確性升級。 任何因斜度、噪音或低解析度而導致XImage.OCR處理的文件準確性降低的情況,如今都通過input.Contrast()有直接的改善途徑。 無需外部圖片處理庫,開發團隊無需圖片處理專業知識,無需單獨許可和維護的依賴項。 在LoadImage()之後新增三行,恢復20–35個百分點的準確率在以前被接受為"足夠好"的掃描文件上。圖片品質更正指南和預處理功能頁面涵蓋了每個濾鏡在不同文件品質場景中的效果。
可搜尋PDF和結構化資料消除第二SDK成本。 XImage.OCR使用者最常見的兩個請求——可搜尋PDF輸出和單詞級別的資料坐標——都需要額外的RasterEdge產品,使其承擔更多的商業許可。 遷移後,result.Words提供帶有邊界框和置信度分數的結構化資料。 需要兩個許可的功能現在由一個提供。 完整輸出格式文件在OCR結果功能頁面上。
平行處理擴展而無記憶體懲罰。 XImage.OCR的每執行緒處理器模式使擴展代價高昂。加倍執行緒數會使OCR引擎實例消耗的記憶體加倍。 IronOCR的共享實例模式意味著記憶體始終保持在單一實例足跡,不受平行運行限制。 在八個並行執行緒上處理文件批次的伺服器消耗的OCR引擎記憶體與一次處理一個文件的伺服器相同。 這直接轉換為更低的託管成本和在固定基礎設施上更高的吞吐量餘地。
跨平台部署無需程式碼變更即可開放。 同樣的IronOcr封包和相同的應用程式程式碼運行於Windows、Linux、macOS、Docker、Azure App Service及AWS Lambda。 無平台條件程式碼,無平台特定封包變體,無需對OCR層進行每個環境部署測試。 容器化工作負載、運行macOS開發環境或部署至基於Linux的雲基礎架構的團隊獲得即時相容。 Docker部署指南、Azure部署指南和Linux部署指南專門記錄了每一個目標環境的設置。
超過125種語言移除語言覆蓋頂峰。 XImage.OCR最多支持大約15種作為商業封包提供的語言。 標準tessdata分佈中免費提供超過100種語言。IronOCR整合了125多種語言,並經由干凈的安裝模式公開,無版本鎖限制的IronOcr.Languages.*封包。 EU 24種官方語言、所有主要的CJK語言、阿拉伯語、希伯來語及所有專用字母均可使用。 語言索引列出了每一種支持的語言及其相應的封包名稱。
