如何在 C# 中對 PDF 進行 OCR 識別:使用 .NET 從掃描文件中提取文本
掃描的 PDF 文件為 .NET 開發人員帶來了一個持續的挑戰:文字僅以圖像形式存在,因此無法進行搜尋、複製或以程式處理。 光學字元辨識 (OCR) 透過將掃描影像轉換為可編輯和可搜尋的資料來解決這個問題——將紙本文件、相機拍攝的影像或任何基於影像的 PDF 檔案轉換為機器可讀的文字。 無論是數位化紙本檔案、自動化資料擷取,或是建立文件處理流程,在 C# 中對 PDF 文件執行 OCR 的能力都是一項至關重要的能力。
IronOCR是一個基於 Tesseract 5 引擎建構的 .NET OCR 函式庫,並具有額外的精度增強功能。 它允許開發人員使用少量程式碼從任何 PDF 文件(掃描或其他方式)中提取文字。 本文將介紹核心工作流程:基本 PDF OCR、頁面選擇性處理、區域目標擷取以及針對複雜掃描的影像預處理。
如何在 C# 中對 PDF 檔案進行 OCR 識別?
在 .NET 中,提取 PDF 文字的最快方法是透過 NuGet 安裝 IronOCR 。 在專案目錄下開啟終端並運行:
dotnet add package IronOcr
dotnet add package IronOcr
安裝軟體包後,以下頂級語句程式會讀取掃描的 PDF 檔案並列印其提取的文字:
using IronOcr;
// Initialize the OCR engine
var ocr = new IronTesseract();
// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");
// Run recognition
OcrResult result = ocr.Read(input);
// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
using IronOcr;
// Initialize the OCR engine
var ocr = new IronTesseract();
// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");
// Run recognition
OcrResult result = ocr.Read(input);
// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
Imports IronOcr
' Initialize the OCR engine
Dim ocr As New IronTesseract()
' Load the PDF and perform OCR
Using input As New OcrInput()
input.LoadPdf("scanned-report.pdf")
' Run recognition
Dim result As OcrResult = ocr.Read(input)
' Access the extracted text
Dim text As String = result.Text
Console.WriteLine(text)
End Using
IronTesseract 類別封裝了 Tesseract 5,並針對 .NET Core 和 .NET Framework 目標進行了 .NET 原生最佳化。 OcrInput 物件管理 PDF 載入和內部頁面渲染。 當呼叫 Read 時,OCR 過程會分析每一頁,並返回一個 OcrResult,其中包含完整的提取文本,以及有關段落、行、單字及其像素座標的結構化資料。
結果可以寫入文字檔案、傳遞給下游處理邏輯、儲存在資料庫中,或輸入到文件索引管道中。有關底層引擎的更多信息,請參閱Tesseract OCR 文件和IronOCR API 參考文件。
輸入

輸出

