IronOCR 和 Asprise OCR 之間的比較
Tesseract OCR 需要將 PDF 頁面轉換為圖像後才能提取文字,而 IronOCR 能夠在 .NET 中原生讀取 PDF 文件。 對於處理大規模掃描文件的 C# 應用程式來說,這一架構差異決定了設置的複雜性、程式碼量以及生產可靠性。
從掃描的 PDF 文件中提取文字是 C# 和 .NET 10 應用程式中的常見要求。 無論是處理發票、數位化紙質記錄,還是自動化資料輸入工作流程,開發者都需要可靠的OCR 解決方案,能夠高效地將 PDF 文件轉換為可編輯、可搜尋的資料。 Tesseract OCR 是由 Google 維護的廣泛使用的開源光學字元識別引擎,但 .NET 開發者在將其應用於 PDF 內容時經常遇到阻礙。
本文比較了如何在 C# 中使用 Tesseract 和 IronOCR 進行PDF 到文字轉換,提供程式碼範例和選擇合適程式庫的實用指導,適用於生產系統。
Tesseract 與 IronOCR 的快速決策是什麼?
選擇 Tesseract 當預算限制需要免費解決方案、您的輸入僅是圖像文件,而且您的團隊有能力進行額外的設置和依賴工作時。
選擇 IronOCR 當 PDF 文件和掃描文件是您的主要輸入、開發速度關鍵,或您需要跨平台部署到 Azure、Docker 或 Linux 而不需處理依賴問題時。
| 標準 | Tesseract | IronOCR |
|---|---|---|
| 費用 | 免費(Apache 2.0) | 需要商業授權 |
| PDF 輸入 | 需要圖像轉換 | 原生支持 |
| 設置複雜性 | 高(多個依賴項) | 單一NuGet包 |
| 跨平台 | 需要配置 | Windows,macOS,Linux |
| 圖像預處理 | 手動 | 內建過濾器 |
| 生產支援 | 僅限社區 | 商業支持 |
這些 OCR 解決方案在功能上的比較如何?
在探索實施細節之前,這裡是掃描 PDF 文件文字識別的關鍵能力對比:
| 功能 | Tesseract | IronOCR |
|---|---|---|
| 原生 PDF 輸入 | 否(需要圖像轉換) | Yes |
| 安裝 | 多個依賴項 | Single NuGet package |
| 受密碼保護的 PDFs | 不支持 | 支持 |
| 圖像預處理 | 手動(外部工具) | 內建過濾器 |
| 語言支持 | 100 多種語言 | 127+ languages |
| 授權 | Apache 2.0(免費) | 商業 |
| .NET 整合 | 通過包裝程式庫 | 原生 C# 程式庫 |
| 圖像格式 | PNG,JPEG,TIFF,BMP | PNG, JPEG, TIFF, BMP, GIF, PDF |
| 輸出選項 | 純文字,hOCR,HTML | 純文字,可搜尋 PDF,hOCR |
IronOCR 提供更完整的 PDF 處理功能,特別是對於企業文件管理需要可搜尋 PDF 生成和條碼識別來說。
Tesseract 如何處理 PDF 文件和提取文字?
Tesseract OCR 引擎不原生支持 PDF 文件的輸入。 根據Tesseract 官方文件,開發者必須將 PDF 頁面轉換為 PNG 或 JPEG 圖像才能執行 OCR。 這個過程需要額外的程式庫,如 Ghostscript 或專用的 PDF 渲染程式庫來轉換每一頁,增加了生產管道的複雜性和故障點。
這是一個簡化的 Tesseract 標準流程在 C# 中提取 PDF 文字的範例:
using Tesseract;
// Step 1: Convert PDF page to PNG (requires a separate PDF rendering library)
// This example assumes the scanned PDF has already been converted to an image
string imagePath = "document-scan.png";
// Step 2: Initialize Tesseract with the language data path
using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
// Step 3: Load the image and run OCR
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
// Step 4: Extract recognized text
string extractedText = page.GetText();
Console.WriteLine($"Confidence: {page.GetMeanConfidence()}");
Console.WriteLine(extractedText);
// Optional: retrieve word-level bounding boxes
using var iter = page.GetIterator();
iter.Begin();
do
{
if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
{
string word = iter.GetText(PageIteratorLevel.Word);
Console.WriteLine($"Word: {word} at {bounds}");
}
} while (iter.Next(PageIteratorLevel.Word));
using Tesseract;
// Step 1: Convert PDF page to PNG (requires a separate PDF rendering library)
// This example assumes the scanned PDF has already been converted to an image
string imagePath = "document-scan.png";
// Step 2: Initialize Tesseract with the language data path
using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
// Step 3: Load the image and run OCR
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
// Step 4: Extract recognized text
string extractedText = page.GetText();
Console.WriteLine($"Confidence: {page.GetMeanConfidence()}");
Console.WriteLine(extractedText);
// Optional: retrieve word-level bounding boxes
using var iter = page.GetIterator();
iter.Begin();
do
{
if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
{
string word = iter.GetText(PageIteratorLevel.Word);
Console.WriteLine($"Word: {word} at {bounds}");
}
} while (iter.Next(PageIteratorLevel.Word));
Imports Tesseract
' Step 1: Convert PDF page to PNG (requires a separate PDF rendering library)
' This example assumes the scanned PDF has already been converted to an image
Dim imagePath As String = "document-scan.png"
' Step 2: Initialize Tesseract with the language data path
Using engine As New TesseractEngine("./tessdata", "eng", EngineMode.Default)
' Step 3: Load the image and run OCR
Using img As Pix = Pix.LoadFromFile(imagePath)
Using page As Page = engine.Process(img)
' Step 4: Extract recognized text
Dim extractedText As String = page.GetText()
Console.WriteLine($"Confidence: {page.GetMeanConfidence()}")
Console.WriteLine(extractedText)
' Optional: retrieve word-level bounding boxes
Using iter As ResultIterator = page.GetIterator()
iter.Begin()
Do
Dim bounds As Rect
If iter.TryGetBoundingBox(PageIteratorLevel.Word, bounds) Then
Dim word As String = iter.GetText(PageIteratorLevel.Word)
Console.WriteLine($"Word: {word} at {bounds}")
End If
Loop While iter.Next(PageIteratorLevel.Word)
End Using
End Using
End Using
End Using
此程式碼展示了在 NuGet 上使用 .NET 包裝器的 Tesseract 標準方法。 engine 初始化需要指向tessdata 資料夾的路徑,該資料夾包含語言資料文件,這些文件必須從tessdata 資源庫下載。 img 變數以 Leptonica 的 PIX 格式載入輸入圖像,這是一個非託管 C++ 物件,需要顯式銷毀以防止記憶體洩漏。 page 結果執行實際的字元識別操作。
為什麼 Tesseract 首先需要圖像轉換?

