Tesseract OCR 與 IronOCR:使用 C# 擷取 PDF 文本
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 。
如果 PDF 文件和掃描文件是您的主要輸入,開發速度至關重要,或者您需要跨平台部署到 Azure、Docker 或 Linux 而無需進行相依性故障排除,請選擇 IronOCR 。
| 標準 | Tesseract | IronOCR |
|---|---|---|
| 成本 | 免費(Apache 2.0) | 需要商業許可證 |
| PDF 輸入 | 需要影像轉換 | 原生支援 |
| 設定複雜性 | 高(多重依賴) | 單一 NuGet 套件 |
| 跨平台 | 需要配置 | Windows、macOS、Linux |
| 影像預處理 | 手動的 | 內建過濾器 |
| 生產支援 | 僅限社群 | 商業支援 |
這些OCR解決方案在功能上有何不同?
在深入探討實作細節之前,這裡先將掃描 PDF 檔案中的文字辨識的關鍵功能並排比較:
| 特徵 | Tesseract | IronOCR |
|---|---|---|
| 原生 PDF 輸入 | 否(需要影像轉換) | 是的 |
| 安裝 | 多重依賴 | 單一 NuGet 套件 |
| 密碼保護的 PDF | 不支援 | 支援 |
| 影像預處理 | 手冊(外部工具) | 內建過濾器 |
| 語言支援 | 100 種以上語言 | 127+ 種語言 |
| 授權 | 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 渲染庫)來轉換每一頁,這增加了生產流程的複雜性和故障點。
以下是使用 C# 從 PDF 檔案中提取文字的標準 Tesseract 工作流程的簡化範例:
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 wrapper 展示標準的 Tesseract 方法。 engine 初始化需要 tessdata 資料夾的路徑,該資料夾包含語言資料文件,必須從tessdata 儲存庫單獨下載。 img 變數以 Leptonica 的 PIX 格式載入輸入映像,這是一個非託管的 C++ 對象,需要明確釋放以防止記憶體洩漏。 page 結果執行實際的字元辨識操作。
為什麼 Tesseract 需要先進行影像轉換?
PDF 檢視器顯示發票 #1001,總金額為 500 美元,示範掃描 PDF 處理的文件檢視功能。
Tesseract 的架構完全專注於影像處理,而不是文件處理。 這種設計意味著開發人員必須自行管理 PDF 到圖像的轉換流程,這在處理受密碼保護的 PDF 、多頁文件或結合了文字層和柵格化掃描的混合內容 PDF 時,會增加額外的複雜性。 轉換品質直接影響 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 處理能帶來哪些結果?
Visual Studio 偵錯控制台顯示已成功從 .NET 9.0 應用程式中提取 PDF 文本,內容為"發票 #1001"和"總計:$500.00"。
page.GetMeanConfidence() 傳回的置信度分數有助於驗證萃取質量,但需要人工解釋和自訂閾值邏輯。 掃描文件若有背景雜訊、傾斜或解析度低等問題,則在進行 OCR 之前需要進行預處理,以達到可接受的準確度。 由於 Tesseract 直接處理影像而不是 PDF,因此中間影像轉換步驟的品質很大程度上決定了最終 OCR 的準確性,這意味著轉換管道中的錯誤會表現為難以隔離的 OCR 準確性問題。
IronOCR 如何在 C# 中直接處理 PDF 檔案?
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 類別直接接受 PDF 文件,透過 LoadPdf 在內部渲染頁面,無需下載或配置其他庫。
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++ 可再發行元件包,以及每種待識別語言的語言資料檔。開發人員必須單獨下載 Tesseract 資料文件,並配置正確的資料夾路徑,庫才能成功初始化。 跨平台部署到 Azure、Docker 容器或 Linux 伺服器通常需要針對特定平台進行配置和相依性故障排除,而這些很難可靠地實現自動化。
對於 Azure Functions 或 AWS Lambda 部署,依賴關係的複雜性會加劇,因為執行時間環境對外部二進位檔案和記憶體分配施加了嚴格的限制。 不支援 AVX 指令的舊 CPU 在執行時會產生 SEHException 錯誤,從而為與應用程式邏輯無關的事件新增診斷層。 libgdiplus 依賴項在非 Windows 平台上會帶來額外的挑戰。
IronOCR 如何簡化安裝?
IronOCR 將安裝簡化為一個 NuGet 包,無需管理任何外部二進位:
Install-Package IronOcr
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
NuGet 套件管理器控制台顯示 IronOCR 安裝成功,自動相依性解析大約在 20 秒內完成。
所有必需組件都包含在軟體包中。 語言包的安裝與主庫的安裝一樣簡單,無需手動管理 tessdata 資料夾。 IronOCR 預設支援 Windows、macOS 和 Linux 上的 .NET Framework 4.6.2+、.NET Core 和 .NET 5-10。
對於生產服務,這裡提供了一個完整的非同步處理範例,支援進度追蹤和取消操作:
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 需要商業許可證才能在生產環境中部署。 授權等級涵蓋個人開發者、小型團隊和企業再分發場景,並提供免版稅選項。 無需信用卡即可免費試用。 商業許可包含技術支援、定期更新和安全補丁,從而降低應用程式生命週期內的持續維護成本。對於在生產環境中處理大量 PDF 文件的團隊而言,許可成本通常會被開發人員在基礎設施搭建和生產事故調查方面所花費時間的減少所抵消。
.NET 應用程式應該選擇哪種 OCR 函式庫?
Tesseract 和 IronOCR 之間的選擇取決於專案的輸入格式、部署目標和團隊資源。
選擇Tesseract 的情況:
預算限制要求採用完全免費的開源解決方案。
- 您提交的內容僅限於影像文件,不包含 PDF 文件。 您的團隊具備 C++ 互通經驗和依賴管理能力。 需要客製化的OCR引擎培訓或專門的字典支援。 專案時間表允許進行額外的設定和故障排除工作。
選擇IronOCR 的情況:
- PDF 檔案和掃描文件是主要的輸入格式 開發速度和減少樣板程式碼是首要考慮因素。 需要跨平台部署到雲端環境、Docker 或 Linux。
- 內建預處理過濾器可提高實際掃描的精確度 商業支援和定期更新提供生產價值 需要密碼保護的PDF檔案或多語言文件。 您需要從掃描文件產生可搜尋的 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 檔案。
為什麼開發人員在 .NET 應用程式開發中選擇 IronOCR 而不是 Tesseract?
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)、護照磁條碼區域識別(ReadPassport)和磁條碼銀行支票識別(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 及更早版本。在 .NET 10 應用程式中使用 IronOCR 無需任何特殊配置。