如何讀取PDF文件中的特定頁面?
如果只有某些頁麵包含相關內容,處理長文件的每一頁都會浪費時間和記憶體。 IronOCR 可讓您透過將從零開始的頁面索引傳遞給 LoadPdf 來定位特定頁面:
using IronOcr;
using System.Collections.Generic;
var ocr = new IronTesseract();
// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };
using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using System.Collections.Generic;
var ocr = new IronTesseract();
// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };
using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports System.Collections.Generic
Dim ocr As New IronTesseract()
' Specify pages to process (zero-based: 0 = first page)
Dim targetPages As New List(Of Integer) From {0, 2, 4}
Using input As New OcrInput()
input.LoadPdf("lengthy-document.pdf", pageIndices:=targetPages)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
選擇性頁面載入可以減少處理時間和記憶體消耗,這在處理數百頁的歸檔文件時非常重要,因為其中只有少數幾頁包含所需的資料。 從零開始的索引約定與標準的 .NET 集合一致:頁面索引 0 是文件的第一頁。
對於事先不知道相關頁面的文檔,可以考慮先以降低 DPI 的速度快速掃描整個文檔,以確定頁碼,然後再以完整的設定對這些頁面重新掃描。
有關IronOCR 頁面選擇文件中頁面層級控制的詳細資訊。
如何從頁面的特定區域提取資料?
發票處理、表格數位化和結構化文件解析通常需要從指定區域提取文本,而不是掃描整個頁面。 IronOCR 透過 ContentAreas 參數支援區域定向 OCR,該參數接受一個 Rectangle 物件數組,用於指定要分析的每個頁面的哪些部分:
using IronOcr;
using IronSoftware.Drawing;
var ocr = new IronTesseract();
// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
new Rectangle(130, 290, 250, 50) // Invoice number field
};
using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using IronSoftware.Drawing;
var ocr = new IronTesseract();
// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
new Rectangle(130, 290, 250, 50) // Invoice number field
};
using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports IronSoftware.Drawing
Dim ocr As New IronTesseract()
' Define the scan region: X, Y, Width, Height (all in pixels from top-left)
Dim invoiceFields As Rectangle() = {
New Rectangle(130, 290, 250, 50) ' Invoice number field
}
Using input As New OcrInput()
input.LoadPdf("invoice.pdf", contentAreas:=invoiceFields)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Rectangle 建構子接受四個整數參數:X 座標、Y 座標、寬度和高度-所有參數均以像素為單位,從渲染頁面的左上角開始測量。 以小區域而非整個頁面為目標,既可以減少 OCR 時間,又能降低引擎識別周圍噪音或無關文字欄位的可能性。
對於批次發票處理工作流程,將區域提取與遍歷 result.Pages 進行迭代相結合,以從數百個文件的相同欄位位置提取結構化資料。 每個頁面結果都會獨立地顯示其內容區域中識別出的文字。
IronOCR 內容區域範例為多區域場景提供了額外的配置選項。
輸入

輸出