Tesseract 的架構專注於圖像處理而非文件處理。 這種設計意味著開發者必須自行管理 PDF 到圖像轉換的管道,這樣在處理受密碼保護的 PDFs、多頁文件或混合內容的 PDFs(結合文字層和光柵化掃描)時會引入額外的複雜性。 轉換質量直接影響 OCR 準確性,適當的 DPI 設置和預處理對於達到可接受的結果至關重要。
如何用 Tesseract 處理多個 PDF 頁面?
對於生產環境來說,處理多頁文件需要編排邏輯來將每個 PDF 頁面轉換為圖像,單獨處理並聚合所有頁面的結果:
using Tesseract;
using System.Text;
// Processing multiple PDF pages after prior PDF-to-image conversion
static string ProcessMultiPagePdf(string[] imagePaths)
{
var results = new StringBuilder();
using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
foreach (var imagePath in imagePaths)
{
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
results.AppendLine($"Page confidence: {page.GetMeanConfidence():F2}");
results.AppendLine(page.GetText());
results.AppendLine("---");
}
return results.ToString();
}
using Tesseract;
using System.Text;
// Processing multiple PDF pages after prior PDF-to-image conversion
static string ProcessMultiPagePdf(string[] imagePaths)
{
var results = new StringBuilder();
using var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default);
foreach (var imagePath in imagePaths)
{
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
results.AppendLine($"Page confidence: {page.GetMeanConfidence():F2}");
results.AppendLine(page.GetText());
results.AppendLine("---");
}
return results.ToString();
}
Imports Tesseract
Imports System.Text
' Processing multiple PDF pages after prior PDF-to-image conversion
Private Shared Function ProcessMultiPagePdf(imagePaths As String()) As String
Dim results As New StringBuilder()
Using engine As New TesseractEngine("./tessdata", "eng", EngineMode.Default)
For Each imagePath In imagePaths
Using img = Pix.LoadFromFile(imagePath)
Using page = engine.Process(img)
results.AppendLine($"Page confidence: {page.GetMeanConfidence():F2}")
results.AppendLine(page.GetText())
results.AppendLine("---")
End Using
End Using
Next
End Using
Return results.ToString()
End Function
每個 PDF 頁面必須單獨轉換為圖像,才能由此程式碼處理。 對於該轉換的編排邏輯(以正確的 DPI 渲染頁面、寫入臨時文件和清理它們)位於該功能之外,並需要一個單獨的程式庫。 這個多步驟管道引入了額外的故障點,並且顯著增加了程式碼庫的大小,對於概念上看來相對簡單的操作來說。
您期望從基本的 Tesseract 處理中獲得什麼結果?

page.GetMeanConfidence() 返回的信心分數有助於驗證提取質量,但需要手動解釋和自定義閾值邏輯。 掃描文件存在背景噪音、傾斜或低解析度時,在進行 OCR 之前需要預處理以達到可接受的準確性。 由於 Tesseract 工作在圖像上而不是直接處理 PDFs,中間的圖像轉換步驟的質量決定了最終 OCR 準確的很大一部分,這意味著轉換管道中的錯誤會顯示為難以定位的 OCR 準確性問題。
IronOCR 如何直接在 C# 中處理 PDFs?
IronOCR 提供原生 PDF 支援,消除需要將掃描文件轉換為中間圖像格式的需求。 此程式庫內部處理 PDF 渲染,簡化了 .NET 10 應用程式的工作流程。 該整合方法對於企業文件處理特別有價值,因為性能和可靠性是關鍵要求。
using IronOcr;
// Initialize the OCR engine (built on optimized Tesseract 5)
var ocr = new IronTesseract();
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;
ocr.Configuration.ReadBarCodes = true; // Detect barcodes and QR codes alongside text
// Load PDF directly - no image conversion required
using var input = new OcrInput();
input.LoadPdf("scanned-document.pdf", Password: "optional-password");
// Apply preprocessing for low-quality scans
input.DeNoise(); // Remove background noise from scanned paper
input.Deskew(); // Correct rotation from camera angle
input.EnhanceResolution(300); // Ensure adequate DPI for accurate recognition
// Extract text from all pages
OcrResult result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Console.WriteLine($"Pages: {result.Pages.Count()}");
Console.WriteLine(result.Text);
// Export results as a searchable PDF
result.SaveAsSearchablePdf("searchable-output.pdf");
using IronOcr;
// Initialize the OCR engine (built on optimized Tesseract 5)
var ocr = new IronTesseract();
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;
ocr.Configuration.ReadBarCodes = true; // Detect barcodes and QR codes alongside text
// Load PDF directly - no image conversion required
using var input = new OcrInput();
input.LoadPdf("scanned-document.pdf", Password: "optional-password");
// Apply preprocessing for low-quality scans
input.DeNoise(); // Remove background noise from scanned paper
input.Deskew(); // Correct rotation from camera angle
input.EnhanceResolution(300); // Ensure adequate DPI for accurate recognition
// Extract text from all pages
OcrResult result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Console.WriteLine($"Pages: {result.Pages.Count()}");
Console.WriteLine(result.Text);
// Export results as a searchable PDF
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr
' Initialize the OCR engine (built on optimized Tesseract 5)
Dim ocr As New IronTesseract()
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto
ocr.Configuration.ReadBarCodes = True ' Detect barcodes and QR codes alongside text
' Load PDF directly - no image conversion required
Using input As New OcrInput()
input.LoadPdf("scanned-document.pdf", Password:="optional-password")
' Apply preprocessing for low-quality scans
input.DeNoise() ' Remove background noise from scanned paper
input.Deskew() ' Correct rotation from camera angle
input.EnhanceResolution(300) ' Ensure adequate DPI for accurate recognition
' Extract text from all pages
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine($"Confidence: {result.Confidence}%")
Console.WriteLine($"Pages: {result.Pages.Count()}")
Console.WriteLine(result.Text)
' Export results as a searchable PDF
result.SaveAsSearchablePdf("searchable-output.pdf")
End Using
IronTesseract 類包裝了專門針對 .NET Core 和 .NET Framework 環境構建的優化 Tesseract 5 引擎。 與標準 .NET 包裝器不同,此實現自動管理記憶體,並包含針對 .NET 應用程式的性能優化。 OcrInput 類可通過 LoadPdf 直接接受PDF 文件,在內部渲染頁面而不需要下載或配置額外的程式庫。
DeNoise() 和 Deskew() 方法應用內建預處理過濾器,顯著提高了在具有噪音、噴濺或旋轉假影的真實掃描文件上的準確性。 OcrResult 物件包含提取的文字,附有信心分數和字元位置,用於後處理驗證。 您也可以使用單一方法調用將結果導出為可搜尋的 PDF,而 Tesseract 無法在沒有額外程式庫的情況下做到這一點。
如果需要更精細的控制,您可以針對特定的頁面或文件區域:
using IronOcr;
using System.Drawing;
var ocr = new IronTesseract();
// Restrict character recognition to digits and currency symbols for financial docs
ocr.Configuration = new TesseractConfiguration
{
WhiteListCharacters = "0123456789.$,",
PageSegmentationMode = TesseractPageSegmentationMode.SingleColumn
};
// Load only the first two pages from a financial report
using var input = new OcrInput();
input.LoadPdfPages("financial-report.pdf", new[] { 0, 1 });
// Target a specific crop region, such as an invoice total field
var cropRegion = new CropRectangle(x: 100, y: 500, width: 400, height: 200);
foreach (var page in input.Pages)
page.AddCropRegion(cropRegion);
OcrResult result = ocr.Read(input);
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}:");
foreach (var paragraph in page.Paragraphs)
Console.WriteLine($" ({paragraph.Confidence}%) {paragraph.Text}");
}
using IronOcr;
using System.Drawing;
var ocr = new IronTesseract();
// Restrict character recognition to digits and currency symbols for financial docs
ocr.Configuration = new TesseractConfiguration
{
WhiteListCharacters = "0123456789.$,",
PageSegmentationMode = TesseractPageSegmentationMode.SingleColumn
};
// Load only the first two pages from a financial report
using var input = new OcrInput();
input.LoadPdfPages("financial-report.pdf", new[] { 0, 1 });
// Target a specific crop region, such as an invoice total field
var cropRegion = new CropRectangle(x: 100, y: 500, width: 400, height: 200);
foreach (var page in input.Pages)
page.AddCropRegion(cropRegion);
OcrResult result = ocr.Read(input);
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}:");
foreach (var paragraph in page.Paragraphs)
Console.WriteLine($" ({paragraph.Confidence}%) {paragraph.Text}");
}
Imports IronOcr
Imports System.Drawing
Dim ocr As New IronTesseract()
' Restrict character recognition to digits and currency symbols for financial docs
ocr.Configuration = New TesseractConfiguration With {
.WhiteListCharacters = "0123456789.$,",
.PageSegmentationMode = TesseractPageSegmentationMode.SingleColumn
}
' Load only the first two pages from a financial report
Using input As New OcrInput()
input.LoadPdfPages("financial-report.pdf", {0, 1})
' Target a specific crop region, such as an invoice total field
Dim cropRegion As New CropRectangle(x:=100, y:=500, width:=400, height:=200)
For Each page In input.Pages
page.AddCropRegion(cropRegion)
Next
Dim result As OcrResult = ocr.Read(input)
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}:")
For Each paragraph In page.Paragraphs
Console.WriteLine($" ({paragraph.Confidence}%) {paragraph.Text}")
Next
Next
End Using
LoadPdfPages 方法接受從零開始的頁面索引,允許在不將每個頁面載入到記憶中的情況下選擇性處理大型文件。 基於區域的提取對於結構化文件如發票和財務報表是必須的,因為只有特定的字段需要提取。 當您的文件包含已知字元集時,字元白名單配置可防止誤報。
IronOCR 可以處理哪些型別的 PDF?
IronOCR 處理掃描文件、原生文字 PDF、混合內容和受密碼保護的文件。 此程式庫自動檢測 PDF 是包含可提取文字還是需要 OCR 處理,在不需額外配置的情況下優化每種情況的性能。 基於流的輸入允許直接從記憶中處理文件而不寫入臨時文件,這特別適合於對文件系統有限制的雲端部署和環境。
IronOCR 如何處理專門的文件型別?
IronOCR 為專門的文件型別提供了專用方法,使用針對每種格式優化的機器學習模型:
using IronOcr;
var ocr = new IronTesseract();
// Extract text from a vehicle license plate
var licensePlateResult = ocr.ReadLicensePlate("car-photo.jpg");
Console.WriteLine($"License Plate: {licensePlateResult.Text}");
// Read passport MRZ fields from a scanned document
var passportResult = ocr.ReadPassport("passport-scan.pdf");
Console.WriteLine($"Number: {passportResult.PassportNumber}");
Console.WriteLine($"Name: {passportResult.GivenNames} {passportResult.Surname}");
// Process MICR cheques for banking workflows
var chequeResult = ocr.ReadMicrCheque("cheque-image.tiff");
Console.WriteLine($"Account: {chequeResult.AccountNumber}");
Console.WriteLine($"Routing: {chequeResult.RoutingNumber}");
using IronOcr;
var ocr = new IronTesseract();
// Extract text from a vehicle license plate
var licensePlateResult = ocr.ReadLicensePlate("car-photo.jpg");
Console.WriteLine($"License Plate: {licensePlateResult.Text}");
// Read passport MRZ fields from a scanned document
var passportResult = ocr.ReadPassport("passport-scan.pdf");
Console.WriteLine($"Number: {passportResult.PassportNumber}");
Console.WriteLine($"Name: {passportResult.GivenNames} {passportResult.Surname}");
// Process MICR cheques for banking workflows
var chequeResult = ocr.ReadMicrCheque("cheque-image.tiff");
Console.WriteLine($"Account: {chequeResult.AccountNumber}");
Console.WriteLine($"Routing: {chequeResult.RoutingNumber}");
Imports IronOcr
Dim ocr As New IronTesseract()
' Extract text from a vehicle license plate
Dim licensePlateResult = ocr.ReadLicensePlate("car-photo.jpg")
Console.WriteLine($"License Plate: {licensePlateResult.Text}")
' Read passport MRZ fields from a scanned document
Dim passportResult = ocr.ReadPassport("passport-scan.pdf")
Console.WriteLine($"Number: {passportResult.PassportNumber}")
Console.WriteLine($"Name: {passportResult.GivenNames} {passportResult.Surname}")
' Process MICR cheques for banking workflows
Dim chequeResult = ocr.ReadMicrCheque("cheque-image.tiff")
Console.WriteLine($"Account: {chequeResult.AccountNumber}")
Console.WriteLine($"Routing: {chequeResult.RoutingNumber}")
這些專門方法使用針對每種文件型別優化的配置和模型,提供的準確性優於手動配置通用引擎。 車牌識別處理各種國際格式。 護照識別自動提取 MRZ 資料。 MICR 支票處理無需手動引擎配置即可處理銀行文件。 要達到這些文件型別的 Tesseract 等效準確性,需要自訂訓練資料和模型調優。
在設置和工作流程中的主要差異是什麼?
為什麼 Tesseract 安裝更為複雜?
Tesseract 需要多個組件來實現 .NET 10 的運行:OCR 引擎的二進制文件、Leptonica 圖像程式庫、Windows 上的 Visual C++ 可再發行組件,以及每種要識別語言的語言資料文件。開發者必須單獨下載 tessdata 文件並配置正確的資料夾路徑才能使程式庫成功初始化。 跨平台部署到 Azure、Docker 容器或 Linux 伺服器通常需要平台特定的配置和依賴故障排除,而這些不容易自動化可靠。
當運行在 Azure Functions 或 AWS Lambda 環境中時,由於運行時有限制的外部二進制文件和記憶分配,它們的依賴複雜性加劇。 不支持 AVX 指令的舊 CPU 會在運行時產生 SEHException 錯誤,這增加了對與應用程式邏輯無關的事件的診斷層。 libgdiplus 依賴在非 Windows 平台上造成了額外挑戰。
IronOCR 如何簡化安裝?
IronOCR 將安裝減少為單一 NuGet 套件,並且無需管理外部二進制文件:
Install-Package IronOcr
對於專門掃描或額外語言支持:
# Advanced scanning algorithms (optional)
Install-Package IronOcr.Extensions.AdvancedScan
# Language packs install as needed
Install-Package IronOcr.Languages.French
Install-Package IronOcr.Languages.Japanese
# Advanced scanning algorithms (optional)
Install-Package IronOcr.Extensions.AdvancedScan
# Language packs install as needed
Install-Package IronOcr.Languages.French
Install-Package IronOcr.Languages.Japanese