如何提高掃描文件的OCR辨識準確率?
現實世界中掃描的文件經常會出現品質問題:頁面傾斜、解析度低,或是掃描硬體或軟體引入了數位雜訊。 IronOCR包含一組影像預處理過濾器,可在識別引擎運作之前修正這些問題:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);
// Apply image correction filters
input.Deskew(); // Automatically straighten rotated pages
input.DeNoise(); // Remove scanning artifacts and speckles
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);
// Apply image correction filters
input.Deskew(); // Automatically straighten rotated pages
input.DeNoise(); // Remove scanning artifacts and speckles
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Dim ocr = New IronTesseract()
Using input = New OcrInput()
' Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi:=300)
' Apply image correction filters
input.Deskew() ' Automatically straighten rotated pages
input.DeNoise() ' Remove scanning artifacts and speckles
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
dpi 參數控制在識別運行之前渲染 PDF 頁面的解析度。 更高的解析度(200 至 300 DPI)可以提高文字較小或較密集的文件的精確度,但處理過程中會佔用更多記憶體。 Deskew 方法可自動偵測並修正頁面旋轉。 DeNoise 可移除可能幹擾字元辨識步驟的斑點和偽影。
對於需要更徹底的影像校正的文檔,IronOCR 還提供對比度增強、二值化(將頁面轉換為黑白)和縮放調整。 將多個過濾器依序組合使用,可以從原本會產生亂碼輸出的掃描件中恢復可用的文字。 請參閱IronOCR 影像過濾器參考文檔,以了解所有可用的預處理操作的完整清單。
如何處理受密碼保護和多格式的文件?
IronOCR 不僅限於標準 PDF 文件。 此庫可處理文件處理工作流程中經常出現的各種輸入場景。
支援透過在輸入建置過程中傳遞憑證來啟用密碼保護的 PDF 檔案:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf("protected.pdf", password:="secret123")
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
圖片格式—PNG、JPEG、TIFF、BMP、GIF 和多頁 TIFF—透過對應的 LoadImage 或 LoadImageFrames 方法載入。 無論輸入格式如何,都適用相同的預處理過濾器和區域定位選項。
多語言文件透過 IronOCR 的語言包系統進行處理。 該庫預設包含英文,並支援超過 125 種其他語言包,涵蓋拉丁文、西里爾文、中日韓文、阿拉伯文和其他文字。請在呼叫 Read 之前載入其他語言:
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.German
對於同一頁上混合多種語言的文檔,可以使用 MultiLanguage 模式。 這對於國際環境下的發票處理尤其有價值,因為發票的抬頭、明細項目和地址可能會以不同的語言出現。
部署可在 Windows、Linux、macOS 和雲端環境(包括 Azure 和 Docker 容器)中進行。
如何從掃描文件建立可搜尋的PDF?
除了將文字提取為字串之外,IronOCR 還可以產生可搜尋的 PDF 輸出——在 PDF 中,原始掃描圖像作為視覺層保留,同時嵌入一個不可見的文本層以進行搜尋和複製操作。 這是專業文件掃描器產生的標準格式。
IronOCR 可搜尋 PDF 功能接受 OcrResult 並寫入一個新的 PDF 檔案:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");
OcrResult result = ocr.Read(input);
// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");
OcrResult result = ocr.Read(input);
// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf("scanned-archive.pdf")
Dim result As OcrResult = ocr.Read(input)
' Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf")
End Using
輸出檔案可以使用任何PDF閱讀器開啟。 文字選擇、搜尋和複製操作在嵌入的文字圖層上進行,同時保留原始掃描外觀。 這種格式通常是合規性檔案、法律文件庫和企業內容管理系統所必需的。
對於其他輸出格式,OcrResult 物件也公開了每頁置信度分數、單字級邊界框和結構化段落資料——所有這些都對下游分類或索引任務很有用。
如何同時讀取條碼、二維碼和文字?
文件處理流程通常需要從同一文件中提取人類可讀的文字和機器可讀的程式碼。 IronOCR 可以在一次 OCR 過程中偵測和解碼條碼和二維碼,而無需單獨的函式庫。
在處理之前,請先在 IronTesseract 實例上啟用條碼讀取功能:
using IronOcr;
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;
using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");
OcrResult result = ocr.Read(input);
// Access recognized text
Console.WriteLine(result.Text);
// Access barcode data
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
using IronOcr;
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;
using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");
OcrResult result = ocr.Read(input);
// Access recognized text
Console.WriteLine(result.Text);
// Access barcode data
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
Imports IronOcr
Dim ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True
Using input As New OcrInput()
input.LoadPdf("shipment-labels.pdf")
Dim result As OcrResult = ocr.Read(input)
' Access recognized text
Console.WriteLine(result.Text)
' Access barcode data
For Each barcode In result.Barcodes
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}")
Next
End Using
這對於貨運標籤處理、庫存管理以及任何條碼和列印文字同時出現在掃描文件上的工作流程都特別有用。 IronOCR 條碼讀取指南涵蓋支援的格式,包括 Code 128、QR 碼、Data Matrix 和 PDF417。
IronOCR 輸入類型之間有什麼區別?
IronOCR 提供了兩種載入 PDF 檔案的主要方法,每種方法都適用於不同的場景:
| 方法 | 班級 | 最適合 | 注意事項 |
|---|---|---|---|
| 一般性輸入 | OcrInput.LoadPdf() |
大多數用例 | 支援所有預處理過濾器、頁面選擇和內容區域 |
| PDF專用 | OcrPdfInput |
簡單場景 | 便捷包裝;配置選項較少 |
| 影像檔案 | OcrInput.LoadImage() |
PNG、JPEG、TIFF、BMP | 與 PDF 輸入相同的預處理和區域定位方法 |
| Multipage TIFF | OcrInput.LoadImageFrames() |
傳真存檔,掃描器輸出 | 將每一幀作為單獨的頁面進行處理 |
對於大多數生產場景,建議使用 OcrInput.LoadPdf(),因為它公開了完整的預處理和配置 API。 OcrPdfInput 適用於快速原型設計或預設設定足以滿足需求的情況。
下一步計劃是什麼?
以上程式碼範例涵蓋了 IronOCR 在 C# 中用於 PDF OCR 的核心工作流程。 以下是進行下一步操作的簡要清單:
-安裝軟體包:dotnet add package IronOcr 或在 NuGet 上搜尋 IronOcr
-運行基本範例:在建立完整的流程邏輯之前,確認能夠從範例 PDF 中提取文字。
-應用預處理:如果處理的是掃描文檔,請新增 Deskew 和 DeNoise 調用,並使用代表性樣本進行測試。
-探索更多功能:可搜尋的 PDF 輸出、條碼讀取、多語言支援和結構化資料輸出
-查看部署指南:Azure、Docker 和 Linux 部署文章涵蓋了特定於環境的配置。
-試用免費版:在購買許可證之前,先開始免費試用,體驗所有功能。
-取得授權: IronOCR 的授權選項涵蓋從個人開發者到企業部署的各種需求,並允許免版稅再分發。
對於具體使用案例的問題, IronOCR 操作指南庫提供了涵蓋數十種場景的逐步文章。 完整的 API 介面已記錄在IronOCR API 參考文件中。
常見問題解答
在 C# 中實作 PDF OCR 所需的最少程式碼是什麼?
使用 IronOCR,最簡程式碼如下:建立一個 IronTesseract 實例,建立一個 OcrInput 對象,呼叫 input.LoadPdf 並傳入檔案路徑,然後呼叫 ocr.Read(input)。 result.Text 屬性傳回擷取的字串。
如何在.NET專案中安裝IronOCR?
在終端機中執行“dotnet add package IronOcr”,或在 Visual Studio 的 NuGet 套件管理器中搜尋 IronOcr。
IronOCR 能否只處理 PDF 文件中的特定頁面?
是的。傳遞一份清單
如何從掃描的PDF文件的特定區域提取文字?
將 Rectangle 物件陣列傳遞給 LoadPdf 的 contentAreas 參數。每個矩形指定其從頁面左上角開始的 X 座標、Y 座標、寬度和高度(以像素為單位)。
IronOCR 為掃描文件提供哪些預處理過濾器?
IronOCR 提供歪斜校正(校正頁面旋轉)、降噪(去除掃描偽影)、對比度增強、二值化和縮放調整等功能。這些功能可以串聯使用,以提高低品質掃描件的辨識準確率。
IronOCR是否支援受密碼保護的PDF文件?
是的。請將密碼字串傳遞給 LoadPdf 函數的 password 參數。該程式庫會在渲染頁面以進行 OCR 識別之前解密文件。
IronOCR能否產生可搜尋的PDF輸出?
是的。呼叫 `ocr.Read(input)` 後,呼叫 `result.SaveAsSearchablePdf` 並指定輸出檔案路徑。產生的 PDF 檔案會保留原始掃描件作為視覺層,並在其中嵌入一個不可見的文字層,用於搜尋和複製操作。
IronOCR 支援哪些語言?
IronOCR 支援超過 125 種語言包,涵蓋拉丁文、西里爾文、中日韓文、阿拉伯文和其他文字。在呼叫 Read 方法之前,請設定 IronTesseract 實例的 Language 屬性。
IronOCR 能否讀取 PDF 文件中的條碼和二維碼?
是的。在呼叫 Read 方法之前,請將 ocr.Configuration.ReadBarCodes 設為 true。 OcrResult.Barcodes 集合包含所有偵測到的條碼的解碼值和格式類型。
IronOCR 能在 Linux 和 Docker 容器中運作嗎?
是的。 IronOCR 支援部署在 Windows、Linux、macOS 以及包括 Azure 和 Docker 容器在內的雲端環境中。 IronSoftware 文件包含針對不同環境的安裝指南。