所有需要的組件均在套件中。 語言包的安裝與主程式庫一樣簡單,不需要手動管理 tessdata 資料夾。 IronOCR 預設支持 .NET Framework 4.6.2+、.NET Core 和 .NET 5–10,涵蓋 Windows、macOS 和 Linux。
對於生產服務,這是一個完整的異步處理範例,具有進度跟蹤和取消支援:
using IronOcr;
async Task<OcrResult> ProcessPdfAsync(string pdfPath)
{
var ocr = new IronTesseract();
// Report progress to the caller for user feedback in batch workflows
ocr.OcrProgress += (sender, e) =>
Console.WriteLine($"Page {e.PagesComplete}/{e.TotalPages}: {e.ProgressPercent}%");
using var input = new OcrInput();
// Use a lower DPI for very large files to reduce memory pressure
if (new System.IO.FileInfo(pdfPath).Length > 100_000_000)
input.TargetDPI = 150;
input.LoadPdf(pdfPath);
input.DeNoise();
input.Deskew();
// Cancel automatically after 5 minutes to prevent resource exhaustion
using var cts = new System.Threading.CancellationTokenSource(TimeSpan.FromMinutes(5));
return await ocr.ReadAsync(input, cts.Token);
}
using IronOcr;
async Task<OcrResult> ProcessPdfAsync(string pdfPath)
{
var ocr = new IronTesseract();
// Report progress to the caller for user feedback in batch workflows
ocr.OcrProgress += (sender, e) =>
Console.WriteLine($"Page {e.PagesComplete}/{e.TotalPages}: {e.ProgressPercent}%");
using var input = new OcrInput();
// Use a lower DPI for very large files to reduce memory pressure
if (new System.IO.FileInfo(pdfPath).Length > 100_000_000)
input.TargetDPI = 150;
input.LoadPdf(pdfPath);
input.DeNoise();
input.Deskew();
// Cancel automatically after 5 minutes to prevent resource exhaustion
using var cts = new System.Threading.CancellationTokenSource(TimeSpan.FromMinutes(5));
return await ocr.ReadAsync(input, cts.Token);
}
Imports IronOcr
Imports System.IO
Imports System.Threading
Public Async Function ProcessPdfAsync(pdfPath As String) As Task(Of OcrResult)
Dim ocr As New IronTesseract()
' Report progress to the caller for user feedback in batch workflows
AddHandler ocr.OcrProgress, Sub(sender, e)
Console.WriteLine($"Page {e.PagesComplete}/{e.TotalPages}: {e.ProgressPercent}%")
End Sub
Using input As New OcrInput()
' Use a lower DPI for very large files to reduce memory pressure
If New FileInfo(pdfPath).Length > 100_000_000 Then
input.TargetDPI = 150
End If
input.LoadPdf(pdfPath)
input.DeNoise()
input.Deskew()
' Cancel automatically after 5 minutes to prevent resource exhaustion
Using cts As New CancellationTokenSource(TimeSpan.FromMinutes(5))
Return Await ocr.ReadAsync(input, cts.Token)
End Using
End Using
End Function
此模式展示了 IronOCR 的異步處理支持,具有內建進度報告和取消。 CancellationTokenSource 防止處理意外大文件時資源耗盡,而進度事件為需要向終端使用者報告狀態的批處理工作流程提供實時反饋。
Tesseract 和 IronOCR 在授權上有什麼不同?
授權模式是兩個程式庫之間最根本的區別,直接影響總擁有成本和長期維護負擔。
Tesseract 的開源授權實際上意味著什麼?
Tesseract 根據Apache 2.0 授權發佈,允許免費在開源和商業應用中使用而無需支付權利金。 然而,當您考慮到所需的開發者時間來進行初始設置、PDF 到圖像轉換管道開發、跨部署目標的依賴管理,以及隨著環境改變而進行的持續維護時,Tesseract 的成本並不為零。 對於設置開銷可控的僅圖像的 OCR 工作流程來說,Tesseract 代表了一個真正具有成本效益的起點。
IronOCR 的商業授權包括什麼?
IronOCR 需要商業授權來進行生產部署。 授權層級涵蓋個人開發者、小型團隊和企業再分發場景,並提供免版稅選項。 提供免費試用,以便無需信用卡進行評估。 商業授權包括技術支持的存取、定期更新和安全補丁,從而降低應用程式生命週期的持續維護成本。對於在生產 SLA 下處理高量 PDF 文件的團隊來說,許可成本通常會被減少開發者在基礎設施設置和生產事件調查上花費的時間所抵銷。
您應該為 .NET 應用選擇哪個 OCR 程式庫?
在您的專案的輸入格式、部署目標和團隊資源之間決定 Tesseract 和 IronOCR。
選擇 Tesseract 當:
- 預算限制要求完全免費的開源解決方案
- 你的輸入只由圖像文件組成,而非 PDF 文件
- 您的團隊有 C++ 互操作性經驗和管理依賴的能力
- 需要自定義的 OCR 引擎訓練或專業詞典支持
- 專案時間表允許額外的設置和故障排除工作
選擇 IronOCR 當:
- PDF 文件和掃描文件是主要的輸入格式
- 開發速度和最少的樣板程式碼優先
- 需要跨平台部署到雲環境、Docker 或 Linux
- 內建的預處理過濾器可以提高真實掃描的準確性
- 商業支持和定期更新提供了生產價值
- 需要受密碼保護的 PDFs或多語言文件
- 您需要從掃描文件生成可搜索的 PDF 輸出
兩個程式庫都使用 Tesseract 的 OCR 引擎作為其識別核心。 IronOCR 通過原生 .NET 整合、自動記憶管理、內建預處理和直接 PDF 支持來擴展它,解決了在生產 .NET 應用程式中構建 OCR 管道時出現的常見痛點。 在大規模上,架構上的區別最明顯:基於 Tesseract 的管道需要管理多個程式庫的依賴堆疊,而 IronOCR 的管道則只需一個 NuGet 套件。
我下一步該怎麼做?
開始免費的 IronOCR 試用,使用您自己的文件來評估 PDF 文字提取。 對於特定場景的深入覆蓋,請探索PDF 輸入指南、圖像預處理過濾器和可搜尋 PDF 導出文件。 審核IronOCR 的授權選項以進行生產部署規劃。
常見問題
Tesseract OCR 可以直接在 C# 中讀取 PDF 文件嗎?
不可以。Tesseract不支持原生PDF輸入。開發者必須使用其他程式庫將每頁PDF轉換為例如PNG或JPEG格式的圖像,然後再傳遞給Tesseract引擎。
IronOCR如何在.NET中處理PDF文件?
IronOCR通過OcrInput上的LoadPdf方法直接接受PDF文件。該程式庫在內部渲染頁面,無需進行單獨的PDF到圖像轉換步驟。也支持密碼保護的PDF。
為什麼開發者選擇IronOCR而非Tesseract用於.NET應用程式?
IronOCR消除了Tesseract所需的PDF到圖像轉換流程,它作為單個NuGet包安裝,沒有外部依賴性,並包含內建預處理過濾器。這些差異減少了生產.NET應用程式的程式碼複雜性和設置時間。
IronOCR 為掃描文件提供了哪些預處理選項?
IronOCR 提供內建方法,包括 DeNoise() 以去除背景噪音,Deskew() 以校正旋轉偽影,以及 EnhanceResolution() 以在識別前提高DPI。這些過濾器直接應用於 OcrInput,無需外部圖像處理程式庫。
IronOCR 可以處理 PDF 的特定頁面或區域嗎?
可以。使用帶有零基頁面索引的LoadPdfPages以僅處理選擇的頁面。對於特定文件區域如發票欄位或標題區塊,使用CropRectangle與AddCropRegion在個別頁面上進行目標處理。
IronOCR 是免費使用的嗎?
IronOCR需要商業授權以進行生產部署。提供免費試用以便評估。Tesseract在Apache 2.0許可下免費,但設置、PDF轉換流程及持續的依賴性維護需要開發者時間。
IronOCR 支持可搜尋的PDF輸出嗎?
是的。運行OCR後,調用OcrResult物件上的result.SaveAsSearchablePdf()將識別的文字嵌入可搜尋的PDF中。Tesseract需要額外的程式庫才能獲得相同的輸出。
IronOCR 可以識別什麼專業文件型別?
IronOCR 提供專用方法來讀取車牌(ReadLicensePlate)、護照MRZ欄位(ReadPassport)和MICR銀行支票(ReadMicrCheque)。這些方法使用針對每種文件型別優化的模型。
IronOCR 能在 Linux、macOS 和 Docker 上運行嗎?
是的。IronOCR 預設支持 Windows、macOS 和 Linux,並可在 Azure、Docker 和 AWS 上部署,無需 Tesseract 在非 Windows 環境中所需的平台特定依賴性配置。
IronOCR 與.NET 10 相容嗎?
是的。IronOCR 支持.NET 10、.NET 9、.NET 8、.NET Framework 4.6.2 和更早版本。使用 IronOCR 在 .NET 10 應用程式中無需特殊配置。

